Architecture
Vue globale de la plateforme g-berenger.com : produits, interconnexions, boucles IA et décisions techniques.
01 · Diagramme global
02 · Boucle de retour CV
Boucle de retour CV
Les fichiers joints (images, PDF, texte) sont envoyés à Claude en tant que blocs de contenu multimodaux. L'API choisit automatiquement le mode vision (image), document (PDF, beta) ou texte.
03 · Interconnexions produits
Transfert offre sélectionnée via sessionStorage (jh-offer-for-cv)
GPT-4o : auto_generate (profil + offre) · revise · generate (génération editorial CV). Claude Sonnet : chat (conversation preparatoire + feedback)
Whisper STT (Groq, fallback OpenAI) · Mistral small chat (Morgan) · ElevenLabs TTS (Daniel 1.25x)
Claude (President + Andrej/Otis) · GPT-4o (Bob) · Mistral Large (Charlie) · Llama 3.1 70B (Diana) · blind peer review · orchestration Inngest
knowledge base JSON (max 1000 entrées, OIDC automatique prod) · sessions CV · sessions English Coach · cases Council
04 · Pipeline LLM Council
Pipeline LLM Council · 18 étapes Inngest
enjeux · nature · périmètre
Génération indépendante en parallèle
pas d'auto-review
Blind Peer Review
4 reviewers · 6 critères scorés
calibration incertitude
score · médiane · dispersion
Evidence Register · Structural Alerts
President · Claude Sonnet 5
8 lenses · sans scores jury
confrontation signaux jury
Chaque étape est un step.run() Inngest checkpointé - reprise automatique en cas d'échec. L'état complet est persisté dans Vercel Blob (council/cases/{caseId}.json) à chaque étape.
05 · Couches techniques
06 · Décisions clés
proxy.ts plutôt que middleware.ts
Next.js 16 a déprécié middleware.ts pour la protection de routes. proxy.ts est la convention retenue.
SSE plutôt que WebSocket
Routes job-hunter streamant via Server-Sent Events (maxDuration: 120s). Compatible Vercel sans config supplémentaire. Le revise charge les attachments base64 avant de streamer la réponse.
Design tokens centralisés
Toutes les couleurs passent par DS dans lib/design-tokens.ts + style inline. Aucune classe Tailwind arbitraire pour les couleurs brand.
extractJSON() pour les réponses Claude
Extrait le JSON par la première { et la dernière } pour robustesse face aux préambules / postambules que Claude peut ajouter malgré les instructions 'JSON uniquement'.
Vercel Blob pour la knowledge base
Un seul fichier JSON (max 1000 entrées) lu/écrit via @vercel/blob. OIDC automatique en prod, token en local. Partagé entre Job Hunter et Assistant CV.
Attachments multimodaux (vision + PDF + texte)
Les fichiers joints dans le feedback sont envoyés en blocs de contenu Claude : ImageBlockParam (image), DocumentBlockParam beta PDF, ou texte concaténé au prompt. Max 5 Mo / fichier, 4 fichiers par envoi.
JSZip pour la génération PPTX
Les templates .pptx sont des ZIP de XML. Manipulation par string/regex sans DOM : portable, sans dépendance lourde. Template unique : Template CV Fr.pptx. Ciblage par ID de forme stable (carte sémantique statique SLIDE1/SLIDE2). Slide 1 : toutes les zones générées. Slide 2 : seule l'en-tête (titre_poste id=101) est modifiée - le parcours, les certifications, les formations et le bloc PROJET IA sont figés dans le template.
ElevenLabs + Whisper pour Morgan
English Coach Morgan utilise ElevenLabs (eleven_turbo_v2_5, voix Daniel) pour la synthèse vocale et Whisper vià Groq (fallback OpenAI) pour la transcription. Vitesse TTS 1.25x optimisée pour les sessions de pratique.
Mode admin drag & drop home page
Bouton 'Organiser' visible uniquement quand session active. Drag & drop via Pointer Events (mouse + touch). Framer Motion layout='position' + spring 400/35/0.8. Ordre sauvegardé dans localStorage (gbe-home-card-order-v1).
Sessions CV : persistance Vercel Blob par offre
Chaque génération crée une Session (job-hunter/sessions/{id}.json). Une session contient l'offre + CVVersion[] (cv, angle, template, timestamp, feedback). La knowledge base (types: cv_rule, cv_fact_correction, cv_layout_issue, cv_feedback legacy, ignore_feedback) enrichit les futures générations et recherches.
Analytics : Vercel Analytics sans cookie publicitaire
Vercel Analytics via @vercel/analytics/react. Pas de cookie publicitaire. Opt-out effectif : clé localStorage va_opt_out - si active, <Analytics /> n'est pas monte et aucun événement n'est envoyé. Abstraction lib/analytics.ts (useAnalytics hook, guards opt-out). 20 événements types. Consentement géré depuis /privacy. AnalyticsProvider dans layout.tsx. Source de verite : lib/privacy/privacy-config.ts.
Contrat central des violations CV (cv-violation.ts)
CVViolationCode = type union de 16 codes stables. CVRepairability = blocking | local | llm | warning. makeViolation() produit une CVViolation typée. LEFT_COLUMN_OVERFLOW (local, truncate_list) : détecte quand les zones colonne gauche dépassent leur capacité PPTX. Classificateur de retours : 6 catégories déterministes (integrite, durable, factuel, layout, local, ambigu) sans LLM.
Orchestrateur validateCompleteCV (cv-validation.ts)
Point d'entrée unique pour toutes les validations : structure, editorial, layout, facts/refs, parcours_complet. Déduplique par clé (code|field|itemIndex ou code|message). Retourne CompleteValidationResult avec compteurs par réparabilité. Remplace les appels dispersés à validateCVStructure/validateCVEditorialQuality/validateCVLayout dans route.ts.
Pipeline CV : brouillon émis avant toute validation
runEditorialPipeline émet cv_draft pending AVANT la validation de la stratégie. Si la stratégie est invalide, envoie cv_draft invalid puis throw. L'utilisateur voit toujours un brouillon même en cas d'échec précoce. Séquence : draft -> strategy -> refs -> validateCompleteCV -> local repair -> llm repair (si besoin) -> revalidation -> persist.
GROUPED_REPAIR_RESPONSE_FORMAT étendu (phase 5)
Schéma strict étendu avec titre_poste (anyOf null|string) et experiences_clés (anyOf null|array). runGroupedRepair reçoit la liste des CVViolation pour déterminer exactement quels champs réparer. Descriptions trop longues réparées par LLM (plus de truncateToWordBoundary silencieux dans le pipeline).
07 · Pages juridiques et conformite
/privacy
Politique de confidentialité bilingue FR/EN. 24 sections. Traitements reels documentes. Opt-out analytics effectif (va_opt_out localStorage -> Vercel Analytics non monte). Source : lib/privacy/privacy-config.ts.
/mentions-légales
Mentions légales bilingues FR/EN. Éditeur, hébergeur, propriété intellectuelle. SIRET 927 830 166 00017 (MR BERENGER GUILLAUME) renseigne.
/cgu
Conditions générales d'utilisation bilingues FR/EN. Outils personnels et experimentaux. Absence de garantie IA. Droit francais.
DataProcessingNotice
Composant contextuel d'information sur les traitements (variant: cv | audio | council). Affiche avant tout envoi de données a un tiers. Lien vers /privacy#section.
AudienceDisclosureBanner
Bandeau discret en bas de la home. Formulation factuelle (exemption CNIL Vercel Analytics en cours de vérification). Lien vers /privacy.
lib/privacy/privacy-config.ts
Source de verite centrale : contacts, domaines, fournisseurs, traitements, conservation. Utilisee par toutes les pages juridiques. docs/privacy/ pour la documentation interne.