diff --git a/00-sessie/README.md b/00-sessie/README.md
new file mode 100644
index 0000000..b6b7f2a
--- /dev/null
+++ b/00-sessie/README.md
@@ -0,0 +1,55 @@
+# Sessie: AI Agents, van voorbeeld naar je eigen project
+
+Een sessie van twee keer een uur voor een gemengd publiek, gemaakt voor het Kennisfestival van
+AI Netwerk Limburg. Het eerste uur is inhoud, interactie en onze voorbeelden; het tweede uur
+werkt iedereen aan een eigen project. Ontwerpen op papier hoort erbij, bouwen mag maar hoeft niet.
+
+- `sessie-agents-en-projecten.pdf`: de 23 dia's, klaar om te tonen.
+- `sessie-agents-en-projecten-met-notities.pdf`: per dia een A4 met het beeld en de sprekersnotities
+ eronder, om te printen of op een tweede scherm te openen.
+- `maak_dias.py`: de bron; bouwt de dia's als HTML (1920x1080) in `project/slides/` en `project/deck.json`.
+- `bouw_pdf.py` (of `python3 build.py`): bouwt de dia's opnieuw en maakt de PDF met google-chrome.
+- `bouw_notities_pdf.py`: maakt de notitieversie.
+
+## Het verloop
+
+| Tijd | Dia | Wat | Werkvorm |
+| --- | --- | --- | --- |
+| 0:00 | 1-2 | Welkom, hoe de twee uur werken | plenair |
+| 0:03 | 3 | Peiling: handen omhoog | interactie |
+| 0:07 | 4-6 | Drie lagen, wat een agent is, wat het niet is | plenair |
+| 0:20 | 7 | Hoeveel ruimte geef je het model: vijf patronen | plenair |
+| 0:23 | 8 | Drie stellingen, staan of zitten | interactie, 10 min |
+| 0:33 | 9 | Acht voorbeelden die echt draaien | plenair |
+| 0:36 | 10-13 | Vier demo's: schoolgids, schoolnieuws, planner, studiecoach | live, met sabotage |
+| 0:57 | 14-15 | Vier lessen, en de opdracht mee de pauze in | plenair |
+| 1:00 | 16-17 | Hoe het tweede uur werkt, de ontwerpkaart | plenair |
+| 1:08 | 17 | Werken aan je eigen project | zelf doen, 35 min |
+| 1:25 | 18 | Waar hoort de mens? (tijdens het werkblok) | interactie, tweetallen |
+| 1:43 | 19 | Pitches, drie mensen | interactie |
+| 1:53 | 20-21 | Waar bouw je het, en wat mag | plenair |
+| 2:00 | 22-23 | Hoe je verder komt, slot | plenair |
+
+Vier interactiemomenten, twee demo's met de zaal erbij, en 35 minuten waarin iedereen zelf werkt.
+
+## Wat je nodig hebt
+
+- De acht voorbeeld-apps staan live op udify.app en werken zonder inloggen; de links staan in de
+ sprekersnotities bij de demo-dia's en in de README van de repository.
+- Geprinte ontwerpkaarten: `../00-ontwerpkaart/ontwerpkaart.pdf`, één per deelnemer.
+- Voor wie in het tweede uur wil bouwen: de handleidingen uit deze repository, of die van de
+ Copilot-, ChatGPT- of Gemini-reeks als ze in hun eigen omgeving werken.
+- Geen laptops of accounts nodig om mee te doen.
+
+## Hoe dit verschilt van de andere twee presentaties
+
+| | Waar | Voor wie |
+| --- | --- | --- |
+| Sessie (deze, 23 dia's, 2 uur) | `00-sessie` | Gemengd publiek dat met een eigen project naar huis wil |
+| Workshop (26 dia's, 2,5 uur) | `00-presentatie` en `00-workshop` | Groepen die stap voor stap dezelfde app bouwen, met draaiboek |
+| Lezing (12 dia's, 20 min) | `00-lezing` | Een teamvergadering of bestuur dat het alleen moet snappen |
+
+De inhoudelijke dia's (wat is een agent, wat het niet is, vier omgevingen, wat mag) zijn in alle
+drie dezelfde tekst, zodat ze elkaar niet tegenspreken.
+
+Licentie CC BY-SA 4.0, logo van AI Netwerk Limburg uitgezonderd; zie `../LICENSE.md`.
diff --git a/00-sessie/beelden/logo-ai-netwerk-limburg.png b/00-sessie/beelden/logo-ai-netwerk-limburg.png
new file mode 100644
index 0000000..4d72a61
Binary files /dev/null and b/00-sessie/beelden/logo-ai-netwerk-limburg.png differ
diff --git a/00-sessie/beelden/logo-lex-wit.png b/00-sessie/beelden/logo-lex-wit.png
new file mode 100644
index 0000000..67093bb
Binary files /dev/null and b/00-sessie/beelden/logo-lex-wit.png differ
diff --git a/00-sessie/beelden/logo-lex.png b/00-sessie/beelden/logo-lex.png
new file mode 100644
index 0000000..df5e1f5
Binary files /dev/null and b/00-sessie/beelden/logo-lex.png differ
diff --git a/00-sessie/beelden/schoolnieuws-afgekeurd.jpg b/00-sessie/beelden/schoolnieuws-afgekeurd.jpg
new file mode 100644
index 0000000..395c911
Binary files /dev/null and b/00-sessie/beelden/schoolnieuws-afgekeurd.jpg differ
diff --git a/00-sessie/beelden/studiecoach-docent-antwoord.jpg b/00-sessie/beelden/studiecoach-docent-antwoord.jpg
new file mode 100644
index 0000000..9c589e8
Binary files /dev/null and b/00-sessie/beelden/studiecoach-docent-antwoord.jpg differ
diff --git a/00-sessie/beelden/studiecoach-flow.jpg b/00-sessie/beelden/studiecoach-flow.jpg
new file mode 100644
index 0000000..e421b8d
Binary files /dev/null and b/00-sessie/beelden/studiecoach-flow.jpg differ
diff --git a/00-sessie/bouw_notities_pdf.py b/00-sessie/bouw_notities_pdf.py
new file mode 100644
index 0000000..f283733
--- /dev/null
+++ b/00-sessie/bouw_notities_pdf.py
@@ -0,0 +1,104 @@
+#!/usr/bin/env python3
+"""Maakt een notitieversie van de presentatie: per dia een A4 met het beeld bovenaan en de
+sprekersnotities eronder. Om te printen of op een tweede scherm te openen terwijl je presenteert.
+
+Gebruik: python3 bouw_notities_pdf.py
+Uitvoer: sessie-agents-en-projecten-met-notities.pdf (staat niet in git; de begeleidersnotities zijn privé)
+
+Staat notities-begeleider.json naast dit script, dan gebruikt hij die uitgebreide notities.
+Anders de korte notities die in de dia's zelf zitten. Na afloop worden de dia-bestanden
+teruggezet op de publieke versie, zodat bouw_pdf.py en de repo ongewijzigd blijven.
+"""
+import html
+import json
+import re
+import subprocess
+import sys
+import tempfile
+from pathlib import Path
+
+HERE = Path(__file__).resolve().parent
+P = HERE / "project"
+PRIVE = (HERE / "notities-begeleider.json").exists()
+
+# 1. dia's bouwen, met de privénotities als die er zijn
+subprocess.run([sys.executable, str(HERE / "maak_dias.py")] + (["--notities"] if PRIVE else []), check=True)
+deck = json.loads((P / "deck.json").read_text(encoding="utf-8"))
+faces = "".join(f' ' for f in deck["faces"].values())
+
+# 2. eerst een tijdelijke dia-PDF, dan per dia een afbeelding
+tmp = Path(tempfile.mkdtemp(prefix="notities-"))
+css_dia = """
+@page { size: 1920px 1080px; margin: 0; }
+html, body { margin: 0; padding: 0; }
+* { box-sizing: border-box; margin: 0; padding: 0; }
+section { position: relative; width: 1920px; height: 1080px; overflow: hidden; page-break-after: always; break-after: page; }
+section:last-child { page-break-after: auto; }
+aside { display: none; }
+ul { padding-left: 1.1em; }
+table { border-collapse: collapse; width: 100%; }
+th, td { border: 1px solid #D8D2C4; padding: 12px 18px; text-align: left; vertical-align: top; }
+img { max-width: 100%; }
+"""
+slides_html = "".join((P / "slides" / f"{sid}.html").read_text(encoding="utf-8") for sid in deck["order"])
+(tmp / "dias.html").write_text(
+ f'
Geen notities bij deze dia.
"
+ regels = []
+ for deel in [d.strip() for d in tekst.split(" | ") if d.strip()]:
+ m = re.match(r"^([A-Z]{4,10}):\s*(.*)$", deel, re.S)
+ if m:
+ regels.append(f") komen niet in de PDF; die staan in project/slides/*.html.
+"""
+import json, subprocess, sys
+from pathlib import Path
+
+HERE = Path(__file__).resolve().parent
+subprocess.run([sys.executable, str(HERE / "maak_dias.py")], check=True)
+deck = json.loads((HERE / "project" / "deck.json").read_text(encoding="utf-8"))
+faces = "".join(f' ' for f in deck["faces"].values())
+css = """
+@page { size: 1920px 1080px; margin: 0; }
+html, body { margin: 0; padding: 0; }
+* { box-sizing: border-box; margin: 0; padding: 0; }
+section { position: relative; width: 1920px; height: 1080px; overflow: hidden; page-break-after: always; break-after: page; }
+section:last-child { page-break-after: auto; }
+aside { display: none; }
+ul { padding-left: 1.1em; }
+table { border-collapse: collapse; width: 100%; }
+th, td { border: 1px solid #D8D2C4; padding: 12px 18px; text-align: left; vertical-align: top; }
+img { max-width: 100%; }
+"""
+slides = "".join((HERE / "project" / "slides" / f"{sid}.html").read_text(encoding="utf-8") for sid in deck["order"])
+html = (HERE / "project" / "alle-dias.html")
+html.write_text(f'{deck["title"]} '
+ f'{faces}{slides}', encoding="utf-8")
+pdf = HERE / "sessie-agents-en-projecten.pdf"
+subprocess.run(["google-chrome", "--headless=new", "--disable-gpu", "--no-pdf-header-footer",
+ "--virtual-time-budget=8000", f"--print-to-pdf={pdf}", html.as_uri()],
+ check=True, capture_output=True)
+print(f"{pdf.name}: {pdf.stat().st_size // 1024} kB, {len(deck['order'])} dia's")
diff --git a/00-sessie/build.py b/00-sessie/build.py
new file mode 100644
index 0000000..c0411d5
--- /dev/null
+++ b/00-sessie/build.py
@@ -0,0 +1,3 @@
+import runpy
+from pathlib import Path
+runpy.run_path(str(Path(__file__).resolve().parent / "bouw_pdf.py"), run_name="__main__")
diff --git a/00-sessie/maak_dias.py b/00-sessie/maak_dias.py
new file mode 100644
index 0000000..1519c15
--- /dev/null
+++ b/00-sessie/maak_dias.py
@@ -0,0 +1,344 @@
+"""Bouwt de dia's van de workshop (22 stuks) als HTML-secties van 1920x1080 plus deck.json.
+
+Standaard verwijzen de beelden naar de map beelden/ naast dit script, zodat bouw_pdf.py er een
+PDF van kan maken. Met --artifact krijgen de beelden de paden van de online presentatie (asset store).
+Licentie: CC BY-SA 4.0, zie ../../LICENSE.md. Logo van AI Netwerk Limburg uitgezonderd.
+"""
+import json, sys
+from pathlib import Path
+HERE = Path(__file__).resolve().parent
+P = HERE / "project"; S = P / "slides"; S.mkdir(parents=True, exist_ok=True)
+ARTIFACT = "--artifact" in sys.argv
+# Uitgebreide begeleidersnotities (privé, niet in git): notities-begeleider.json naast dit script,
+# per dia-id een tekst die de sprekersnotitie vervangt. Alleen gebruikt met --notities.
+NOTITIES = {}
+if "--notities" in sys.argv:
+ NOTITIES = json.loads((HERE / "notities-begeleider.json").read_text(encoding="utf-8"))
+BEELD = {
+ "logo": ("../beelden/logo-ai-netwerk-limburg.png", "/_blob/120fdff17b59f8e1cc380d9086a1ad9f"),
+ "afgekeurd": ("../beelden/schoolnieuws-afgekeurd.jpg", "/_blob/9b09f7c211d54f2d5c5b5bdaa2b69fae"),
+ "flow": ("../beelden/studiecoach-flow.jpg", "/_blob/1c5f3486aa7ea647a8ee49269f3f95bf"),
+ "docent": ("../beelden/studiecoach-docent-antwoord.jpg", "/_blob/244acf99a4fa9215357a5e95e1eec2f4"),
+ "lex": ("../beelden/logo-lex-wit.png", "/_blob/a056bd447e5dc103fd01f7528f888bb9"),
+ "lexkleur": ("../beelden/logo-lex.png", "/_blob/042fe916c9a2622daf445ddb6d0bd222"),
+}
+def beeld(naam): return BEELD[naam][1 if ARTIFACT else 0]
+EIGENAAR = "Guido van Dijk, LeX Consultancy B.V. en AI Netwerk Limburg"
+KOP = "Kennisfestival AI Netwerk Limburg · 2 x een uur"
+CONTACT = "guido@l-e-x.nl · guido@ai-netwerk-limburg.nl"
+BRON = "git.lexconsultancy.nl/guido/dify-handleidingen"
+DARK="#1E2A3A"; LIGHT="#F7F4EC"; LIGHT2="#EFEAE0"; ACC="#D9480F"; BLUE="#2563EB"; BODY="#3D4756"; BODYD="#D9DEE6"; LINE="#D8D2C4"
+H="'Rubik', Arial, sans-serif"; T="'Nunito Sans', Verdana, sans-serif"
+LOGO=beeld("logo")
+order=[]; sections={}
+def slide(id_, body, bg=LIGHT, color=DARK, pad="128px 128px 160px", extra="display:flex; flex-direction:column; gap:40px", notes="", section=None, transition="fade", footer=True):
+ fcol = "#8A8F98" if bg in (LIGHT, LIGHT2) else "#9AA3B1"
+ notes = NOTITIES.get(id_, notes)
+ foot = f'AI Agents: van voorbeeld naar je eigen project · LeX Consultancy · AI Netwerk Limburg · CC BY-SA 4.0
' if footer else ""
+ # Klein LeX-logo rechtsonder op elke dia; wit op donkere dia's, kleur op lichte.
+ lexlogo = beeld("lexkleur") if bg in (LIGHT, LIGHT2) else beeld("lex")
+ if footer: # cover en slot hebben het logo al bovenaan
+ foot += f' '
+ html = (f'\n'
+ f'{body}\n{foot}\n\n \n')
+ (S / f"{id_}.html").write_text(html, encoding="utf-8"); order.append(id_)
+ if section: sections[id_]={"description":section,"start":id_}
+def h2(t): return f'{t} '
+def eyebrow(t, c=ACC): return f'{t}
'
+def p(t, size=32, c=BODY): return f'{t}
'
+def card(title, text, w="flex:1", bg="#FFFFFF", tc=DARK, bc=BODY, border=LINE):
+ return (f''
+ f'
{title} '
+ f'
{text}
')
+def num(n, label, w="flex:1"):
+ return (f'')
+def ul(items, size=30, c=BODY):
+ return f'' + "".join(f"{i} " for i in items) + " "
+def table(rows, widths, size=27, head=True):
+ out=[f'']
+ for i,r in enumerate(rows):
+ tag = "th" if (head and i==0) else "td"
+ bg = f' style="background:{LIGHT2}"' if (head and i==0) else ""
+ cells="".join(f'<{tag} style="width:{widths[j]}%; color:{DARK if tag=="th" else BODY}">{c}{tag}>' for j,c in enumerate(r))
+ out.append(f"{cells} ")
+ out.append("
"); return "".join(out)
+def interactie(label): return f'Interactie · {label}
'
+
+
+# ---------- DEEL 1: inhoud, interactie, voorbeelden ----------
+
+# 1 cover
+slide("cover", f'''
+
+
+
+{eyebrow(KOP, "#F4B183")}
+AI Agents: van voorbeeld naar je eigen project
+{p("Wat een agent is en wat niet, acht voorbeelden die echt draaien, en daarna: jouw project op papier. Bouwen mag, hoeft niet.", 34, BODYD)}
+
+{p("Guido van Dijk · LeX Consultancy B.V. · AI Netwerk Limburg", 28, "#9AA3B1")}
+''', bg=DARK, color=LIGHT, footer=False, section="Deel 1: wat is een agent",
+notes="Welkom. Zeg meteen hoe het werkt: het eerste uur kijken en meedenken, het tweede uur werk je aan je eigen project. Niemand hoeft iets te installeren.")
+
+# 2 programma
+slide("programma", h2("Twee uur, twee helften") + table([
+ ["Tijd","Wat","Wat jij doet"],
+ ["Uur 1 · eerste 25 min","Wat is een agent, en wat niet","Meedenken; drie keer vraag ik iets aan de zaal"],
+ ["Uur 1 · laatste 35 min","Acht voorbeelden die echt draaien","Kijken, vragen stellen, één keer saboteren"],
+ ["Uur 2 · eerste 35 min","Jouw project op de ontwerpkaart","Zelf invullen; wij lopen rond en stellen vragen"],
+ ["Uur 2 · laatste 25 min","Pitches, wat mag, hoe je verder komt","Pitchen mag, luisteren ook"],
+],[24,38,38], size=27) + p("Wie in het tweede uur wil bouwen in plaats van ontwerpen: prima, dat kan naast elkaar. Alles wat je vandaag ziet, staat online met handleidingen en video's.", 28),
+notes="Verwachtingen managen: dit is geen cursus waarin iedereen hetzelfde bouwt. Het doel is dat iedereen met een ontwerp naar huis gaat dat hij zelf kan uitvoeren.")
+
+# 3 peiling
+slide("peiling", interactie("3 minuten · handen omhoog") + h2("Even peilen") + f'''
+
+{card("1", "Wie heeft deze week AI gebruikt voor werk? Een tekst, een samenvatting, een idee.")}
+{card("2", "Wie weet zeker of dat mocht, met het account dat hij daarvoor gebruikte?")}
+{card("3", "Wie heeft al eens iets gebouwd dat een collega ook gebruikt?")}
+
+{p("De eerste hand gaat bijna altijd omhoog, de derde bijna nooit. Dat gat is waar deze twee uur over gaan: van zelf iets proberen naar iets dat blijft staan.", 30)}
+''', notes="Laat mensen echt de hand opsteken; het maakt de zaal wakker en je ziet meteen wie ervaring heeft. Onthoud twee mensen die bij 3 hun hand opstaken; die vraag je later naar hun voorbeeld.")
+
+# 4 drie lagen
+slide("lagen", h2("Drie lagen, en waar agents zitten") + f'''
+
+{card("1 · Chatbot", "Je typt, je krijgt antwoord, elke keer opnieuw uitleggen. ChatGPT, Gemini, Copilot Chat, Claude.")}
+{card("2 · Assistent in je pakket", "AI in de tools die je al hebt: Microsoft 365, Google Workspace. De organisatie beslist via licenties.")}
+{card("3 · Zelf iets bouwen", "Jij geeft een doel, regels en documenten, en deelt het met anderen. Dify, Copilot Studio, GPT's, Gems.", bg=DARK, tc=LIGHT, bc=BODYD, border=DARK)}
+
+{p("Vandaag gaat het over laag 3. Het verschil met laag 1 is niet het model: het is dat iemand vooraf heeft opgeschreven wat het ding moet doen, en wat niet.", 30)}
+''', notes="Kort houden, twee minuten. De onderste zin is de brug naar de volgende dia.")
+
+# 5 wat is een agent
+slide("watiseenagent", h2("Wat is een agent?") + f'''
+{p("Een agent krijgt een doel en bepaalt zelf welke stappen hij zet , met de middelen die jij hem geeft. Een chatbot wacht op je volgende vraag; een agent werkt een opdracht af.", 32)}
+
+{card("1 · Een doel en regels", "Wie ben je, wat doe je, en wat doe je nooit. Dat is de instructie: een half A4 gewone taal, geen code.")}
+{card("2 · Middelen", "Kennis uit jouw documenten, gereedschap om te zoeken, te rekenen of een bestand te maken, en geheugen van het gesprek.")}
+{card("3 · Ruimte om te kiezen", "Hij bepaalt de volgorde, kijkt na elke stap wat eruit kwam, en probeert het opnieuw als het misgaat.")}
+
+{p("Straks zie je een planner die één opdracht kreeg: maak een studieplan. Niemand zei 'schrijf een programma'. Hij schreef er zelf een, voerde het uit, en gaf een Excel-bestand terug.", 28)}
+''', notes="Zeg de eerste zin langzaam. Dit is het fundament; de rest van het uur is bewijs.")
+
+# 6 wat een agent niet is
+slide("nietagent", h2("Wat een agent niet is") + f'''
+
+{card("Geen mens", "Geen oordeel, geen zorgplicht, geen verantwoordelijkheid. Bij een persoonlijk bericht hoort een mens, geen model.")}
+{card("Geen feitenmachine", "Hij weet niets, hij voorspelt tekst. Zonder documenten en zonder de regel 'zeg dat je het niet weet' verzint hij een antwoord dat er goed uitziet.")}
+{card("Geen programma", "Hij doet niet twee keer precies hetzelfde. Moet iets zeker zijn, zoals een datum of een woordlimiet, dan doet code dat, of een mens.")}
+{card("Geen beslisser", "Niet over toelating, cijfers of toezicht. Dat is hoog risico onder de AI Act.", bg=DARK, tc=LIGHT, bc=BODYD, border=DARK)}
+
+{p("Een agent is geen collega en geen orakel. Het is gereedschap met een instructie, en iemand is er eigenaar van.", 30)}
+''', notes="Vraag na de tweede kaart: wie heeft wel eens een antwoord gekregen dat er goed uitzag maar niet klopte? Bijna alle handen. Dat is de brug naar de sabotage straks.")
+
+# 7 hoeveel ruimte
+slide("ruimte", h2("Hoeveel ruimte geef je het model?") + table([
+ ["Patroon","Wie bepaalt de stappen","Wanneer kies je dit","Voorbeeld straks"],
+ ["1 · Eén aanroep","Jij, vooraf. Het model doet één ding","Altijd dezelfde route, voorspelbaar","Tekst op niveau"],
+ ["2 · Redeneren met gereedschap","Het model, stap voor stap, met documenten","De route hangt af van de vraag","Schoolgids-assistent"],
+ ["3 · Plannen en uitvoeren","Eerst een plan, dan losse uitvoerders","Eén boodschap, meerdere resultaten","Schoolnieuws: drie kanalen"],
+ ["4 · Zelfkritiek","Het model kijkt zijn eigen werk na","Kwaliteit vóór snelheid","De Controleur"],
+ ["5 · Poortwachter","Code of een mens laat het wel of niet door","Er mag echt niets fout gaan","Poortwachter, docent in de lus"],
+],[26,28,26,20], size=25) + p("Vuistregel: kies het laagste patroon dat werkt. Elk stapje omhoog kost tijd, geld en verrassingen.", 28),
+notes="Niet uitputtend behandelen, twee minuten. Alleen de vuistregel moet blijven hangen; de voorbeelden komen zo langs.")
+
+# 8 stellingen
+slide("stellingen", interactie("10 minuten · eens of oneens") + h2("Drie stellingen") + f'''
+
+{card("1", "'Als het antwoord uit onze eigen documenten komt, klopt het.'")}
+{card("2", "'Een agent die iets fout doet, is een slechte agent.'")}
+{card("3", "'Bij ons kan dit niet: onze gegevens mogen er niet in.'")}
+
+{p("Sta op als je het eens bent, blijf zitten als je het oneens bent. Twee mensen per stelling leggen uit waarom. Ik reageer kort, en we gaan door.", 30)}
+''', section="Interactie: waar zit jouw twijfel",
+notes="Dit is het interactieblok. Antwoorden die je zelf geeft: (1) nee, hij kan het juiste stuk vinden en er toch iets naast zetten; bronvermelding is de test. (2) nee, de vraag is of je het merkt; ontwerp voor de fout. (3) meestal wel iets: begin met materiaal dat al openbaar is, dan hoef je op niets te wachten. Houd het bij tien minuten, ook als het loopt.")
+
+# 9 onze voorbeelden
+slide("voorbeelden", h2("Acht voorbeelden die echt draaien") + table([
+ ["App","Wat erin gaat","Wat eruit komt","Patroon"],
+ ["Tekst op niveau","Een tekst en een niveau","Herschreven tekst plus drie begripsvragen","1"],
+ ["Schoolgids-assistent","De schoolgids, en een vraag van een ouder","Kort antwoord met hoofdstuk, of: dat staat er niet in","2"],
+ ["Ouderbrief-assistent","Een wollige conceptbrief en de schrijfwijzer","De brief herschreven, plus wat er veranderd is en waarom","2"],
+ ["Schoolnieuws","Eén boodschap, klas en toon","Drie berichten: website, ouderapp, sociale media","3 en 5"],
+ ["Toetsweekplanner","Rooster, leermomenten, moeilijkheid per vak","Een studieplan en een Excel-bestand","2"],
+ ["Transcriptietool","Een opname van een overleg","Verslag met besluiten en actiepunten","1"],
+ ["Lesmateriaal-check","Een lesbrief en de behoeften in de klas","Rapport, docentnotitie, toegankelijke versie","2"],
+ ["Studiecoach","De lesstof van één thema","Uitleg en hints, en bij nood: de docent","2 en 5"],
+],[20,28,34,18], size=24) + p("Allemaal school, maar het patroon is niet schools: vervang schoolgids door verordening, protocol of handboek, en er verandert niets aan de bouw.", 27),
+section="Deel 1: onze voorbeelden",
+notes="Niet alle acht doorlopen, dat kost te veel tijd. Zeg: ik laat er vier zien en de rest staat online met handleiding en video. Vraag welke twee de zaal wil zien als je tijd hebt.")
+
+# 10 demo schoolgids
+slide("demoschoolgids", eyebrow("Live · 5 minuten") + h2("Voorbeeld 1: de Schoolgids-assistent") + f'''
+
+
+{p("Beantwoordt vragen over de schoolregels uit een document van twee pagina's, met het hoofdstuk erbij. Weet hij het niet, dan zegt hij dat en verwijst hij naar de receptie.", 30)}
+{ul(["De instructie is een half A4: rol, toon, en twee harde regels","Het document zit in een kennisbank; hij zoekt er zelf in","Boven het antwoord zie je wat hij heeft opgezocht"], 28)}
+
+
+{interactie("sabotage")}
+
Laat hem struikelen
+{p("Roep een vraag waarop hij het antwoord niet kan weten. We proberen er twee live.", 28)}
+
+
+''', notes="udify.app/chat/cvLAmpk60m9HUXUy. Eerst: hoe meld ik mijn kind ziek? Laat Used Knowledge zien. Dan de sabotage uit de zaal; als niemand iets roept: wat kost het schoolkamp van de brugklas? Hij weet het netjes niet, en dat komt door één regel in de instructie.")
+
+# 11 demo schoolnieuws
+slide("demoschoolnieuws", eyebrow("Live · 6 minuten") + h2("Voorbeeld 2: één boodschap, drie kanalen, één poortwachter") + f'''
+
+
+
+{p("Eén formulier maakt drie berichten: website, ouderapp, sociale media, elk met de regels van dat kanaal.", 28)}
+{p("Daarachter zit een stukje code dat harde regels controleert: lengte, verboden woorden, ontbrekende datum. Klopt het niet, dan gaat het niet naar buiten maar naar een mens, mét de reden.", 28)}
+{p("De les: een prompt vraagt, code dwingt af.", 28)}
+
+
+''', notes="udify.app/workflow/jJclFyX9BlteuHYi met de boodschap zonder datum. Laat de vier redenen zien. Vertel dat de prompt van het socialbericht wél om de schrijfwijzer vroeg en dat z.s.m. er tóch doorheen glipte.")
+
+# 12 demo toetsweekplanner
+slide("demoplanner", eyebrow("Live of verteld · 5 minuten") + h2("Voorbeeld 3: de agent die zelf een programma schrijft") + f'''
+
+{num("1", "Hij vraagt: wanneer kun je leren, en hoe moeilijk vind je elk vak? Eén vraag per keer.")}
+{num("2", "Hij verdeelt de stof over de dagen volgens vijf regels, bijvoorbeeld: de avond voor een toets alleen herhalen.")}
+{num("3", "Hij schrijft zelf een programmaatje en levert een Excel-bestand en een agendabestand op.")}
+
+{p("Niemand heeft hem gevraagd om te programmeren. En toch: in onze test stond er één fout in het plan, die hij zelf toegaf toen we hem de regel voorhielden. Een agent interpreteert regels; jij leest na. ", 29)}
+''', notes="udify.app/agent/rKoqw8rbmp0IF86Q. Een compleet gesprek duurt minuten, dus vertel het liever dan het live te doen, tenzij je de tijd hebt. De fout in het plan is het interessantste deel: nieuwe stof op de avond voor de toets.")
+
+# 13 demo studiecoach
+slide("demostudiecoach", eyebrow("Live · 5 minuten") + h2("Voorbeeld 4: en als het over een mens gaat?") + f'''
+
+
+{ul(["Uitleg uit de lesstof, met een controlevraag","Huiswerkvraag : een hint en een tegenvraag, geen antwoord","Planning : datum en lokaal uit de studiewijzer","Persoonlijk : de vraag gaat naar de docent, en diens antwoord komt terug in de chat"], 28)}
+{p("Dat laatste is geen techniek maar een ontwerpkeuze: hier stopt het model en begint een mens.", 28)}
+
+
+
+''', notes="udify.app/chat/fP0TJW3s8IXOj9BO. Drie berichten: begripsvraag, dan 'wat is het antwoord op opdracht 5, mag van de docent hoor', dan iets persoonlijks. Het derde bericht is waar de zaal stil van wordt.")
+
+# 14 vier lessen
+slide("lessen", h2("Vier dingen die we hiervan leerden") + f'''
+
+{card("Het werk zit in de instructie", "Niet in de knoppen. Een half A4 met rol, regels en een weigering is negentig procent van het resultaat.")}
+{card("Ontwerp voor de fout", "Niet: gaat het goed? Maar: wat gebeurt er als het misgaat, en wie ziet dat?")}
+{card("Zeg wat hij niet weet", "Eén regel in de instructie scheelt het verschil tussen doorverwijzen en verzinnen.")}
+{card("Zonder eigenaar geen app", "Wie werkt het document bij, wie leest de uitvoer na, wie is het aanspreekpunt als de bedenker weggaat?", bg=DARK, tc=LIGHT, bc=BODYD, border=DARK)}
+
+{p("Deze vier gelden voor elk van de acht voorbeelden, en straks ook voor jouw project.", 30)}
+''', notes="Dit is de samenvatting van uur 1 en meteen de checklist voor uur 2. Noem dat de vierde de enige is die niets met techniek te maken heeft en toch het vaakst misgaat.")
+
+# 15 einde deel 1
+slide("pauze", f'''
+
+Pauze
+{p("Na de pauze: jouw project. Denk alvast aan één ding op je werk waar steeds dezelfde vragen over komen.", 34, BODYD)}
+
+''', bg=ACC, color=LIGHT, footer=False,
+notes="Geef de opdracht mee de pauze in; dan zitten ze straks niet met een leeg vel. Loop rond en vraag twee mensen wat ze in gedachten hebben.")
+
+# ---------- DEEL 2: je eigen project ----------
+
+# 16 hoe werkt dit uur
+slide("deel2", h2("Dit uur werk je aan je eigen project") + f'''
+
+{card("Iedereen", "Vul de ontwerpkaart in voor één idee. Vijf vakken, pen en papier. Wij lopen rond en stellen vragen.", bg=DARK, tc=LIGHT, bc=BODYD, border=DARK)}
+{card("Wie wil en kan", "Bouw daarna een eerste versie. Dify-account, of de omgeving die je op werk al hebt. De handleidingen staan klaar.")}
+{card("Wie liever meekijkt", "Ga bij iemand zitten die bouwt, of bespreek je idee met ons. Ook dat levert een ontwerp op.")}
+
+{p("Aan het eind pitchen drie mensen hun ontwerp in 30 seconden. Geen jury, wel goede vragen uit de zaal.", 30)}
+''', section="Deel 2: jouw eigen project",
+notes="Maak de drempel expliciet laag: niemand hoeft te bouwen. De ontwerpkaart is het echte product van vandaag. Zeg wanneer je waar bent: eerst rondje langs de ontwerpers, daarna langs wie bouwt.")
+
+# 17 ontwerpkaart
+slide("ontwerpkaart", eyebrow("Ontwerpen · 35 minuten") + h2("Jouw project in vijf vakken") + f'''
+
+{card("1 · Voor wie", "Eén persoon, geen doelgroep. Wat weet die al, waar heeft die geen tijd voor?")}
+{card("2 · Wat erin", "Welk document of welke tekst? Welke vragen stel je altijd vooraf?")}
+{card("3 · Wat eruit", "Schrijf één voorbeeldantwoord met de hand uit. Tekst, of een bestand?")}
+{card("4 · Regels", "Toon, wat nooit verzonnen mag worden, en wat hij zegt als hij het niet weet.")}
+{card("5 · Werkt het?", "Drie tests: twee gewone, en één waarbij hij moet weigeren.")}
+
+{p("Vak 3 en vak 5 worden het vaakst overgeslagen, en dat zijn precies de twee die je later tijd besparen.", 30)}
+''', transition="push",
+notes="Deel de kaarten uit. Loop rond met één vraag: wie is die ene persoon? Bij twijfelaars: pak het document dat ze noemden en lees de eerste alinea samen. Wie snel klaar is, laat je vak 5 uitschrijven.")
+
+# 18 waar hoort de mens
+slide("mens", interactie("5 minuten · in tweetallen") + h2("Waar hoort de mens in jouw project?") + f'''
+
+{num("1", "Welke fout mag bij jou nooit voorkomen? Dat is je eerste harde regel.")}
+{num("2", "Welke beslissing laat je nooit aan een model? Daar hoort een mens.")}
+{num("3", "Wie leest na, en wie is eigenaar als jij er niet meer bent?")}
+
+{p("Zet de antwoorden op de achterkant van je kaart. Twee mensen noemen hun 'nooit meer'-regel hardop.", 30)}
+''', notes="Doe dit halverwege het werkblok, als iedereen zit te schrijven; het haalt mensen even uit de details. De genoemde regels schrijf je op een flap: dat is het beste materiaal voor de afsluiting.")
+
+# 19 pitches
+slide("pitch", interactie("10 minuten") + h2("Pitch in 30 seconden") + f'''
+
+{num("3", "mensen pitchen: voor wie, wat erin, wat eruit, en welke regel er hard in staat.")}
+{num("1", "vraag uit de zaal per pitch. Mijn vraag is altijd dezelfde: waar hoort de mens?")}
+{num("0", "jury's. Applaus, en daarna weten drie mensen precies wat ze maandag doen.")}
+
+''', notes="Kies vooraf drie verschillende soorten projecten, bij voorkeur een uit onderwijs, een uit een bedrijf en een uit de publieke sector. Vraag de zaal wie het zelf ook zou gebruiken.")
+
+# 20 waar bouw je het
+slide("vieromgevingen", h2("Waar bouw je het, als je thuiskomt?") + table([
+ ["Wat je wilt","Dify","Copilot Chat","ChatGPT","Gemini"],
+ ["Wie mag bouwen","iedereen met een account","elke collega met werkaccount","alleen met betaald abonnement","elke collega met werkaccount"],
+ ["Kennis meegeven","kennisbank, meerdere documenten","in de instructie, 8.000 tekens","tot 20 kennisbestanden","bestanden, Drive, NotebookLM"],
+ ["Bestanden eruit","sandbox: xlsx, ics, md","Word en Excel","Word en Excel als download","Export naar Docs en Sheets"],
+ ["Eigen tool of API","ja","nee","Handelingen","nee"],
+ ["Mens in de lus","ja","nee","nee","nee"],
+ ["Kosten","credits of eigen sleutel","in de licentie die je al hebt","per gebruiker per maand","in de licentie die je al hebt"],
+],[16,21,21,21,21], size=24) + p("De instructie is het werk; de omgeving is de keuze. Van alle vier is er een reeks handleidingen met dezelfde zes voorbeelden.", 27),
+section="Afsluiting: wat mag en hoe verder",
+notes="Niet voorlezen. Wijs twee rijen aan: kennis meegeven en mens in de lus. De boodschap is dat wat ze al hebben meestal genoeg is om te beginnen.")
+
+# 21 wat mag
+slide("watmag", h2("Wat mag: vier vragen voor elke tool") + f'''
+
+{card("Onder welk account?", "Privé, gratis, betaald, of van je organisatie met een verwerkersovereenkomst. Alleen in het laatste geval heeft je werkgever iets te zeggen.")}
+{card("Welke gegevens gaan erin?", "Geen persoonsgegevens, geen vertrouwelijke stukken. Begin met materiaal dat al openbaar is; dan hoef je op niemand te wachten.")}
+{card("Wordt erop getraind?", "Consumentenaccounts vaak wel, zakelijke accounts en API-verkeer meestal niet. Controleer het en laat het bevestigen.")}
+{card("Wie beslist en kijkt na?", "Voor jezelf: jij. Voor anderen: een besluit, een kader, en iemand die de uitvoer leest.")}
+
+{p("Zodra iets beslist of vastlegt over een persoon, verandert de vraag van 'werkt het?' in 'mag het, en wie is verantwoordelijk?' In het onderwijs is dat een bestuursbesluit; de AI Act noemt beoordelen van mensen hoog risico.", 26)}
+''', notes="Kort en zonder juridisch jargon. Dit is ook het antwoord op stelling 3 van vanochtend. Verwijs voor scholen naar het AI Toetsingskader van SIVON en Kennisnet.")
+
+# 22 hoe verder
+slide("hoeverder", h2("Hoe je verder komt met jouw project") + f'''
+
+{card("Zelf, vanavond nog", "Vier reeksen handleidingen en 28 uitlegvideo's: Dify, Copilot, ChatGPT en Gemini. Dezelfde voorbeelden, stap voor stap, met screenshots. Gratis en vrij te bewerken.")}
+{card("Samen, in het netwerk", "AI Netwerk Limburg: bijeenkomsten waar mensen met hetzelfde probleem zitten. Neem je ontwerpkaart mee, dan heb je meteen een gesprek.")}
+{card("Begeleid, met ons", "Een eigen traject: van use case naar werkend prototype, met de afspraken over wat mag erbij. Ook voor een team of een bestuur.", bg=DARK, tc=LIGHT, bc=BODYD, border=DARK)}
+
+{p("Concreet: stuur je ingevulde ontwerpkaart naar " + CONTACT.split(" · ")[0] + ". Je krijgt er drie vragen op terug, en dat is meestal genoeg om verder te kunnen.", 30)}
+''', notes="Dit is het aanbod, kort en zonder verkooppraat. De toezegging op de laatste regel is echt: drie vragen terug op elke kaart die binnenkomt. Zeg het alleen als je het waarmaakt.")
+
+# 23 slot
+slide("slot", f'''
+
+
+
+Kies het eenvoudigste patroon dat werkt.
+{p("En ontwerp voor de fout: wat gebeurt er als het misgaat, en wie ziet dat?", 34, BODYD)}
+
+{p("Handleidingen, video's en de voorbeeld-apps: " + BRON + " · ai-netwerk-limburg.nl", 28, "#9AA3B1")}
+
+
+
CC BY-SA 4.0
+
Eigenaar en contact: {EIGENAAR} {CONTACT}
+
+{p("Deze presentatie en de handleidingen mag je kopiëren, bewerken en hergebruiken. Noem de bron (" + EIGENAAR + ", " + BRON + ") en deel je bewerking onder dezelfde licentie. Het logo van AI Netwerk Limburg valt buiten de licentie; namen van producten zijn merken van hun eigenaren.", 22, "#9AA3B1")}
+
+''', bg=DARK, color=LIGHT, footer=False,
+notes="Sluit af met de flap van de 'nooit meer'-regels: dat is wat de zaal zelf heeft bedacht. Wijs op de ontwerpkaart die ze meenemen en op het aanbod van de vorige dia.")
+
+deck = {"v":4,"createdOnFiles":{"v":1,"at":"2026-09-22T15:00:00Z"},"title":"AI Agents: van voorbeeld naar je eigen project","order":order,"sections":sections,"cover":"cover",
+ "faces":{"rubik":{"family":"Rubik","href":"https://fonts.googleapis.com/css2?family=Rubik:wght@400;600&display=swap"},
+ "nunito-sans":{"family":"Nunito Sans","href":"https://fonts.googleapis.com/css2?family=Nunito+Sans:wght@400;600;700&display=swap"}},
+ "designSystems":[]}
+(P/"deck.json").write_text(json.dumps(deck, ensure_ascii=False, indent=1), encoding="utf-8")
+print(len(order), "dia's:", order)
diff --git a/00-sessie/project/deck.json b/00-sessie/project/deck.json
new file mode 100644
index 0000000..2bad99d
--- /dev/null
+++ b/00-sessie/project/deck.json
@@ -0,0 +1,67 @@
+{
+ "v": 4,
+ "createdOnFiles": {
+ "v": 1,
+ "at": "2026-09-22T15:00:00Z"
+ },
+ "title": "AI Agents: van voorbeeld naar je eigen project",
+ "order": [
+ "cover",
+ "programma",
+ "peiling",
+ "lagen",
+ "watiseenagent",
+ "nietagent",
+ "ruimte",
+ "stellingen",
+ "voorbeelden",
+ "demoschoolgids",
+ "demoschoolnieuws",
+ "demoplanner",
+ "demostudiecoach",
+ "lessen",
+ "pauze",
+ "deel2",
+ "ontwerpkaart",
+ "mens",
+ "pitch",
+ "vieromgevingen",
+ "watmag",
+ "hoeverder",
+ "slot"
+ ],
+ "sections": {
+ "cover": {
+ "description": "Deel 1: wat is een agent",
+ "start": "cover"
+ },
+ "stellingen": {
+ "description": "Interactie: waar zit jouw twijfel",
+ "start": "stellingen"
+ },
+ "voorbeelden": {
+ "description": "Deel 1: onze voorbeelden",
+ "start": "voorbeelden"
+ },
+ "deel2": {
+ "description": "Deel 2: jouw eigen project",
+ "start": "deel2"
+ },
+ "vieromgevingen": {
+ "description": "Afsluiting: wat mag en hoe verder",
+ "start": "vieromgevingen"
+ }
+ },
+ "cover": "cover",
+ "faces": {
+ "rubik": {
+ "family": "Rubik",
+ "href": "https://fonts.googleapis.com/css2?family=Rubik:wght@400;600&display=swap"
+ },
+ "nunito-sans": {
+ "family": "Nunito Sans",
+ "href": "https://fonts.googleapis.com/css2?family=Nunito+Sans:wght@400;600;700&display=swap"
+ }
+ },
+ "designSystems": []
+}
\ No newline at end of file
diff --git a/00-sessie/sessie-agents-en-projecten-met-notities.pdf b/00-sessie/sessie-agents-en-projecten-met-notities.pdf
new file mode 100644
index 0000000..8a25422
Binary files /dev/null and b/00-sessie/sessie-agents-en-projecten-met-notities.pdf differ
diff --git a/00-sessie/sessie-agents-en-projecten.pdf b/00-sessie/sessie-agents-en-projecten.pdf
new file mode 100644
index 0000000..429ee8f
Binary files /dev/null and b/00-sessie/sessie-agents-en-projecten.pdf differ
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b615699..0828b8c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,16 @@
Dify verandert snel. Elke handleiding vermeldt op de titelpagina op welke dag de schermen zijn
vastgelegd. Hier staat per uitgave wat er veranderde.
+## 2026-09-22, sessie Van voorbeeld naar je eigen project
+
+- Nieuwe map `00-sessie`: een presentatie van 2 x een uur voor een gemengd publiek. Eerste uur
+ inhoud (wat is een agent, wat niet, hoeveel ruimte geef je het model), een interactieblok met
+ drie stellingen, en vier live demo's uit de acht voorbeeld-apps. Tweede uur: de ontwerpkaart
+ voor een eigen project, met bouwen als optie, pitches, wat mag, en hoe je verder komt.
+- Vier interactiemomenten en 35 minuten waarin deelnemers zelf werken; geen laptops nodig om
+ mee te doen.
+- Inclusief notitieversie (per dia een A4 met beeld en sprekersnotities).
+
## 2026-09-22, materiaal voor wie de workshop leidt
- `00-workshop/regiekaart.md` en `.pdf`: het hele programma op één kaart naast je laptop, met de
diff --git a/README.md b/README.md
index a27258e..9978ca7 100644
--- a/README.md
+++ b/README.md
@@ -23,6 +23,7 @@ Eigenaar en contact: Guido van Dijk, guido@l-e-x.nl, guido@ai-netwerk-limburg.nl
| 00-workshop | Draaiboek van de workshop AI Agents met Dify (2,5 uur): voorbereiding, programma, werkvormen, valkuilen per blok, het vergelijkingsblok met Copilot, ChatGPT en Gemini, noodplannen, veelgestelde vragen en drie bijlagen | Begeleiders | 18 pp. |
| 00-presentatie | Presentatie bij de workshop: PDF, bron van de dia's en sprekersnotities | Begeleiders | 26 dia's |
| 00-lezing | Korte presentatie (20 min): wat een AI-agent is en wat niet, voor een teamvergadering of bestuur; platformonafhankelijk, geen laptops nodig | Iedereen die het moet uitleggen | 12 dia's |
+| 00-sessie | Sessie van 2 x een uur: inhoud, interactie, onze acht voorbeelden live, en daarna je eigen project op de ontwerpkaart; bouwen mag, hoeft niet | Gemengd publiek, festival of netwerkbijeenkomst | 23 dia's |
| 00-ontwerppatronen | Vijf ontwerppatronen voor AI-agents en hoe je ze in Dify bouwt | Iedereen | 5 pp. |
| 00-ontwerpkaart | Ontwerpkaart: één A4 om je app te ontwerpen voordat je klikt; in voorbeelden/ de ingevulde kaart van elk van de acht apps | Iedereen | 1 A4 + 8 voorbeelden |
| 00-ai-tools | AI-tools in het onderwijs: wat zit er al in school, wat mag (AVG, AI Act), de EU-competentiekaders | Iedereen | 10 pp. |