feat: add AI docs assistant knowledge base (E0, E1)

- Add 6 FAQ markdown files for clientbeheer, intake, screening,
  behandelplan, spraak, and inloggen
- Add 2 guidelines files for interface and technical documentation
- Implement CategoryDetector for keyword-based category detection
- Implement KnowledgeLoader for loading relevant knowledge files
- Implement PromptBuilder for combining base prompt with knowledge

Part of AI Documentatie Assistent feature (Epic 0 & Epic 1)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
colinislit
2025-12-01 15:28:09 +01:00
parent 94978e7bf8
commit 651ff94fc8
11 changed files with 963 additions and 0 deletions

View File

@@ -0,0 +1,70 @@
/**
* CategoryDetector - Analyseert gebruikersvragen en bepaalt relevante knowledge categorieën
*
* Onderdeel van de AI Documentatie Assistent (E1.S1)
*/
/**
* Alle beschikbare knowledge categorieën
*/
export const KNOWLEDGE_CATEGORIES = [
'clientbeheer',
'intake',
'screening',
'behandelplan',
'spraak',
'inloggen',
'interface',
'technisch',
] as const;
export type KnowledgeCategory = (typeof KNOWLEDGE_CATEGORIES)[number];
/**
* Keyword mapping per categorie voor vraagdetectie
*/
const CATEGORY_KEYWORDS: Record<KnowledgeCategory, string[]> = {
clientbeheer: [
'cliënt',
'client',
'patient',
'patiënt',
'aanmaken',
'zoeken',
'dossier',
],
intake: ['intake', 'gesprek', 'notitie', 'verslag'],
screening: ['screening', 'vragenlijst', 'score', 'resultaat'],
behandelplan: ['behandelplan', 'doel', 'interventie', 'plan'],
spraak: ['spraak', 'microfoon', 'dicteren', 'stem', 'transcriptie'],
inloggen: ['inloggen', 'wachtwoord', 'login', 'account'],
interface: ['menu', 'knop', 'scherm', 'navigatie', 'waar vind'],
technisch: ['api', 'fhir', 'endpoint', 'database', 'developer'],
};
/**
* Detecteert relevante knowledge categorieën op basis van een gebruikersvraag
*
* @param question - De vraag van de gebruiker
* @returns Array van gedetecteerde categorieën (kan leeg zijn)
*
* @example
* detectCategories("Hoe maak ik een intake aan?")
* // Returns: ['intake']
*
* @example
* detectCategories("Waar vind ik de cliënt gegevens?")
* // Returns: ['clientbeheer', 'interface']
*/
export function detectCategories(question: string): KnowledgeCategory[] {
const normalized = question.toLowerCase();
const detected: KnowledgeCategory[] = [];
for (const [category, keywords] of Object.entries(CATEGORY_KEYWORDS)) {
if (keywords.some((keyword) => normalized.includes(keyword))) {
detected.push(category as KnowledgeCategory);
}
}
return detected;
}