# Intent Overzicht — Cortex **Versie:** v1.0 **Datum:** 4 februari 2026 **Doelgroep:** Product owners, IT consultants, data scientists --- ## 1. Wat is een Intent? Een **intent** is de gedetecteerde bedoeling achter een gebruikerscommando. Wanneer een zorgmedewerker zegt "zoek jan", herkent Cortex de intent `zoeken` met de entity `patientName: "jan"`. **Voorbeeld flow:** ``` Gebruikersinvoer → Intent → Actie ──────────────────────────────────────────────────────── "notitie jan" → dagnotitie → Open notitie-formulier "wat zijn risico's" → risico_query → Toon risico-overzicht "agenda vandaag" → agenda_query → Toon afspraken ``` --- ## 2. Alle Intents in Kaart ### 2.1 Basis Intents (Productie) | Intent | Trigger voorbeelden | Wat het doet | Block | |--------|---------------------|--------------|-------| | `dagnotitie` | "notitie jan", "medicatie gegeven" | Verpleegkundige notitie maken | DagnotitieBlock | | `zoeken` | "zoek marie", "wie is jan" | Patiënt opzoeken | ZoekenBlock | | `overdracht` | "overdracht", "einde dienst" | Shift-overdracht bekijken | OverdrachtBlock | ### 2.2 Agenda Intents (Productie) | Intent | Trigger voorbeelden | Wat het doet | Block | |--------|---------------------|--------------|-------| | `agenda_query` | "agenda", "afspraken vandaag" | Afspraken bekijken | AgendaBlock | | `create_appointment` | "plan afspraak jan morgen" | Nieuwe afspraak maken | CreateAppointmentBlock | | `cancel_appointment` | "annuleer afspraak jan" | Afspraak annuleren | CancelAppointmentBlock | | `reschedule_appointment` | "verzet 14:00 naar 15:00" | Afspraak verzetten | RescheduleAppointmentBlock | ### 2.3 Intake Intents (MVP) | Intent | Trigger voorbeelden | Wat het doet | Block | |--------|---------------------|--------------|-------| | `intake_status` | "wat moet ik nog doen?", "intake checklist" | Intake voortgang tonen | IntakeStatusBlock | | `risico_query` | "wat zijn de risico's?", "risicotaxatie" | Risico's weergeven | RisicoBlock | | `diagnose_query` | "welke diagnoses?", "toon diagnose" | Diagnoses weergeven | DiagnoseBlock | | `intake_navigeer` | "ga naar risico", "open anamnese" | Naar intake-sectie navigeren | *(geen block, directe navigatie)* | ### 2.4 Speciale Intents | Intent | Wanneer | Wat het doet | |--------|---------|--------------| | `unknown` | Niet herkend | Toon fallback-keuzemenu | --- ## 3. Anatomie van een Intent Elke intent heeft meerdere "aanraakpunten" in de codebase: ``` ┌─────────────────────────────────────────────────────────────────────┐ │ INTENT LEVENSCYCLUS │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ 1. TYPES lib/cortex/types.ts │ │ └── Intent naam in CortexIntent type │ │ └── Block config in BLOCK_CONFIGS │ │ └── Entities in ExtractedEntities │ │ │ │ 2. HERKENNING lib/cortex/reflex-classifier.ts │ │ └── Regex patterns voor lokale classificatie │ │ │ │ 3. AI PROMPT app/api/cortex/chat/route.ts │ │ └── Intent beschrijving in system prompt │ │ └── Voorbeelden met JSON output │ │ │ │ 4. VALIDATIE lib/cortex/action-parser.ts │ │ └── Zod schema voor intent validatie │ │ └── Artifact type mapping │ │ │ │ 5. ROUTING lib/cortex/action-parser.ts │ │ └── routeIntentToArtifact() switch case │ │ │ │ 6. UI BLOCK components/cortex/blocks/[intent]-block.tsx │ │ └── React component voor weergave │ │ │ │ 7. RENDERING components/cortex/artifacts/artifact- │ │ container.tsx │ │ └── Import statement │ │ └── Switch case in renderArtifactBlock() │ │ └── Titel in getArtifactTitle() │ │ │ │ 8. API (optioneel) app/api/cortex/[domain]/route.ts │ │ └── Endpoint voor data ophalen │ │ │ └─────────────────────────────────────────────────────────────────────┘ ``` --- ## 4. Bestandsoverzicht per Intent ### 4.1 `dagnotitie` | Aspect | Bestand | Regel/Sectie | |--------|---------|--------------| | Type definitie | `lib/cortex/types.ts` | `CortexIntent` type | | Block config | `lib/cortex/types.ts` | `BLOCK_CONFIGS.dagnotitie` | | Patterns | `lib/cortex/reflex-classifier.ts` | `INTENT_PATTERNS.dagnotitie` | | AI prompt | `app/api/cortex/chat/route.ts` | System prompt sectie | | Validatie | `lib/cortex/action-parser.ts` | `ActionSchema` | | Routing | `lib/cortex/action-parser.ts` | `routeIntentToArtifact()` case | | UI Block | `components/cortex/blocks/dagnotitie-block.tsx` | Hele bestand | | Rendering | `components/cortex/artifacts/artifact-container.tsx` | Import + switch | | API | `app/api/reports/route.ts` | POST voor opslaan | **Entities:** ```typescript { patientName?: string; // "jan" patientId?: string; // UUID category?: 'medicatie' | 'adl' | 'gedrag' | 'incident' | 'observatie'; content?: string; // "medicatie gegeven" } ``` --- ### 4.2 `zoeken` | Aspect | Bestand | |--------|---------| | Type definitie | `lib/cortex/types.ts` | | Block config | `lib/cortex/types.ts` | | Patterns | `lib/cortex/reflex-classifier.ts` | | UI Block | `components/cortex/blocks/zoeken-block.tsx` | | API | `app/api/cortex/patients/search/route.ts` | **Entities:** ```typescript { query?: string; // Zoekterm patientName?: string; // Directe naam } ``` --- ### 4.3 `overdracht` | Aspect | Bestand | |--------|---------| | Type definitie | `lib/cortex/types.ts` | | Block config | `lib/cortex/types.ts` | | Patterns | `lib/cortex/reflex-classifier.ts` | | UI Block | `components/cortex/blocks/overdracht-block.tsx` | | API | `app/api/overdracht/route.ts` | **Entities:** ```typescript { // Geen specifieke entities } ``` --- ### 4.4 `agenda_query` | Aspect | Bestand | |--------|---------| | Type definitie | `lib/cortex/types.ts` | | Block config | `lib/cortex/types.ts` | | Patterns | `lib/cortex/reflex-classifier.ts` | | UI Block | `components/cortex/blocks/agenda-block.tsx` | | API | `app/api/cortex/agenda/route.ts` | **Entities:** ```typescript { dateRange?: { start: Date; end: Date; label: 'vandaag' | 'morgen' | 'deze week' | 'volgende week' | 'custom'; }; } ``` --- ### 4.5 `create_appointment` | Aspect | Bestand | |--------|---------| | Type definitie | `lib/cortex/types.ts` | | Block config | `lib/cortex/types.ts` | | Patterns | `lib/cortex/reflex-classifier.ts` | | UI Block | `components/cortex/blocks/agenda-block.tsx` (create mode) | | API | `app/api/cortex/agenda/create/route.ts` | **Entities:** ```typescript { patientName?: string; patientId?: string; datetime?: { date: Date; time: string; // "HH:mm" }; appointmentType?: 'intake' | 'behandeling' | 'follow-up' | 'telefonisch' | 'huisbezoek' | 'online' | 'crisis' | 'overig'; location?: 'praktijk' | 'online' | 'thuis'; } ``` --- ### 4.6 `intake_status` (MVP) | Aspect | Bestand | |--------|---------| | Type definitie | `lib/cortex/types.ts` | | Block config | `lib/cortex/types.ts` | | Patterns | `lib/cortex/reflex-classifier.ts` | | UI Block | `components/cortex/blocks/intake-status-block.tsx` | | API | `app/api/cortex/intake/status/route.ts` | **Entities:** ```typescript { patientId?: string; intakeId?: string; } ``` **Trigger patterns:** - "wat moet ik nog doen?" - "is de intake compleet?" - "intake checklist" - "intake status" --- ### 4.7 `risico_query` (MVP) | Aspect | Bestand | |--------|---------| | Type definitie | `lib/cortex/types.ts` | | Block config | `lib/cortex/types.ts` | | Patterns | `lib/cortex/reflex-classifier.ts` | | UI Block | `components/cortex/blocks/risico-block.tsx` | | API | `app/api/cortex/intake/risico/route.ts` | **Entities:** ```typescript { patientId?: string; intakeId?: string; } ``` **Trigger patterns:** - "wat zijn de risico's?" - "risicotaxatie" - "toon risico's" --- ### 4.8 `diagnose_query` (MVP) | Aspect | Bestand | |--------|---------| | Type definitie | `lib/cortex/types.ts` | | Block config | `lib/cortex/types.ts` | | Patterns | `lib/cortex/reflex-classifier.ts` | | UI Block | `components/cortex/blocks/diagnose-block.tsx` | | API | `app/api/cortex/intake/diagnose/route.ts` | **Entities:** ```typescript { patientId?: string; intakeId?: string; } ``` **Trigger patterns:** - "welke diagnoses?" - "toon diagnose" - "wat is de diagnose?" --- ### 4.9 `intake_navigeer` (MVP) | Aspect | Bestand | |--------|---------| | Type definitie | `lib/cortex/types.ts` | | Patterns | `lib/cortex/reflex-classifier.ts` | | Handler | `components/cortex/command-center/command-center.tsx` | **Let op:** Deze intent heeft geen block — het navigeert direct naar een EPD-pagina. **Entities:** ```typescript { navigationTarget?: 'contacts' | 'kindcheck' | 'risk' | 'anamnese' | 'examination' | 'rom' | 'diagnosis' | 'behandeladvies'; } ``` **Trigger patterns:** - "ga naar risico" - "open diagnose" - "naar anamnese" --- ## 5. Data Flow Diagram ### 5.1 Van Invoer naar Actie ``` ┌──────────────┐ │ GEBRUIKER │ │ spreekt/ │ │ typt │ └──────┬───────┘ │ "notitie jan medicatie" ▼ ┌──────────────────────────────────────────────────────────────┐ │ LAAG 1: REFLEX ARC │ │ lib/cortex/reflex-classifier.ts │ │ │ │ • Pattern matching: /^notitie\s+\w+/i │ │ • Confidence: 0.95 │ │ • Escalatie check: geen multi-intent, geen context nodig │ │ │ │ Output: { intent: "dagnotitie", confidence: 0.95 } │ └──────────────────────────┬───────────────────────────────────┘ │ ┌────────────────┴────────────────┐ │ Confidence >= 0.7? │ └────────────────┬────────────────┘ │ Ja ▼ ┌──────────────────────────────────────────────────────────────┐ │ ROUTING │ │ lib/cortex/action-parser.ts → routeIntentToArtifact() │ │ │ │ Input: intent="dagnotitie", entities={patientName:"jan"} │ │ Output: { type: "dagnotitie", prefill: {...}, title: "..." } │ └──────────────────────────┬───────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────┐ │ UI RENDERING │ │ components/cortex/artifacts/artifact-container.tsx │ │ │ │ • Switch op artifact.type │ │ • Rendert │ └──────────────────────────┬───────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────┐ │ BLOCK │ │ components/cortex/blocks/dagnotitie-block.tsx │ │ │ │ • Toont formulier met prefilled data │ │ • Gebruiker vult aan en klikt "Opslaan" │ │ • POST naar /api/reports │ └──────────────────────────────────────────────────────────────┘ ``` ### 5.2 Escalatie naar AI (Laag 2) Wanneer escaleert de Reflex Arc naar de AI Orchestrator? | Trigger | Voorbeeld | Reden | |---------|-----------|-------| | **Lage confidence** | "blah blah" | Geen pattern match | | **Ambiguïteit** | "jan" | Kan zoeken of notitie zijn | | **Multi-intent** | "zeg jan af en maak notitie" | Twee acties in één zin | | **Context nodig** | "maak notitie voor hem" | Wie is "hem"? | | **Relatieve tijd** | "morgen om 14:00" | Datum moet berekend worden | ``` ┌──────────────────────────────────────────────────────────────┐ │ LAAG 2: ORCHESTRATOR (bij escalatie) │ │ app/api/cortex/chat/route.ts │ │ │ │ • Stuurt context + input naar Claude AI │ │ • AI retourneert IntentChain met 1+ actions │ │ • Kan clarification vragen ("Met welke patiënt?") │ └──────────────────────────────────────────────────────────────┘ ``` --- ## 6. Entity Extractie ### 6.1 Hoe worden entities geëxtraheerd? **Lokaal (Reflex Arc):** - Eenvoudige regex voor bekende patronen - Voorbeeld: `/^notitie\s+(\w+)/` → extraheert patiëntnaam **AI (Orchestrator):** - Claude analyseert volledige zin - Extraheert alle relevante entities - Kan context gebruiken (actieve patiënt, agenda) ### 6.2 Entity Types | Entity | Type | Voorbeeld | Gebruikt door | |--------|------|-----------|---------------| | `patientName` | string | "jan de vries" | Alle intents | | `patientId` | UUID | "abc-123..." | Alle intents | | `category` | enum | "medicatie" | dagnotitie | | `content` | string | "medicatie gegeven" | dagnotitie | | `query` | string | "jan" | zoeken | | `dateRange` | object | { start, end, label } | agenda_query | | `datetime` | object | { date, time } | create_appointment | | `appointmentType` | enum | "intake" | create_appointment | | `location` | enum | "praktijk" | create_appointment | | `navigationTarget` | enum | "risk" | intake_navigeer | --- ## 7. Block Types ### 7.1 Block Categorieën | Type | Doel | Voorbeeld | |------|------|-----------| | **Query Block** | Data tonen (read-only) | RisicoBlock, DiagnoseBlock | | **Action Block** | Data invoeren/wijzigen | DagnotitieBlock | | **Status Block** | Voortgang/checklist tonen | IntakeStatusBlock | | **Navigation Block** | Direct navigeren | *(intake_navigeer)* | ### 7.2 Block Structuur Alle blocks volgen hetzelfde patroon: ``` ┌─────────────────────────────────────────────────────┐ │ [Icon] Titel [Sluiten] │ ├─────────────────────────────────────────────────────┤ │ │ │ Loading state → Error state → Data state │ │ (spinner) (foutmelding) (content) │ │ │ │ ─────────────────────────────────────────────── │ │ [Secundaire actie] [Primaire actie] │ └─────────────────────────────────────────────────────┘ ``` --- ## 8. Confidence & Escalatie ### 8.1 Drempelwaarden | Waarde | Betekenis | Actie | |--------|-----------|-------| | `>= 0.9` | Zeer zeker | Direct uitvoeren | | `0.7 - 0.9` | Redelijk zeker | Uitvoeren met bevestiging | | `< 0.7` | Onzeker | Escaleer naar AI of vraag verduidelijking | ### 8.2 Escalatie Redenen ```typescript type EscalationReason = | 'low_confidence' // Confidence < 0.7 | 'ambiguous' // Top-2 intents liggen dicht bij elkaar | 'multi_intent_detected' // Meerdere acties gedetecteerd | 'needs_context' // Voornaamwoorden zoals "hij", "haar" | 'relative_time'; // "morgen", "volgende week" ``` --- ## 9. Gerelateerde Documentatie | Document | Locatie | Inhoud | |----------|---------|--------| | Block Template Pattern | `docs/intent/intake-intent-proces/block-template-pattern.md` | Technisch patroon voor blocks | | Session Log | `docs/intent/intake-intent-proces/session-log-2026-02-03.md` | Bug fixes en lessons learned | | Implementatieplan | `docs/architectuur/implementatieplan-nieuwe-intents.md` | Stappenplan nieuwe intents | --- ## 10. Glossary | Term | Betekenis | |------|-----------| | **Intent** | Gedetecteerde bedoeling achter een commando | | **Entity** | Geëxtraheerd gegeven uit de invoer (naam, datum, etc.) | | **Block** | UI component dat een intent visueel afhandelt | | **Artifact** | Container voor blocks in het werkgebied | | **Confidence** | Zekerheidsgraad van classificatie (0-1) | | **Escalatie** | Doorverwijzing naar AI voor complexe invoer | | **Prefill** | Vooringevulde data in een formulier | --- *Voor het toevoegen van nieuwe intents, zie: `implementatieplan-nieuwe-intents.md`*