# Les 11 — Vercel AI SDK
## Slide Overzicht (Klas A — 3 uur fysiek, demo-driven)

**Lesvorm:** Tim demonstreert klassikaal. Studenten kijken mee, gaan thuis zelf aan de slag.
**Demo-app:** Polderfest 2027 — fictief muziekfestival met 500 verzonnen bands in Supabase. Studenten kunnen vragen stellen aan dummy data die LLM's onmogelijk vooraf konden kennen.

---

## Slide 1: Title
### Les 11 — Vercel AI SDK

**Visual:**
- Background: CREAM
- "Les 11" in BLUE
- "Vercel AI SDK" in BLACK
- Subtitle: "Praat met je eigen data — vandaag bouwen we Polderfest 2027"

---

## Slide 2: Terugblik
### Waar staan we?

**Vorige lessen:**
- Supabase geïntegreerd in je app
- Tabellen + relaties opgezet
- RLS policies bekeken (wie mag wat lezen/schrijven)

**Vandaag bouwen we niet voort op QuickPoll — we starten een nieuwe demo from scratch.**
We laten zien hoe je een Next.js app aan een verse Supabase koppelt en die data combineert met AI.

**Visual:** Twee icoontjes (database + Next.js logo) met pijl naar AI-icoon.

---

## Slide 3: Planning
### Vandaag — 180 minuten

| Onderwerp | Duur |
|-----------|------|
| Welkom + Terugblik | 10 min |
| Theorie: Wat is de Vercel AI SDK? | 30 min |
| **Live Demo 1** — Next.js scaffold + Supabase koppelen | 20 min |
| **Live Demo 2** — Seed script: 500 records in Supabase | 20 min |
| **Pauze** | 15 min |
| **Live Demo 3** — AI SDK installeren + chat-route | 30 min |
| **Live Demo 4** — Vragen stellen aan onze data | 15 min |
| Waarom data + AI samen krachtig is | 5 min |
| Lesopdracht + Huiswerk uitleg | 20 min |
| Vragen + Afsluiting | 15 min |

**Belangrijk:** Vandaag is **demo-driven**. Jullie kijken en luisteren. Thuis gaan jullie zelf aan de slag met jullie eigen thema.

---

## Slide 4: Wat is de Vercel AI SDK?
### Eén SDK, alle providers

**Content:**
- TypeScript-first SDK voor AI features
- Werkt met OpenAI, Anthropic, Google, Mistral, Groq, en meer
- **Unified API:** zelfde code voor elk model
- Streaming out-of-the-box
- React hooks (`useChat`, `useCompletion`)
- Tool Calling (volgende les)
- Open source · gemaakt door Vercel

**Code teaser:**
```typescript
import { generateText } from "ai";
import { openai } from "@ai-sdk/openai";

const { text } = await generateText({
  model: openai("gpt-4o-mini"),
  prompt: "Vat de Polderfest line-up samen",
});
```

**Visual:** Logo's van OpenAI/Anthropic/Google met pijl naar één AI-SDK doos.

---

## Slide 5: Modellen + Kosten
### Welk model wanneer?

| Provider | Model | Use case | Prijs (in/out per 1M tokens) |
|----------|-------|----------|------------------------------|
| OpenAI | gpt-4o-mini | Default — snel + goedkoop | $0.15 / $0.60 |
| OpenAI | gpt-4o | Multimodaal (vision) | $2.50 / $10 |
| OpenAI | gpt-4.1 | Reasoning, agents | $2 / $8 |
| Anthropic | claude-sonnet-4 | Coding, lange context | $3 / $15 |
| Google | gemini-2.5-flash | Snel + multimodaal | $0.075 / $0.30 |
| Groq | llama-3.3-70b | Ultra-fast inference | $0.59 / $0.79 |

**Vuistregel:** start met `gpt-4o-mini`. Upgrade pas als nodig.

**Voor vandaag:** `gpt-4o-mini`. Onze hele les inclusief Polderfest-Q&A kost ongeveer 1-2 cent.

---

## Slide 6: De 4 kern-functies
### Wat je vandaag gaat zien

| Functie | Wat het doet | Wanneer |
|---------|--------------|---------|
| `generateText` | Wacht tot AI antwoord klaar is — string terug | Korte server-only antwoorden |
| `streamText` | Stream karakter voor karakter | Chat UI, lange antwoorden |
| `useChat` | React hook voor instant chat UI | Client-side chat |
| `generateObject` | Type-safe data via Zod schema | Database inserts, classificatie |

**Vandaag gebruiken we vooral:**
- `streamText` + `useChat` — voor de chat UI
- Onze Polderfest-data als context — AI beantwoordt vragen op basis van onze 500 bands

**Volgende les (Les 12):** `generateText` + `tools` — Tool Calling, waar AI zelf besluit welke DB-query te runnen.

---

## Slide 7: Wat bouwen we vandaag?
### Polderfest 2027 — een fictief festival

**Het idee:**
Een fictief Nederlands muziekfestival met **500 verzonnen bands**. Volledig fictief — geen enkele LLM kan dit weten uit training. Dit is precies waar AI + jouw data sterker wordt dan AI alleen.

**Schema (Supabase tabel `bands`):**
- `name`, `genre`, `sub_genre`
- `stage`, `day`, `start_time`, `duration_min`
- `origin_city`, `members`, `bio`
- `tier` (headliner / mid / opener), `popularity`, `ticket_impact`

**Voorbeeld-vragen die we kunnen stellen aan AI:**
- "Welke bands spelen vrijdagavond na 22:00 op de Main Stage?"
- "Geef me 5 acts uit Groningen, gesorteerd op populariteit"
- "Vat de hip-hop scene op Polderfest samen in 3 zinnen"
- "Welke headliner is qua bio het meest interessant voor electronic-fans?"

**Visual:** Festival-poster mock-up met genre-tags + Supabase logo.

---

## Slide 8: LIVE DEMO 1
### Next.js scaffold + Supabase koppelen (~20 min)

**Wat ik laat zien:**
1. `npx create-next-app@latest polderfest --typescript --tailwind --app`
2. Nieuw Supabase project aanmaken (dashboard)
3. SQL Editor: schema runnen (zie schema.sql)
4. Supabase client installeren: `npm i @supabase/supabase-js`
5. `.env.local` met `SUPABASE_URL` + `SUPABASE_ANON_KEY` + `SUPABASE_SERVICE_ROLE_KEY`
6. `lib/supabase.ts` aanmaken (client)
7. Tabel-check via Table Editor: leeg, klaar om te seeden

**Wat ik NIET uitleg:** Next.js / Supabase basics — dat hebben jullie al gehad.

**Visual:** Badge "LIVE DEMO" in PINK + screenshots Supabase dashboard.

---

## Slide 9: LIVE DEMO 2
### Seed script: 500 records in Supabase (~20 min)

**Wat ik laat zien:**
1. `seed-polderfest.ts` openen — uitleggen wat 't doet:
   - Procedureel 500 bands genereren
   - Combinaties van adjectives + nouns + bio-fragmenten
   - Insert in batches van 100
2. Service role key uitleggen — alleen lokaal, niet in client
3. `npm i tsx @supabase/supabase-js dotenv --save-dev`
4. `npx tsx seed-polderfest.ts` runnen
5. Supabase Table Editor refresh → 500 records zichtbaar
6. Een paar voorbeelden tonen — "De Tigers", "Lost Mirrors", "Sanne Van Dijk & The Echoes"

**Sleutel-inzicht:** dit zijn 500 namen die **niet bestaan**. Geen enkele LLM kan ze kennen.

**Visual:** Terminal log van seed + Table Editor screenshot.

---

## Slide 10: Pauze
### 15 minuten

---

## Slide 11: LIVE DEMO 3
### AI SDK installeren + chat-route (~30 min)

**Wat ik laat zien:**
1. `npm i ai @ai-sdk/openai zod`
2. `OPENAI_API_KEY` toevoegen aan `.env.local` (schoolkey via Brightspace)
3. **`app/api/chat/route.ts`** schrijven:
   - Haal alle bands op uit Supabase
   - Format als context-string
   - `streamText` aanroepen met system + user messages
   - Return `result.toDataStreamResponse()`
4. **`app/chat/page.tsx`** schrijven:
   - `"use client"` + `useChat` hook
   - Simpele Tailwind chat UI (messages list + input)
5. Naar `/chat` browsen → werkt
6. Eerste prompt: "Hoeveel bands spelen vrijdag?"

**Belangrijke uitleg-momenten:**
- Waarom we **alle bands meesturen** als context (volgende les: Tool Calling lost dit op)
- Hoe `streamText` zich aansluit op `useChat`
- System prompt — hoe je de AI 'rol' geeft

**Visual:** Code-mock-up + chat preview.

---

## Slide 12: LIVE DEMO 4
### Vragen stellen aan onze data (~15 min)

**Vragen die we live uitproberen:**
1. "Welke bands spelen zaterdag op de Beach Stage?"
2. "Geef me 3 headliners met de meeste popularity, en hun bio's"
3. "Hoeveel jazz fusion acts spelen er totaal?"
4. "Vat de electronic-scene op Polderfest samen — wat zou je aanraden voor iemand die houdt van techno?"
5. **Slechte vraag:** "Wie was de hoofdacts van Polderfest 2025?" — AI antwoordt eerlijk dat hij dat niet weet (data alleen 2027)

**Sleutel-inzicht:**
- AI is **slim**, maar pas écht nuttig met **jouw data**
- LLM weet niets van Polderfest 2027 — toch krijgen we precieze antwoorden
- Combinatie = `context (jouw data) + reasoning (AI)`

**Visual:** Chat screenshots met antwoorden.

---

## Slide 13: Waarom is dit krachtig?
### Data + AI > Data alleen, AI alleen

**Data alleen:**
- Supabase query: filter + sort + select
- Geen interpretatie, geen samenvatting, geen taal
- Gebruiker moet zelf SQL-denken

**AI alleen:**
- Gebrekkige kennis over jouw domein
- Verzint vaak (hallucinatie)
- Geen toegang tot live data

**Data + AI:**
- AI interpreteert en vat samen
- Antwoorden in natuurlijke taal
- Filtert + reasoneert + presenteert
- Schaalbaar — voeg data toe = nieuwe antwoorden mogelijk

**Quote om mee weg te lopen:**
> "Een LLM zonder jouw data is een gewone chatbot.
> Een LLM mét jouw data is een product."

---

## Slide 14: Lesopdracht
### Jouw eigen thema-app

**Voor thuis (niet in de les) — bouw je eigen versie:**

1. Bedenk een **eigen thema** met data die LLM's niet kunnen weten
2. Maak een nieuw Next.js project + nieuwe Supabase
3. Schrijf eigen `seed-XXX.ts` script (mag AI je bij helpen!)
4. Seed minstens **100 records** in Supabase
5. Implementeer chat-route + chat-pagina (zelfde flow als Polderfest)
6. Stel 3 vragen aan je AI die alleen kunnen door jouw data

**Voorbeeld eigen thema's:**
- Fictief restaurant-aggregator in een verzonnen stad
- Galactische bestuurders archief (sci-fi)
- Verzonnen scriptie-archief NOVI
- Fictieve museumcollectie
- Fictief NPO-programma overzicht
- ...

**Beperking:** **GEEN echte/openbare data** (geen Spotify, geen TheCocktailDB). Het moet fictief zijn zodat de demo-kracht zichtbaar wordt.

**Visual:** 4 voorbeeld-thema's als cards.

---

## Slide 15: Huiswerk
### Polderfest seed-script aanpassen + uitbreiden

**Voor volgende week (Les 12):**

**Verplicht — onderdeel A:**
- Pas het seed-script aan voor **jouw eigen thema** (gebruik gerust AI om te helpen)
- Run het tegen je eigen Supabase
- Push naar GitHub repo

**Verplicht — onderdeel B:**
- Voeg minstens **1 extra veld** toe waarvan je denkt dat het interessante vragen mogelijk maakt
- Update schema + seed script
- Stel een vraag aan AI die alleen kan dankzij dat nieuwe veld

**Verplicht — onderdeel C:**
- Schrijf `AI-CHAT.md` in je repo met:
  - Jouw thema (wat is het, waarom kun je dit niet aan een gewone LLM vragen?)
  - 3 leuke vragen die werken op jouw data
  - 1 vraag waar de AI moeite mee had — wat veranderde toen je de prompt aanpaste?

**Bonus:** Deploy op Vercel — preview URL meesturen.

**Visual:** Workflow-diagram + checklist.

---

## Slide 16: Volgende les — Tool Calling
### Hoe schaalt dit?

**Probleem dat we vandaag introduceren:**
- We sturen **alle 500 bands** mee als context bij elke vraag
- 500 bands ≈ 30.000 tokens — dat is veel, kost geld, traagt
- 5.000 bands? 50.000 bands? Werkt niet meer

**Oplossing (volgende les):**
- **Tool Calling** — AI besluit zelf welke query te runnen
- Voorbeeld: AI ziet vraag "Welke bands spelen vrijdag?" → roept tool `searchBands(day: "Vrijdag")` aan → krijgt 60 bands terug → antwoordt
- Schaalbaar, slim, multi-step

**Daarna in deze leerlijn:**
- Les 13: Agents + `maxSteps` (multi-step autonoom)
- Les 14: RAG + embeddings (semantic search op groot corpus)
- Les 15-16: Testing + Deployment
- Les 17-18: Eindopdracht-werkdagen + Pitch

---

## Slide 17: Afsluiting
### Vragen?

**Wat we vandaag gezien hebben:**
- Vercel AI SDK basics
- Modellen + 4 kern-functies
- Next.js + Supabase + AI SDK end-to-end gekoppeld
- Live demo met seed-script (500 records procedureel)
- Vragen stellen aan een dataset die geen LLM kent

**Vragen? Feedback?**

**Visual:** Cream achtergrond, blauw rondje met "→ Tool Calling".

---

## Slide Summary

| # | Title | Type |
|---|-------|------|
| 1 | Title | Opening |
| 2 | Terugblik | Recap (Supabase + RLS, kort) |
| 3 | Planning | 180-min schedule |
| 4 | Wat is de AI SDK | Theorie |
| 5 | Modellen + kosten | Theorie |
| 6 | 4 kern-functies | Theorie |
| 7 | Vandaag bouwen we Polderfest | Intro demo |
| 8 | **LIVE DEMO 1** — Next.js + Supabase | Demo |
| 9 | **LIVE DEMO 2** — Seed 500 records | Demo |
| 10 | Pauze | Break |
| 11 | **LIVE DEMO 3** — AI SDK + chat | Demo |
| 12 | **LIVE DEMO 4** — Vragen stellen | Demo |
| 13 | Data + AI = kracht | Reflectie |
| 14 | Lesopdracht — eigen thema | Praktijk |
| 15 | Huiswerk — seed aanpassen | Praktijk |
| 16 | Volgende les: Tool Calling | Preview |
| 17 | Afsluiting | Closing |

---

## Bronnen

- Vercel AI SDK docs — https://ai-sdk.dev/docs/introduction
- generateText / streamText / useChat / generateObject reference — https://ai-sdk.dev/docs/reference
- Supabase JS client — https://supabase.com/docs/reference/javascript
- Next.js App Router — https://nextjs.org/docs/app
- OpenAI pricing — https://openai.com/api/pricing
- Tokenizer — https://platform.openai.com/tokenizer
- Vercel templates met AI — https://vercel.com/templates?type=ai
