Waarom Edge Functions voor AI-integraties
De drie redenen om Supabase Edge Functions te gebruiken voor AI-aanroepen:
**1. API-sleutelbescherming**: OpenAI-, Anthropic- en andere AI API-sleutels mogen nooit in je frontend staan. Edge Functions slaan sleutels op als omgevingsvariabelen — nooit zichtbaar voor clients.
**2. Authenticatie en autorisatie**: Edge Functions hebben directe toegang tot de Supabase Auth-context. Je kunt de ingelogde gebruiker identificeren, hun abonnementsniveau controleren en rate limits afdwingen voordat je een dure AI-aanroep doet.
**3. AVG-dataresidentie**: Supabase Edge Functions draaien in de regio van je Supabase-project. Als je EU-west (Frankfurt) kiest, verlaten je AI-aanroepen en gebruikersdata Europa niet — een vereiste voor veel Nederlandse B2B-klanten en overheidscontracten.
Je eerste AI Edge Function
Installeer de Supabase CLI en initialiseer een nieuwe functie:
``` supabase functions new ai-chat ```
De basisstructuur van een AI-proxy-functie in TypeScript/Deno: - Accepteer een POST-verzoek met `messages` array - Verificeer de authenticatietoken via `supabase.auth.getUser()` - Controleer gebruikersquota in de database - Roep OpenAI aan via `fetch()` met de API-sleutel uit `Deno.env` - Log het gebruik in de database - Retourneer het antwoord
Deploy met: ``` supabase functions deploy ai-chat supabase secrets set OPENAI_API_KEY=sk-... ```
De functie is nu beschikbaar op `https://[project-ref].supabase.co/functions/v1/ai-chat`.
Streaming responses implementeren
Voor een ChatGPT-achtige typewriter-ervaring wil je streaming — de tekst verschijnt woord voor woord terwijl OpenAI genereert.
In je Edge Function: stel `stream: true` in bij de OpenAI API-aanroep en retourneer een `ReadableStream`-response. De client (WeWeb of FlutterFlow) leest de stream iteratief en werkt de UI bij met elk ontvangen chunk.
Vanuit WeWeb gebruik je een custom JavaScript-actie die de Fetch API met `reader.read()` in een loop aanroept. Elke chunk werkt een WeWeb-staatsvariabele bij die gebonden is aan de AI-antwoordweergave.
Vanuit FlutterFlow heb je een custom action nodig die de HTTP-response-stream verwerkt — dit vereist iets meer Dart-code maar is uitvoerbaar met FlutterFlow's custom code-functionaliteit.
Rate limiting en quota-beheer
Zonder rate limiting kan een enkel misbruikend account je maandelijkse AI-budget opbranden.
Implementeer twee niveaus:
**Per-verzoek rate limiting**: Controleer in de Edge Function hoe veel AI-aanroepen de gebruiker de afgelopen minuut heeft gedaan. Gebruik een Supabase-tabel `rate_limits` met user_id, endpoint en request_count. Als het limiet is bereikt, retourneer een 429.
**Maandelijkse quota**: Sla maandelijkse token-gebruik per gebruiker op. Controleer bij elke aanroep of het quotum voor het lopende abonnementsniveau niet is overschreden. Retourneer een 402 (Payment Required) met een upgrade-prompt.
Voor Nederlandse SaaS-producten: koppel quota aan Stripe-abonnementsniveaus. Een webhook van Stripe activeert een database-update wanneer een gebruiker upgradet — quota-limieten worden direct bijgewerkt.
Omgaan met grote documenten en RAG
Voor documentverwerking (PDF's samenvatten, vraag-antwoord op documentinhoud) heb je een patroon nodig dat context-windows beheert.
De flow: 1. Document wordt geüpload naar Supabase Storage 2. Een Edge Function wordt getriggerd, verdeelt het document in ~500-tokenchunks 3. Elk chunk wordt omgezet naar een vector-embedding via OpenAI `text-embedding-3-small` 4. Embeddings worden opgeslagen in een Supabase-tabel met `pgvector` 5. Wanneer een gebruiker een vraag stelt, wordt de vraag omgezet naar een embedding en vergeleken met opgeslagen chunks via cosinus-gelijkenis 6. De top-5 meest relevante chunks worden toegevoegd als context aan de GPT-aanroep
Dit patroon werkt voor kennisbase-assistenten, juridische documentanalyse en productdocumentatie-bots.
AVG-compliance voor Edge Functions
Drie AVG-overwegingen specifiek voor Supabase Edge Functions:
**Regiokeuze**: Maak je Supabase-project aan in `eu-west-1` (Frankfurt). Dit zorgt dat al je Edge Function-uitvoeringen en dataopslag in de EU plaatsvinden. Je kunt de regio niet wijzigen na aanmaken — kies zorgvuldig.
**Logging**: Edge Functions loggen standaard verzoekdata. Verwijder of anonimiseer persoonlijke data in logs voor AVG-naleving. Gebruik Supabase's log-configuratie om gevoelige headers en body's uit te sluiten.
**Verwerkersovereenkomst**: Supabase biedt een DPA aan als onderdeel van hun Enterprise-plan. Voor de meeste Nederlandse startups volstaat de standaard verwerkersovereenkomst die Supabase aanbiedt in hun privacydocumentatie — controleer dit met je privacy-counsel als je AVG Artikel 9-data (gezondheid, politieke overtuigingen, etc.) verwerkt.