
# Aangepaste functies

Met aangepaste functies kan je AI-bot verbinding maken met andere systemen tijdens live gesprekken. In plaats van te zeggen "Ik zoek het uit en kom er bij je op terug", kan de bot een orderstatus opzoeken, de voorraad controleren of een record aanmaken in je CRM (customer relationship management-systeem - de software die je gebruikt om leads en klanten bij te houden, zoals HubSpot of Salesforce) - allemaal in realtime, terwijl de klant wacht.


---

## Aangepaste functies versus webhooks

Dit is het meest voorkomende punt van verwarring, dus het is de moeite waard om dit duidelijk te hebben voordat je iets bouwt.

| | Webhooks | Aangepaste functies |
|---|----------|------------------|
| **Richting** | Eénrichtingsverkeer (fire-and-forget) | Tweerichtingsverkeer (aanroepen en wachten) |
| **Wat de bot doet** | Verstuurt een melding wanneer er iets gebeurt en gaat daarna door. | Roept aan, **pauzeert, wacht op het antwoord** en gebruikt de ontvangen informatie om het gesprek voort te zetten. |
| **Zichtbaarheid voor het gesprek** | Het resultaat is onzichtbaar voor de bot — hij ziet nooit wat er is gebeurd. | Het antwoord wordt direct teruggekoppeld naar de AI, zodat de bot het kan citeren, erover kan redeneren en de klant ermee kan antwoorden. |
| **Beste voor** | Gebeurtenissen loggen, gegevens synchroniseren met een CRM, externe automatiseringen activeren (Zapier, Make, n8n). | Alles waarbij de bot een **antwoord** nodig heeft voordat hij kan reageren — live opzoekingen, realtime prijzen, on-the-fly contentgeneratie. |

**Wanneer kies je wat:** Als je een ander systeem alleen *hoeft te laten weten* dat er iets is gebeurd, gebruik dan een webhook - een eenrichtingsverkeer-geautomatiseerd bericht dat naar een ander systeem wordt gestuurd (zie **Instellingen → Integraties → Webhooks**). Als de bot iets *moet leren* van een ander systeem voordat het gesprek wordt voortgezet, gebruik dan een aangepaste functie.

---

## Voorbeelden van wat aangepaste functies mogelijk maken

Omdat het antwoord terugvloeit in het gesprek, maken aangepaste functies dingen mogelijk die webhooks simpelweg niet kunnen:

- **Live Shopify- of WooCommerce-voorraadcontrole** — Voordat de bot een prijs aan een klant geeft, controleert hij de voorraad in realtime en antwoordt hij "Ja, we hebben er 12 in maat M" in plaats van "ik zoek het uit en kom bij je terug."
- **Dynamische prijzen vanuit een Google Sheet** — Je verkoopteam werkt prijzen bij in een sheet; de bot leest de nieuwste rij tijdens het gesprek en geeft de huidige prijs door zonder dat iemand de AI-configuratie hoeft aan te passen.
- **Voice-AI callback-agent** — Wanneer de bot een lead kwalificeert, activeert hij een voice-agent (bijvoorbeeld een ElevenLabs-aangedreven beller) om de lead binnen enkele minuten terug te bellen, en bevestigt aan de klant: "geweldig, verwacht binnen 5 minuten een telefoontje."
- **Aangepaste offerte-pdf, gegenereerd en gemaild tijdens de chat** — De bot verzamelt vereisten, roept je offerte-builder aan, krijgt een pdf-URL terug en vertelt de klant: "Ik heb zojuist je offerte gemaild — controleer je inbox."

---

## Wat kunnen aangepaste functies doen?

Zie aangepaste functies als het geven van superkrachten aan je bot die verder gaan dan alleen chatten. Hier zijn praktijkvoorbeelden:

- **Orderstatus** - Een klant vraagt "Waar is mijn bestelling?" en de bot controleert je e-commercesysteem en antwoordt met de verzendstatus en de trackinglink
- **Voorraadcontrole** - "Hebben jullie dit in maat 10?" De bot controleert je voorraadsysteem en geeft een realtime antwoord
- **CRM-updates** - Wanneer de bot een lead kwalificeert, maakt of werkt hij automatisch een record bij in HubSpot, Salesforce of een ander CRM
- **Offertegeneratie** - De bot verzamelt de vereisten van de klant en genereert een gepersonaliseerde offerte vanuit je prijzensysteem
- **Boekingen** - De bot maakt een afspraak in je externe boekingssysteem
- **Kortingsverificatie** - "Is deze kortingscode geldig?" De bot controleert dit en geeft bevestiging
- **Account opzoeken** - Een terugkerende klant wordt automatisch herkend en zijn accountgegevens worden opgehaald

**De klant ziet nooit wat er achter de schermen gebeurt.** Ze ervaren simpelweg een bot die hun vragen kan beantwoorden met echte, actuele informatie.

---

## Hoe aangepaste functies werken (de eenvoudige versie)

Dit is wat er gebeurt wanneer een aangepaste functie wordt geactiveerd tijdens een gesprek:

1. **De klant vraagt iets** waarvoor realtime gegevens nodig zijn (bijv. "Waar is mijn bestelling?")
2. **De bot herkent** dat hij een aangepaste functie moet gebruiken om antwoord te geven
3. **De bot verzamelt** ontbrekende informatie van de klant (bijv. "Wat is uw bestelnummer?")
4. **Het platform verstuurt een verzoek** naar uw systeem (uw website, CRM of een andere tool) met de relevante details
5. **Uw systeem reageert** met de gegevens (bijv. bestelstatus, trackingnummer, bezorgdatum)
6. **De bot leest het antwoord** en formuleert een natuurlijk antwoord: "Uw bestelling ORD-4582 is verzonden en zou vrijdag aan moeten komen!"

### Wat een aangepaste functie-aanroep kost

Elke aangepaste functie-aanroep wordt gefactureerd op basis van het AI Quality-niveau van je Agent:

| AI Quality-niveau | Credits per aangepaste functie-aanroep | Met je eigen Anthropic-sleutel (BYOK) gekoppeld |
|---|---|---|
| Pro | 1 credit | 0 credits — draait op jouw sleutel |
| Economy (verouderd) | 0,5 credits | 0 credits — draait op jouw sleutel |
| Max | 0,25 credits | nog steeds 0,25 credits, gefactureerd zelfs met je eigen sleutel gekoppeld, omdat Max op ons eigen model draait |
| Mini | 0,15 credits | nog steeds 0,15 credits, gefactureerd zelfs met je eigen sleutel gekoppeld, omdat Mini op ons eigen model draait |

---

## Een aangepaste functie instellen (Stap voor stap)

1. Klik in de hoofdnavigatiebalk onder **AI Studio** op **Custom Functions**.


2. Klik rechtsboven op de groene knop **+ Add Function** (of **New function**).


De lijst met aangepaste functies toont een tabel met de volgende kolommen:

| Kolom | Wat het laat zien |
|--------|--------------|
| **Naam** | De functienaam (bijv. `check_order_status`) |
| **Beschrijving** | Een korte samenvatting van wat de functie doet (afgekapt tot 50 tekens in de tabel) |
| **Methode** | De gebruikte HTTP-methode, weergegeven als een gekleurde badge: GET (blauw), POST (groen), PUT (oranje), DELETE (rood) |
| **Gemaakt** | De datum waarop de functie is gemaakt |

Dit maakt het gemakkelijk om uw functies in één oogopslag te bekijken en degene te vinden die u nodig hebt.

### Stap 1: Geef het een naam en beschrijving


| Veld | Wat in te vullen | Voorbeeld |
|-------|--------------|---------|
| **Naam** | Een korte naam met letters, cijfers en underscores | `check_order_status` |
| **Beschrijving** | Leg uit wat deze functie doet (de AI leest dit om te beslissen wanneer deze moet worden gebruikt) | "Zoekt de huidige status van de bestelling van een klant op met behulp van hun bestelnummer" |
| **Doel (AI-actie)** | Vertel de AI precies wanneer en hoe deze functie moet worden gebruikt | "Gebruik dit wanneer een klant vraagt naar de status van zijn bestelling, verzending of bezorging. Vraag eerst om het bestelnummer." |

**Tip:** Wees zeer specifiek in de beschrijving en het doel. Hoe duidelijker u bent over wanneer de functie moet worden gebruikt, hoe betrouwbaarder de bot deze op het juiste moment zal inzetten.

### Stap 2: De verbinding instellen

U moet de app vertellen waar het verzoek naartoe moet worden gestuurd:

| Veld | Wat in te vullen | Voorbeeld |
|-------|--------------|---------|
| **URL** | Het webadres van het eindpunt van je systeem (het specifieke adres op je systeem dat het verzoek ontvangt en gegevens terugstuurt) | `https://api.yourstore.com/v1/orders/status` |
| **Methode** | Het type verzoek dat moet worden verzonden | Zie opties hieronder |

**Welke methode te kiezen:**

| Methode | Wanneer te gebruiken |
|--------|---------------|
| **GET** | Informatie opzoeken (bestelstatus, voorraad, accountgegevens) |
| **POST** | Nieuwe records aanmaken (supporttickets, leads, boekingen) of complexe zoekopdrachten |
| **PUT** | Een bestaand record volledig bijwerken |
| **PATCH** | Een deel van een bestaand record bijwerken |
| **DELETE** | Een record verwijderen |

Als je niet zeker weet welke je moet gebruiken, raadpleeg dan je ontwikkelaar of de documentatie van het systeem waarmee je verbinding maakt. **GET** (voor opzoekingen) en **POST** (voor het aanmaken van records) komen het meest voor.

### Stap 3: Authenticatie-headers toevoegen

De meeste systemen vereisen authenticatie om verzoeken te accepteren. Voeg alle vereiste headers toe:

| Header | Voorbeeldwaarde |
|--------|--------------|
| `Authorization` | `Bearer your-api-key-here` |
| `Content-Type` | `application/json` |

**Beveiligingstip:** Gebruik een specifieke API-sleutel met beperkte rechten. Gebruik geen inloggegevens op beheerdersniveau.

**Waar vind je API-sleutels:** Controleer de instellingen of de ontwikkelaarssectie van het systeem waarmee je verbinding maakt (bijv. je CRM, e-commerceplatform of boekingstool).

### Stap 4: De invoer definiëren (Wat de bot verzendt)

Invoerparameters zijn de stukjes informatie die de bot verzamelt uit het gesprek en naar je systeem verzendt.

Voor elke parameter specificeer je:

| Eigenschap | Wat het betekent |
|----------|--------------|
| **Naam** | De parameternaam (moet overeenkomen met wat je systeem verwacht) |
| **Type** | Wat voor soort gegevens het is (tekst, getal, waar/onwaar, enz.) |
| **Beschrijving** | Vertel de AI wat deze informatie is en waar deze in het gesprek te vinden is |
| **Vereist** | Indien ingesteld op Ja, zal de bot de klant om deze informatie vragen voordat hij verdergaat |

**Beschikbare parametertypes:**

| Type | Wat het betekent |
|------|--------------|
| **string** | Tekst (namen, ordernummers, adressen) |
| **number** | Een numerieke waarde (aantal, prijs) |
| **boolean** | Waar of onwaar (ja/nee-waarden) |
| **array** | Een lijst met items. Wordt verzonden als een echte JSON-lijst — in **Run Test** kun je deze typen als `[8624]`, `["a", "b"]` of simpelweg door komma's gescheiden (`8624, 8625`) en het wordt voor je geconverteerd. Als je API strikt is over wat de lijst bevat — bijv. alleen getallen — stel dan het optionele **Item type** in naast het type en elke waarde in de lijst wordt ernaar geconverteerd. |
| **query_param** | Tekst die als URL-parameter wordt verzonden in plaats van in de request body. Gebruik dit wanneer je API gegevens in de URL verwacht (bijv. `?order_id=123`). |

Elke parameter heeft ook een optioneel veld **Request body path**. Normaal gesproken wordt een parameter verzonden als een veld op het hoogste niveau in de request body (of als een query string-waarde, voor het `query_param` type). Als je endpoint verwacht dat deze genest is — bijv. `{"order": {"id": "ORD-123"}}` — stel het pad dan in op `order.id` en het platform nest de waarde daar voor je.


**Voorbeeld: Voor het opzoeken van een orderstatus zou je het volgende kunnen definiëren:**

- **order_number** (string, vereist): "Het ordernummer van de klant. Begint meestal met ORD- gevolgd door cijfers. Vraag de klant hierom als ze dit nog niet hebben genoemd."
- **email** (string, optioneel): "Het e-mailadres van de klant voor extra verificatie. Alleen nodig als het ordernummer alleen geen match vindt."

### Wat je systeem automatisch ontvangt

Naast de invoerparameters die u definieert, voegt het platform automatisch systeemgegevens toe aan elk verzoek. Uw eindpunt ontvangt dit in een `system` veld:

| Systeemveld | Wat het bevat |
|-------------|----------------|
| `system.contactId` | Het platform-ID van de contactpersoon in het gesprek |
| `system.campaignId` | Het campagne-ID waartoe het gesprek behoort |
| `system.userId` | Jouw gebruikers-ID |
| `system.channel` | Het berichtkanaal (bijv. `"whatsapp"`, `"instagram"`) |
| `system.contact` | Het volledige contactrecord (naam, telefoonnummer, e-mailadres, tags, enz.) |
| `system.campaign` | De campagneconfiguratie |
| `system.test` | `true` als dit een Try Out-test is, `false` voor live gesprekken |

Dit is handig als uw systeem de contactpersoon moet identificeren, moet controleren welke campagne de functie heeft geactiveerd, of zich anders moet gedragen tijdens het testen.

> **Geen behoefte aan systeemgegevens?** Schakel de **Systeemgegevens overslaan**-schakelaar in de functiebouwer in. De bot verstuurt dan alleen de invoerparameters die u hebt gedefinieerd — geen contact- of campagnegegevens. Gebruik dit als uw eindpunt onverwachte velden weigert of als u simpelweg een lichtere payload wilt.

### Stap 5: Test het, en laat de bot vervolgens het antwoord lezen

Normaal gesproken hoef je response-velden helemaal niet te mappen. Zodra je endpoint reageert, leest de bot de volledige JSON-respons en gebruikt de **Beschrijving** en het **Doel (AI-actie)** van je functie — plus de eigen beschrijving van elke parameter — om te bepalen wat belangrijk is en dit op een natuurlijke manier te presenteren. Een duidelijke beschrijving van de functie zelf ("Haalt de huidige status van een klantbestelling op, inclusief verzendinformatie en tracking") doet hier meer werk dan een veld-voor-veld mapping zou doen.

Als je endpoint een grote respons teruggeeft en je wilt dat de bot slechts een paar specifieke waarden ziet, open dan de sectie **Response mapping** (standaard ingeklapt, net boven Test). Elke rij kiest één veld op het hoogste niveau uit de respons: **Response field** is de veldnaam in het JSON-antwoord van je API, en **Output field** is de naam waaronder de bot deze ontvangt. Met ten minste één ingevulde rij krijgt de bot alleen je gemapte waarden in plaats van de volledige response body. Laat de sectie leeg om het standaardgedrag van de volledige respons te behouden.


Voordat u opslaat, gebruikt u de sectie **Test** onderaan de builder om de aanvraag precies zoals geconfigureerd te versturen en het werkelijke antwoord te zien, zonder de app te verlaten:


Het antwoord dat u hier ziet, is het onbewerkte antwoord van het eindpunt. Als u hierboven **Antwoordtoewijzing** heeft ingesteld, ontvangt de bot in een echte chat alleen die toegewezen velden — de test toont altijd het volledige onbewerkte antwoord, zodat u kunt zien wat er beschikbaar is om toe te wijzen. Als er iets niet klopt (onverwachte veldnamen, extra nesten), corrigeer dit dan op uw eindpunt of pas uw toewijzing aan.

---

## Functies toewijzen aan een Agent

Nadat je een aangepaste functie hebt gemaakt, moet je elke Agent vertellen welke functies deze mag gebruiken:

1. Open de [Agent](../ai-agents/ai-agents.md) onder **AI Studio → AI Agents**.
2. Ga naar het tabblad **AI-mogelijkheden**. (Voor een campagne die nog steeds zijn eigen AI-instellingen direct bevat in plaats van via een afzonderlijke Agent, verschijnt dezelfde lijst in plaats daarvan bij de stap **AI-mogelijkheden** van die campagne zelf.)
3. U ziet een lijst van elke aangepaste functie die u heeft gemaakt. Schakel elke functie in die de bot van deze Agent moet kunnen aanroepen.
4. Klik onderaan op **Wijzigingen opslaan**. Selecties zijn pas van kracht nadat ze zijn opgeslagen.


Alleen toegewezen functies zijn beschikbaar voor de bot van die Agent. Dit voorkomt dat de bot per ongeluk functies gebruikt die niet relevant zijn.

---

## Uw aangepaste functies testen

Test grondig voordat u live gaat:

1. **Voer de ingebouwde test uit** - Gebruik de sectie **Test** in de functie-builder (zie hierboven) voor een snelle controle zonder de app te verlaten — vul realistische waarden in en klik op Test uitvoeren.
2. **Test het eindpunt van uw systeem direct** - Voor de volledige checklist hieronder graaft een speciale tool zoals Postman (of uw ontwikkelaar) dieper dan een enkele Test uitvoeren.
3. **Test in Uitproberen** - Simuleer een gesprek waarin de klant iets vraagt dat de functie zou moeten activeren.
4. **Controleer het antwoord** - Zorg ervoor dat de bot de gegevens correct leest en presenteert.
5. **Test foutscenario's** - Wat gebeurt er als de klant een ongeldig bestelnummer opgeeft? Wat als uw systeem tijdelijk offline is?

### Wanneer de test een 401 of 403 teruggeeft

Een 401 of 403 betekent dat je endpoint het verzoek heeft ontvangen en geweigerd. Het weggevertje is dat er **niets in je eigen logs verschijnt** — de meeste tools wijzen een ongeautoriseerde aanroep af voordat ze überhaupt aan de workflow beginnen, dus er is aan jouw kant niets te zien en het lijkt alsof het verzoek nooit is aangekomen.

Bijna altijd is dit een authenticatiefout: je endpoint wil een bepaald type inloggegevens en de functie stuurt een andere. Controleer of de header die je in [Stap 3](#step-3-add-authentication-headers) hebt toegevoegd exact degene is die je systeem verwacht.

De meest voorkomende versie hiervan is een webhook die beveiligd is met **Basic Auth** (n8n, Make en de meeste self-hosted tools bieden dit aan als een selectievakje op de webhook zelf), terwijl de functie een aangepaste geheime header zoals `X-My-Secret` verstuurt. Basic Auth accepteert alleen een `Authorization` header, dus een aangepaste header wordt genegeerd en de aanroep wordt geweigerd. Je hebt twee opties:

- **Schakel Basic Auth uit** op de webhook en controleer je aangepaste header in plaats daarvan binnen de workflow.
- **Laat Basic Auth aanstaan** en voeg een `Authorization` header toe aan de functie waarvan de waarde het woord `Basic` is, gevolgd door je base64-gecodeerde `username:password`.

Beide werken — zorg er alleen voor dat beide kanten op elkaar zijn afgestemd.

### Wanneer de test een 404 teruggeeft

De endpoint-URL is onjuist of de workflow is niet gepubliceerd. Specifiek in n8n heeft elke webhook een aparte **Test**-URL en **Productie**-URL, en de Test-URL luistert alleen terwijl je de editor open hebt staan. Kopieer de Productie-URL en zorg ervoor dat de workflow actief is.

### Fouten zien in Try Out en Chats

Wanneer de AI een aangepaste functie aanroept tijdens een gesprek en de aanroep mislukt — verkeerde inloggegevens, eindpunt niet bereikbaar, time-out — toont het gesprek dit nu: een rode **"(functienaam) mislukt"**-markering verschijnt in de thread, zowel in het **Try Out**-tabblad van de agent als in echte gesprekken in **Chats**. Klik op de markering om de details uit te vouwen: de statuscode die uw eindpunt heeft geretourneerd en de bijbehorende antwoordtekst. Dit is meestal voldoende om precies te weten wat u moet corrigeren (een `401` met een "unauthorized"-bericht betekent dat de authenticatie-header niet klopt, een time-out betekent dat uw eindpunt er langer dan 30 seconden over deed).

Succesvolle aanroepen tonen ook een markering — klik erop om te zien wat uw eindpunt daadwerkelijk heeft teruggestuurd. Dit is de snelste manier om een integratie van begin tot eind te debuggen: voer het testgesprek in Try Out en klik vervolgens op de functiemarkering om het werkelijke resultaat van het verzoek te zien zonder de pagina te verlaten.

---

## Volledig voorbeeld: Bestelstatus opzoeken

Hier is een volledig geconfigureerd voorbeeld dat je als sjabloon kunt gebruiken:

**Basisinformatie:**
- **Naam:** `check_order_status`
- **Beschrijving:** "Haalt de huidige status van een klantbestelling op, inclusief verzendinformatie en tracking"
- **AI-actie:** "Roep dit aan wanneer een klant vraagt naar de status van hun bestelling, waar hun pakket is of wanneer het aankomt. Vraag altijd eerst om het bestelnummer."

**Verbinding:**
- **URL:** `https://api.mystore.com/orders/lookup`
- **Methode:** POST

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

**Invoerparameters:**
- `order_number` (tekst, vereist): "Het bestelnummer verstrekt door de klant"
- `customer_email` (tekst, optioneel): "E-mailadres van de klant voor aanvullende verificatie"

**Geen antwoordtoewijzing nodig** — met een duidelijke Beschrijving en AI-actie die hierboven al zijn ingesteld, leest de bot alle JSON die uw eindpunt retourneert (status, trackingnummer, leverdatum, artikelen) en bepaalt zelf hoe hij erover moet praten.

**Hoe het gesprek eruitziet:**

> **Klant:** Hey, waar is mijn bestelling?
>
> **Bot:** Hallo! Ik kijk graag de status van je bestelling voor je na. Zou je je bestelnummer met me willen delen?
>
> **Klant:** Het is ORD-78234
>
> **Bot:** Laat me dat even voor je opzoeken...
>
> Je bestelling ORD-78234 is verzonden en is onderweg! De verwachte bezorgdatum is 10 maart. Je kunt je pakket hier volgen: https://tracking.example.com/1Z999AA1
>
> Kan ik je nog ergens anders mee helpen?

---

## Volledig voorbeeld: Shopify-bestelstatus

Als de winkel op Shopify draait, hoef je geen ontwikkelaar in te schakelen om een opzoek-endpoint te bouwen — het eigen systeem van Shopify kan vragen over bestellingen direct beantwoorden. (Voor vragen over producten en voorraad in een Shopify-winkel heb je helemaal geen aangepaste functie nodig: verbind in plaats daarvan de ingebouwde server van de winkel — zie [Een Shopify-winkel verbinden](mcp-servers.md#ready-made-example-connect-a-shopify-store).)

**Maak eerst een toegangstoken aan in Shopify.** Shopify heeft dit in 2026 gewijzigd: apps kunnen niet langer worden aangemaakt in de Shopify-beheeromgeving, en het nieuwe app-scherm geeft je een **Client ID** en **Client secret** in plaats van een kant-en-klaar token. De onderstaande stappen zetten deze om in een permanent token. Trek hier ongeveer tien minuten voor uit, eenmalig per winkel. (Als de winkel al een oudere app heeft die op de oude manier is aangemaakt, blijft het bestaande token gewoon werken — ga direct door naar de aangepaste functie hieronder.)

1. Ga naar het Shopify Dev Dashboard op [dev.shopify.com](https://dev.shopify.com), open je organisatie en klik op **Apps → Create app**. Geef het een naam zoals `Order lookup`.
2. Geef de app de **read_orders**-toestemming, breng een versie uit en installeer de app in de winkel.
3. Open de **Instellingen** van de app en voeg het eigen webadres van de winkel (bijvoorbeeld `https://www.yourstore.com/`) toe aan de toegestane omleidings-URL's. Sla op.
4. Kopieer nog steeds in **Instellingen** de **Client ID** en de **Client secret**.
5. Open in een browser waarin je bent aangemeld bij de Shopify-beheeromgeving van die winkel het onderstaande adres, waarbij je de winkelnaam, de client-ID en het omleidingsadres vervangt door je eigen gegevens:
   `https://YOUR-STORE.myshopify.com/admin/oauth/authorize?client_id=YOUR-CLIENT-ID&scope=read_orders&redirect_uri=https://www.yourstore.com/&state=12345`
   Keur het scherm goed dat verschijnt. De browser komt uit op je omleidingsadres en de adresbalk bevat nu `code=` gevolgd door een lange waarde — kopieer die waarde. Deze is slechts enkele minuten geldig, dus ga direct door naar de volgende stap.
6. Wissel die code in voor het token, wat je kunt doen in <span data-t="appName">Your AI Connector</span>. Stel in de bouwer voor aangepaste functies **Methode** in op POST en **URL** op `https://YOUR-STORE.myshopify.com/admin/oauth/access_token`, voeg drie tekstinvoerparameters toe genaamd `client_id`, `client_secret` en `code`, klik vervolgens op **Test**, vul de drie waarden in en voer het uit. De respons bevat `access_token` — dat is je permanente token. Kopieer dit naar een veilige plek, wis vervolgens de bouwer en stel de echte functie hieronder in.

**Stel vervolgens de aangepaste functie in:**

**Basisinformatie:**
- **Naam:** `check_shopify_order`
- **Beschrijving:** "Zoekt een bestelling op in het Shopify-systeem van de winkel en retourneert de status, tracking en artikelen"
- **AI-actie:** "Roep dit aan wanneer een klant vraagt naar de status of bezorging van hun bestelling. Vraag altijd eerst om het bestelnummer."

**Verbinding:**
- **URL:** `https://YOUR-STORE.myshopify.com/admin/api/2026-01/orders.json?status=any` — vervang `YOUR-STORE` door de `.myshopify.com`-naam van de winkel (dit adres gebruikt het technische Shopify-domein, niet het aangepaste domein van de winkel)
- **Methode:** GET

**Headers:**
- `X-Shopify-Access-Token`: `shpat_...` (het token van hierboven)

**Invoerparameters:**
- `name` (query_param, vereist): "Het bestelnummer van de klant precies zoals het in hun bestelbevestiging staat, inclusief het #-teken — bijvoorbeeld #1001. Vraag de klant erom als ze het nog niet hebben genoemd."

**Geen respons-mapping nodig** — de bot leest de geretourneerde bestelling (betalingsstatus, afhandelingsstatus, tracking, artikelen) en geeft op natuurlijke wijze antwoord.

**Goed om te weten:** een token dat op deze manier is aangemaakt, kan bestellingen van de **afgelopen 60 dagen** inzien — ruim voldoende voor dagelijkse ondersteuningsvragen, maar geen volledige bestelgeschiedenis.

---

## Volledig voorbeeld: Een afspraak boeken

**Basisinformatie:**
- **Naam:** `create_booking`
- **Beschrijving:** "Maakt een nieuwe afspraak in ons boekingssysteem"
- **AI-actie:** "Gebruik dit nadat de datum, tijd en contactgegevens met de klant zijn bevestigd. Roep dit niet aan totdat de klant expliciet bevestigt dat ze willen boeken."

**Verbinding:**
- **URL:** `https://booking.mycompany.com/api/appointments`
- **Methode:** POST

**Invoerparameters:**
- `date` (tekst, vereist): "Afspraakdatum in YYYY-MM-DD formaat"
- `time` (tekst, vereist): "Afspraaktijd in HH:MM formaat"
- `name` (tekst, vereist): "Volledige naam van de klant"
- `phone` (tekst, vereist): "Telefoonnummer van de klant"
- `service_type` (tekst, vereist): "Het type dienst dat wordt geboekt"

---

## Volledig voorbeeld: Een nieuwsbriefabonnee toevoegen aan je CRM

Een veelvoorkomend patroon: de bot is klaar met antwoorden, biedt je nieuwsbrief aan, de contactpersoon antwoordt met hun e-mailadres, en dat adres moet direct in je e-mailtool terechtkomen. De meeste CRM's (FluentCRM, ActiveCampaign, MailerLite, Brevo en andere) accepteren hiervoor een eenvoudige POST, dus er is geen automatiseringsplatform tussen nodig.

Dit voorbeeld gebruikt **FluentCRM** op WordPress. De structuur is hetzelfde voor elke andere tool die je een "inkomende webhook" of een "abonnee aanmaken"-eindpunt geeft.

**Haal eerst de URL op uit je CRM.** Open in WordPress **FluentCRM → Instellingen → Inkomende Webhooks** en maak een webhook aan. Kies de lijst, tags en abonnementsstatus die nieuwe contacten moeten krijgen en kopieer vervolgens de gegenereerde webhook-URL. Alles wat je hier instelt, wordt automatisch toegepast, dus de bot hoeft alleen het e-mailadres te sturen.

**Stel vervolgens de aangepaste functie in:**

**Basisgegevens:**
- **Naam:** `add_newsletter_subscriber`
- **Beschrijving:** "Voegt iemand toe aan onze nieuwsbrieflijst met het e-mailadres dat ze in de chat hebben opgegeven"
- **AI-actie:** "Gebruik dit op het moment dat de contactpersoon akkoord gaat met inschrijving voor de nieuwsbrief en hun e-mailadres geeft. Roep het niet aan voordat ze daadwerkelijk een adres hebben gegeven en roep het niet twee keer aan voor dezelfde persoon."

**Verbinding:**
- **URL:** de webhook-URL die je uit je CRM hebt gekopieerd
- **Methode:** POST

**Invoerparameters:**
- `email` (string, vereist): "Het e-mailadres dat de contactpersoon in het gesprek heeft opgegeven"
- `first_name` (string, optioneel): "De voornaam van de contactpersoon, als ze die hebben genoemd"

**Systeemgegevens overslaan:** zet dit **aan**. Je CRM heeft alleen de bovenstaande velden nodig, en een compactere payload voorkomt fouten bij tools die onverwachte velden weigeren.

**Respons-mapping:** hier niet nodig. Er hoeft niets terug te komen om de bot te laten doorgaan.

**Vergeet niet de functie in te schakelen voor de Agent die het gesprek voert** (zie [Functies toewijzen aan een Agent](#assigning-functions-to-an-agent)). Dit is de meest voorkomende reden waarom een correct gebouwde functie nooit wordt geactiveerd.

::: tip
**Tip:** de bot heeft ook een ingebouwde **Contact-e-mail bijwerken**-tool, die het adres opslaat in het contactrecord binnen het platform. Dat staat los van deze functie en is nuttig in combinatie ermee — de ingebouwde tool houdt je eigen contactrecord compleet, de aangepaste functie pusht het adres naar je CRM.
:::


---

## Tips voor betrouwbare aangepaste functies

1. **Zorg ervoor dat herhaalde verzoeken veilig zijn.** Als hetzelfde verzoek per ongeluk twee keer wordt verzonden, mag dit geen dubbele records aanmaken. Netwerkstoringen kunnen dit soms veroorzaken.

2. **Geef duidelijke foutmeldingen terug.** Als er iets misgaat aan de kant van jouw systeem, geef dan een voor mensen leesbare foutmelding terug. De bot zal deze op een nette manier doorgeven aan de klant.

3. **Houd responstijden onder de 10 seconden.** Als jouw systeem er langer over doet, overweeg dan om eerst een snelle bevestiging terug te sturen.

4. **Ga correct om met verlopen of ongeldige inloggegevens.** Als je API-sleutel verloopt, zorg er dan voor dat de foutmelding duidelijk is, zodat de bot weet dat hij een mens moet waarschuwen in plaats van het opnieuw te proberen.

5. **Schrijf gedetailleerde beschrijvingen.** De AI gebruikt jouw beschrijvingen om te bepalen wanneer de functie moet worden aangeroepen en hoe de juiste informatie uit het gesprek moet worden gehaald. Vage beschrijvingen leiden tot fouten.

6. **Test met echte gesprekken.** Try Out is geweldig voor het eerste testen, maar monitor je eerste paar live gesprekken om er zeker van te zijn dat alles werkt met echte klantvragen.

7. **Houd logs bij aan jouw kant.** Vraag je ontwikkelaar om de verzoeken die vanuit de app komen te loggen, zodat je eventuele problemen snel kunt debuggen.

8. **Gebruik een openbare definitieve URL.** De URL van je functie moet een openbaar webadres (HTTP/HTTPS) zijn. Interne, localhost- en privénetwerkadressen worden om veiligheidsredenen geweigerd, en het platform volgt geen redirects — verwijs de functie direct naar de definitieve URL, niet naar een URL die daarnaar doorverwijst.

---

## Uitvoeringslimieten

Elke aangepaste functie heeft onderaan de editor een optionele sectie **Uitvoeringslimieten**. Hiermee bepaal je hoe vaak de AI de functie mag uitvoeren en of een eerder resultaat opnieuw kan worden gebruikt. Alles hier is optioneel — laat alles leeg en de functie gedraagt zich precies zoals voorheen.


**Alleen-lezen functie.** Schakel dit in als je functie alleen gegevens *leest* — zoals een voorraadopzoeking, prijscontrole of het zoeken naar de status van een bestelling — en nooit iets aanmaakt of wijzigt. Wanneer een tijdelijke netwerkstoring de AI halverwege een antwoord onderbreekt, kan het platform de gespreksbeurt veilig opnieuw proberen in plaats van de klant zonder antwoord achter te laten. Schakel dit alleen in als de functie echt nooit iets schrijft: een functie die records aanmaakt moet uitgeschakeld blijven, zodat een herhaling deze nooit per ongeluk twee keer kan uitvoeren.

**Gecachet resultaat serveren bij herhaalde aanroepen.** Wanneer de AI de functie opnieuw aanroept met dezelfde invoer (bijvoorbeeld als de klant twee keer dezelfde vraag stelt), wordt het vorige resultaat opnieuw gebruikt in plaats van je eindpunt opnieuw aan te roepen. Gecachete resultaten worden maximaal 24 uur bewaard en een aanroep met *andere* invoer gaat altijd vers naar je eindpunt.

**Max. uitvoeringen per gesprek.** Een harde limiet op hoe vaak de functie binnen één gesprek mag worden uitgevoerd. Stel dit in op 1 voor functies die slechts één keer per chat mogen worden geactiveerd — zoals het genereren van een offerte, het triggeren van een terugbelverzoek of het starten van een automatisering. Wanneer de limiet is bereikt, krijgt de AI te horen dat de functie al is uitgevoerd en krijgt deze het meest recente resultaat, zodat de AI de klant nog steeds kan antwoorden in plaats van stil te vallen.

**Max. uitvoeringen per tijdvenster.** Een snelheidslimiet over tijd: bijvoorbeeld maximaal 5 uitvoeringen binnen 60 minuten. Handig voor functies die betaalde diensten van derden aanroepen of zwaardere automatiseringen triggeren. Beide vakken moeten samen worden ingevuld (een aantal uitvoeringen en een venster in minuten, tot maximaal 7 dagen).

Een paar dingen om te weten:

- Limieten tellen alleen **succesvolle** uitvoeringen. Een aanroep die aan de kant van je eindpunt is mislukt, verbruikt het budget niet.
- Wanneer een uitvoering wordt geblokkeerd door een limiet, wordt de klant nooit in het ongewisse gelaten — de AI krijgt te horen waarom en werkt met de informatie die al beschikbaar is.
- Limieten zijn van toepassing op alle plekken waar de functie wordt uitgevoerd: reguliere chats op elk kanaal en functies die worden beheerd door een automatisering. Testgesprekken in 'Uitproberen' worden niet meegeteld en zijn niet beperkt.

---

## Ingebouwde bot-tools

Naast de aangepaste functies die je zelf bouwt, wordt het platform geleverd met een bibliotheek van vooraf gebouwde tools die de AI-bot tijdens een gesprek kan gebruiken. Deze dekken de meest voorkomende taken die een bot moet uitvoeren — een teamlid waarschuwen, een afspraak boeken, een contactpersoon labelen, je website doorzoeken, een follow-up plannen, en meer — zodat je ze niet vanaf nul hoeft te koppelen.

**De bot bepaalt wanneer hij welke tool gebruikt** op basis van wat er in het gesprek gebeurt en hoe je Agent (en de bijbehorende campagne) is geconfigureerd. De meeste van deze tools worden automatisch ingeschakeld wanneer de gerelateerde functie wordt geactiveerd (bijvoorbeeld: de boekingstools worden pas beschikbaar zodra je een agenda koppelt en boekingen inschakelt).

**Creditkosten:** Elke tool-aanroep wordt gefactureerd op basis van het AI Quality-niveau van je Agent, en aangepaste functies die je zelf bouwt worden op dezelfde manier gefactureerd:

| AI Quality-niveau | Credits per tool-aanroep | Met je eigen Anthropic-sleutel (BYOK) gekoppeld |
|---|---|---|
| Pro | 1 credit | 0 credits — draait op jouw sleutel |
| Economy (verouderd) | 0,5 credits | 0 credits — draait op jouw sleutel |
| Max | 0,25 credits | nog steeds 0,25 credits, gefactureerd zelfs met je eigen sleutel gekoppeld, omdat Max op ons eigen model draait |
| Mini | 0,15 credits | nog steeds 0,15 credits, gefactureerd zelfs met je eigen sleutel gekoppeld, omdat Mini op ons eigen model draait |

### Team- & Taaktools

| Tool | Wat het doet | Wanneer de bot het gebruikt |
|------|--------------|----------------------|
| **Teamlid waarschuwen** | Pauzeert de bot voor dit contact en mailt je team dat er een mens nodig is. De chat wordt gemarkeerd zodat een teamgenoot deze kan overnemen. | Wanneer de klant om een mens vraagt, gefrustreerd is of iets vraagt wat de bot niet mag of kan beantwoorden. |
| **Taak aanmaken** | Maakt een nieuwe taak aan op je takenbord, optioneel gekoppeld aan het contact en het gesprek. De bot blijft normaal antwoorden - de taak is slechts een notitie voor je team om op te volgen. | Voor niet-dringende zaken zoals een functieverzoek, een upsell-mogelijkheid of een terugbelverzoek dat het team later moet afhandelen. |
| **FAQ-update voorstellen** | Wanneer de bot een vraag krijgt die hij niet goed kan beantwoorden, maakt hij een taak aan met het verzoek aan je team om een antwoord toe te voegen aan de kennisbank. | Wanneer een contact iets vraagt dat niet in je bestaande FAQ's staat - zodat het gat voor de volgende keer gedicht is. |
| **Context toevoegen aan een FAQ-suggestie** | Als een ander contact later een soortgelijke vraag stelt vanuit een andere hoek, voegt de bot die context toe aan de bestaande FAQ-suggestie in plaats van een dubbele taak aan te maken. | Automatisch - houdt je takenlijst overzichtelijk wanneer meerdere mensen hetzelfde kennistekort aankaarten. |

### Contacttools

| Tool | Wat het doet | Wanneer de bot het gebruikt |
|------|--------------|----------------------|
| **Labelen** | Wordt automatisch uitgevoerd na elk antwoord van de bot — het is geen tool die de klantgerichte bot zelf besluit aan te roepen. Het systeem beoordeelt het recente gesprek en past relevante labels toe, waarbij je bestaande labels worden hergebruikt (en alleen indien nodig een nieuwe wordt aangemaakt). | Automatisch — wanneer het gesprek iets onthult dat de moeite waard is om op te segmenteren, zoals interesse, intentie, leadkwaliteit of taal. |
| **Contactnaam bijwerken** | Slaat de voor- en/of achternaam van de contactpersoon op wanneer deze wordt gedeeld. | Wanneer de klant zich voorstelt of een naam corrigeert. |
| **Contact-e-mail bijwerken** | Slaat het e-mailadres van de contactpersoon op wanneer dit wordt gedeeld. | Wanneer de klant een e-mailadres verstrekt — voor nieuwsbrieven, bonnen, accountopzoekingen, enz. |

### Afspraak- & Boekingstools

Deze tools zijn alleen beschikbaar wanneer boekingen zijn ingeschakeld voor de campagne die aan je Agent is gekoppeld en er een type agenda-afspraak is geconfigureerd.

| Tool | Wat het doet | Wanneer de bot het gebruikt |
|------|--------------|----------------------|
| **Beschikbare tijdsloten controleren** | Zoekt op welke tijden openstaan in je gekoppelde agenda voor een bepaalde datum of datumbereik. | Wanneer de klant wil boeken en de bot echte beschikbaarheid moet aanbieden. |
| **Een afspraak boeken** | Maakt de afspraak aan in je agenda en bevestigt de boeking aan de klant. | Nadat de klant een specifieke datum en tijd heeft bevestigd. |
| **Een afspraak verplaatsen** | Verplaatst een bestaande afspraak naar een nieuwe datum en tijd. | Wanneer de klant vraagt om de afspraak te verzetten. |
| **Een afspraak annuleren** | Annuleert een bestaande afspraak. | Wanneer de klant vraagt om te annuleren. |
| **Afspraken opzoeken** | Haalt de bestaande afspraken van een contactpersoon op, zodat de bot weet wat er al gepland staat. | Wanneer de klant vraagt "wanneer is mijn afspraak?" of voordat de bot aanbiedt om te verzetten. |

### Kennis- & Webtools

| Tool | Wat het doet | Wanneer de bot het gebruikt |
|------|--------------|----------------------|
| **Doorzoek uw website** | scant de URL's die u aan de lijst met dynamische URL's van de campagne hebt toegevoegd om productpagina's, artikelen of andere inhoud te vinden die de vraag van de klant beantwoordt. Alleen beschikbaar wanneer **AI-webzoekopdracht** is ingeschakeld en u ten minste één dynamische URL hebt toegevoegd. Als AI-webzoekopdracht is uitgeschakeld, kan de bot geen pagina's of links lezen — zelfs niet als de klant deze in de chat plakt. | Wanneer de klant vraagt naar iets dat waarschijnlijk op uw website staat — producten, prijzen, locaties, beleid. |
| **Controleer een link** | Leest de inhoud van een specifieke URL zodat de bot vragen over die pagina kan beantwoorden. Alleen beschikbaar wanneer **AI-webzoekopdracht** is ingeschakeld en u ten minste één dynamische URL hebt toegevoegd. Als AI-webzoekopdracht is uitgeschakeld, kan de bot geen pagina's of links lezen — zelfs niet als de klant deze in de chat plakt. | Wanneer de klant een link deelt of vraagt naar een specifieke pagina op uw site. |
| **Doorzoek het web** | Voert een openbare Google-zoekopdracht uit en geeft de beste resultaten terug, zodat de bot vragen kan beantwoorden die buiten uw eigen inhoud vallen. | Wanneer de klant vraagt naar iets algemeens (bijv. routebeschrijvingen, openbare informatie) dat niet in uw kennisbank staat. Alleen gebruikt als webzoekopdracht is ingeschakeld. |

### Follow-up tools

Voor deze tools moeten follow-ups zijn ingeschakeld in de campagne die aan uw Agent is gekoppeld.

| Tool | Wat het doet | Wanneer de bot het gebruikt |
|------|--------------|----------------------|
| **Plan een slimme follow-up** | Plant een intelligent follow-upbericht met behulp van uw follow-upreeks — kiest het juiste sjabloon en de juiste timing op basis van het gesprek. | Wanneer de klant stilvalt of de bot vraagt om "later terug te komen". |
| **Plan een follow-up** | Plant een basis-follow-up op een specifiek tijdstip. | Wanneer de bot het gesprek op een bepaald moment vooruit moet helpen. |

### Custom Function Runner

| Tool | Wat het doet | Wanneer de bot het gebruikt |
|------|--------------|----------------------|
| **Voer een aangepaste functie uit** | Voert een van de aangepaste functies uit die u hebt gebouwd en aan de Agent hebt toegewezen (zie de rest van deze pagina). | Wanneer het verzoek van de klant overeenkomt met het doel van een van uw aangepaste functies. |

### Restaurantboekingstools (Zenchef en Formitable)

Deze tools zijn alleen beschikbaar wanneer een Zenchef- of Formitable-integratie is gekoppeld. Hiermee kan de bot restaurantreserveringen van begin tot eind beheren.

| Tool | Wat het doet | Wanneer de bot het gebruikt |
|------|--------------|----------------------|
| **Restaurantbeschikbaarheid controleren** | Zoekt naar open reserveringsslots voor een bepaalde datum, groepsgrootte en (optioneel) zitgedeelte. | Wanneer een gast vraagt om een tafel te boeken. |
| **Een restaurantboeking maken** | Maakt een nieuwe reservering aan. | Nadat de gast een specifiek slot heeft bevestigd. |
| **Een restaurantboeking bijwerken** | Wijzigt de datum, tijd, groepsgrootte of opmerkingen van een bestaande reservering. | Wanneer de gast vraagt om de boeking te wijzigen. |
| **Boekingsstatus annuleren of wijzigen** | Annuleert een reservering of werkt de status bij (bijv. bevestigd, no-show). | Wanneer de gast annuleert, of wanneer de bot een statuswijziging moet doorvoeren. |
| **Boekingen zoeken** | Vindt bestaande reserveringen die overeenkomen met criteria zoals naam, e-mail of datum. | Wanneer een terugkerende gast vraagt naar een bestaande reservering. |
| **Gastprofiel bijwerken** | Werkt het profiel van de gast bij in het restaurantsysteem (voorkeuren, opmerkingen, contactgegevens). | Wanneer de gast dieetwensen, een nieuw telefoonnummer of andere informatie op profielniveau deelt. |
| **Restaurantproducten weergeven** | Haalt de lijst op met menu's, vaste menu's of extra's die beschikbaar zijn voor boeking. | Wanneer de gast vraagt "welke vaste menu's hebben jullie?" of de bot een menu aan een reservering moet koppelen. |

### Tools in- en uitschakelen

De meeste tools worden beheerd op het tabblad **AI-vaardigheden** van de Agent (of de stap **AI-vaardigheden** van de campagne, als u werkt vanuit een nog klassieke campagne):

- **Boekingstools** worden ingeschakeld wanneer u boekingen activeert en een agenda koppelt — dit blijft voorlopig een instelling per campagne, met een directe link naar de stap van die campagne vanaf het tabblad AI-vaardigheden van de Agent zelf
- **Follow-up-tools** worden ingeschakeld wanneer u follow-ups activeert
- **Restauranttools** worden ingeschakeld wanneer u een Zenchef- of Formitable-account koppelt
- **Webzoekopdracht** heeft een eigen schakelaar op het tabblad **Veelgestelde vragen & Kennis**
- **Taaktools** kunnen per Agent worden uitgeschakeld met de schakelaar **AI toestaan taken aan te maken** (ze staan standaard aan; de accountbrede schakelaar Taken in **Instellingen → Profiel → Functies** schakelt het hele taaksysteem overal uit)
- **Contact-bijwerktools** worden beheerd op hetzelfde tabblad **AI-vaardigheden** — of de AI contactpersonen mag hernoemen of extra verzamelde informatie bij hen mag opslaan
- **Waarschuwingstools** zijn altijd beschikbaar; **tagging** gebeurt automatisch na elk antwoord van de bot (het is geen tool die de bot zelf kiest om aan te roepen)

Als u wilt dat de bot stopt met het gebruik van een specifieke ingebouwde tool, is de schoonste manier om de onderliggende functie uit te schakelen (schakel bijvoorbeeld boekingen uit om alle boekingstools uit te schakelen).

---

## Functies beheerd door een automatisering

Sommige items op uw pagina Aangepaste functies kunnen een badge **Beheerd door automatisering** hebben. Deze zijn hier niet gemaakt — ze zijn afkomstig van een automatisering met een **AI Agent-functie**-trigger, die uw agent een vaardigheid geeft waarvan u de stappen visueel op het automatiseringscanvas bouwt in plaats van naar een extern webadres te verwijzen.

Een beheerde functie wordt voor u onderhouden: de naam, beschrijving en velden volgen altijd wat is ingesteld op de trigger van de automatisering, dus deze kan niet vanaf deze pagina worden bewerkt of verwijderd — gebruik de link **Automatisering openen** en wijzig de automatisering zelf. U kunt nog steeds op de normale manier kiezen welke agents deze hebben: op het tabblad **AI-vaardigheden** van een agent verschijnt deze naast de andere vaardigheden van de agent met een normale aan/uit-schakelaar (als de automatisering is gepauzeerd, wordt dit in de rij aangegeven — de vaardigheid wordt actief wanneer de automatisering wordt ingeschakeld). Al het overige gedraagt zich als elke andere aangepaste functie: de AI beslist wanneer deze moet worden aangeroepen, verzamelt de details die u hebt gedefinieerd en kan het antwoord van de automatisering in hetzelfde gesprek gebruiken.

Als je moet kiezen tussen de twee: wijs een reguliere aangepaste functie toe aan een systeem dat al een adres heeft om aan te roepen; bouw een automatisering met een AI Agent Function-trigger wanneer het werk iets is dat je liever uit stappen opbouwt — iets opzoeken in een spreadsheet of database, vertakken op basis van een voorwaarde, records aanmaken — zonder dat je zelf een server hoeft te draaien. Zie [Automatiseringen](../automations/automations.md#letting-your-ai-agent-call-an-automation).

---

## Planvereisten

Aangepaste functies zijn beschikbaar in abonnementen die de functie voor aangepaste functies bevatten. Controleer uw abonnement om de beschikbaarheid te bevestigen.

---

## Volgende stappen

- [Verbind MCP-servers met je bot](mcp-servers.md) — een kant-en-klaar pakket met tools in plaats van één functie tegelijk.
- [AI Agents](../ai-agents/ai-agents.md) — de hoofdpagina van de AI Studio-groep waar Aangepaste Functies onder vallen, en waar aangepaste functies aan een bot worden toegewezen.
