Patterns OpenAI — CRAutomatique2
Package et client
- Package :
openai^4.0.0 (PAS Anthropic SDK, PAS@azure/openai) - Client factory :
backend/src/services/openai/client-factory.ts - Configuration :
OPENAI_API_KEYdans.env(ou vLLM local viaOPENAI_BASE_URL)
Strategie dual-model
| Usage | Modele | Pourquoi |
|---|---|---|
| Detection type reunion | gpt-4o-mini | Classification simple, low-cost, 3000 chars max |
| Extraction facts atomiques | gpt-4o-mini | JSON structure, temperature 0 |
| Generation brief complet | gpt-4o | Qualite editoriale, structured output |
Structured output
typescript1// Detection (JSON simple) 2const response = await client.chat.completions.create({ 3 model: 'gpt-4o-mini', 4 messages: [{ role: 'user', content: prompt }], 5 response_format: { type: 'json_object' }, 6 temperature: 0, 7}); 8 9// Generation brief (schema Zod) 10const response = await client.chat.completions.create({ 11 model: 'gpt-4o', 12 messages: [{ role: 'system', content: systemPrompt }, { role: 'user', content: userPrompt }], 13 response_format: { type: 'json_object' }, 14 temperature: 0.1, 15}); 16const brief = BriefStructuredSchema.parse(JSON.parse(content));
Schemas Zod definis dans backend/src/types/brief.ts :
BriefStructuredSchema— schema principalBriefMetadataSchema— metadata (meetingType, date, duration)ComexContentSchema,CodirContentSchema,EncoursContentSchema— contenu par type
Anti-hallucination (3 couches)
Couche 1 — Pre-extraction deterministe (AVANT le LLM)
- Fichier :
backend/src/services/pre-extraction.ts - Scan regex : montants financiers (avec interpretations brut/x1000/x1M), dates, personnes, entites
- Output :
pre-extracted-facts.jsondans chaque job - Inject :
buildFactsConstraintSection()produit un bloc de contraintes injecte dans le prompt
Couche 2 — Post-processings deterministes (APRES le LLM)
- ~70 sanitizers/enrichers/guards dans
applyComexPostProcessings() - Corrigent les erreurs LLM : kind budget, revenue, attributions, formulations
- Voir skill
/comex-rulespour la chaine complete
Couche 3 — Validation post-extraction
- Fichier :
backend/src/services/openai/validation.ts - Verifie montants financiers du brief contre la transcription
- Valide noms responsables contre voice profiles
- Output :
validation-report.jsondans chaque job
Prompts
Chaque type de reunion a son prompt dedie :
prompts/detect-meeting-type.ts— detection (excerpt 3000 chars)prompts/generate-comex.ts— generation brief COMEXprompts/generate-codir.ts— generation brief CODIRprompts/generate-chantier.ts— generation brief ENCOURSprompts/extract-chantier-facts.ts— extraction facts ENCOURS
Les prompts recoivent les contraintes pre-extraites via buildFactsConstraintSection().
Regles
- Ne jamais faire confiance au LLM sur les champs structurels (
budget.kind, attributions) - Temperature 0 pour classification/extraction, 0.1 pour generation editoriale
- Pas de retry auto cote app — le pipeline gere les erreurs via
safe()wrapper - Toujours valider la sortie JSON avec le schema Zod avant utilisation
- Tronquer la transcription a la taille contexte du modele (32768 tokens pour vLLM local)
Fichiers cles
backend/src/services/openai/client-factory.ts— creation client OpenAIbackend/src/services/openai/structured-generation.ts— orchestration generation + post-processingsbackend/src/services/openai/prompts/— tous les prompts par typebackend/src/services/openai/validation.ts— validation anti-hallucinationbackend/src/services/pre-extraction.ts— pre-extraction deterministebackend/src/types/brief.ts— schemas Zod (BriefStructured, ComexContent, etc.)