TalentVision — Documentation

Documentation technique de la plateforme Sodexo Ma Carrière, déployée sur sodexo.coconutservices.fr. Gestion des talents, compétences, évolutions de carrière, et 3 bots IA connectés à Langflow.

Stack technique
Frontend : HTML/CSS/JS statique (Cloudflare Pages)
Backend : Cloudflare Pages Functions (Workers)
Base de données : Cloudflare D1 (SQLite)
IA / Bots : Langflow sur flow.coconutservices.fr
Authentification : Cloudflare Access (Zero Trust)
Connecteurs : SAP SuccessFactors, Oracle HCM, Salesforce (prévus)

Architecture globale

Vue d'ensemble de l'architecture de la plateforme TalentVision, incluant les connecteurs ERP/SIRH existants et prévus.

Utilisateur / Navigateur sodexo.coconutservices.fr Cloudflare Access Frontend Cloudflare Pages — HTML/CSS/JS statique DEMO PROD DOC 10 pages : Dashboard, Collaborateurs, 4 Profils, 3 Bots, Doc shared/mode.js • shared/dashboard.css • shared/styles.css fetch(/api/...) proxy API Workers API /functions/api/ employees.js GET /api/employees employees/[id].js GET /api/employees/:id stats.js GET /api/stats notifications.js GET + POST chat.js, extract-cv.js, matching.js search.js • [[path]].js (proxy) Langflow (Ollama) flow.coconutservices.fr ChatbotFAQ FAQ RH ExtractionCV Parse PDF/DOCX MatchingEvolution Scoring LLM : Ollama (Mistral / Llama) Cloudflare D1 sodexo-talent (SQLite) SQL queries Connecteurs SIRH / ERP SAP SuccessFactors Oracle HCM Cloud Salesforce sync bidirectionnel Légende Flux actif Connecteur prévu Base de données Service IA
Architecture globale TalentVision — Cloudflare Pages + D1 + Langflow + connecteurs ERP

Architecture IA — On-premise vs Cloud-first

Deux options d'architecture pour les 4 agents IA (Extraction CV, Chatbot FAQ, Matching, Turnover). L'option A est 100 % on-premise, l'option B repose sur des API cloud avec anonymisation.

Option A — On-premise (Langflow + Ollama + Mistral 7B)

INFRASTRUCTURE ON-PREMISE (Sodexo) CLOUD FR (Fallback) Langflow Orchestrateur IA Ollama + Mistral 7B Serveur GPU local Extraction CV Données sensibles Chatbot FAQ Questions génériques Matching Évol. Profils & scores Turnover Signaux faibles PostgreSQL + pgvector Base vectorielle locale Cloudflare Workers API Gateway Utilisateurs RH Mistral API Cloud souverain FR Fallback pics de charge On-premise exclusif On-premise + fallback cloud FR
Architecture on-premise — Langflow + Ollama + Mistral 7B (souveraineté maximale)

Option B — Cloud-first (API externes + anonymisation)

INFRASTRUCTURE SODEXO (Front + Anonymisation) CLOUD — API EXTERNES Couche d'anonymisation Suppression noms, adresses, photos avant envoi API Extraction CV Données anonymisées Chatbot FAQ Questions génériques Matching Évolution Profils pseudonymisés Prédiction Turnover Données agrégées Mistral API Cloud souverain FR — principal Anthropic Claude FAQ uniquement — alternative OpenAI GPT-4 FAQ uniquement — alternative Utilisateurs RH Cloudflare Workers (API Gateway) Mistral API (principal) Anthropic / OpenAI (FAQ alternative) Anonymisation obligatoire
Architecture cloud-first — API externes avec couche d'anonymisation (time-to-market rapide)

Flux de données

Comparaison des flux en mode DEMO (données statiques) et PROD (données dynamiques depuis D1 et Langflow).

DEMO PROD Navigateur HTML statique données hardcodées Affichage Aucun appel réseau. Les 17 collaborateurs, compétences, scores et notifications sont directement intégrés dans le HTML. Idéal pour la démonstration client. localStorage('sodexo_mode') Navigateur fetch Workers API /functions/api/ SQL D1 JSON Affichage proxy Langflow 3 flows IA SIRH / ERP SAP • Oracle • Salesforce En mode PROD, onModeChange() déclenche apiFetch() qui charge les données réelles depuis D1. Les bots proxient vers Langflow. Les connecteurs ERP synchronisent les données RH.
Flux de données : DEMO (statique) vs PROD (D1 + Langflow + ERP)

Intégration SIRH / ERP

TalentVision est conçu pour s'intégrer avec les principaux systèmes SIRH et ERP du marché. Les connecteurs permettent la synchronisation bidirectionnelle des données collaborateurs.

TalentVision Cloudflare D1 + Workers employees, skills, gaps, evaluations, career_path API REST /api/* SAP SuccessFactors Données collaborateurs OData API • Employee Central Profils, postes Oracle HCM Cloud Évaluations & performance REST API • Oracle Fusion Évaluations Salesforce CRM & gestion des talents REST API • Bulk API 2.0 Mobilité, CRM Langflow (IA) Chatbot, CV, Matching flow.coconutservices.fr • Ollama IA / NLP
Intégration TalentVision avec les systèmes SIRH / ERP et services IA
SystèmeTypeDonnées échangéesProtocoleStatut
SAP SuccessFactorsSIRHProfils, postes, organigramme, contratsOData v2/v4Prévu
Oracle HCM CloudHCMÉvaluations, objectifs, performanceREST APIPrévu
SalesforceCRMMobilité interne, gestion talentsREST + Bulk APIPrévu
LangflowIAChatbotFAQ, ExtractionCV, MatchingREST /api/v1/runActif
Cloudflare D1BDDToutes les données applicativesSQL (binding Workers)Actif
Stratégie d'intégration
Les connecteurs ERP fonctionnent en synchronisation périodique (batch) et en webhooks (temps réel). Un Worker dédié /functions/api/sync/ orchestrera les flux import/export. Le schéma D1 est déjà aligné avec les modèles de données SAP SuccessFactors (Employee Central) et Oracle HCM.

Arborescence du projet

coconut-website/ ├── index.html # Homepage Ma Carrière ├── doc.html # Cette page (documentation) ├── wrangler.toml # Config Cloudflare ├── schema.sql # Schéma D1 ├── seed.sql # Données initiales ├── _routes.json # Routage Pages Functions │ ├── shared/ │ ├── dashboard.css # Design system complet │ ├── styles.css # Styles globaux │ └── mode.js # Toggle DEMO/PROD + notifications │ ├── BackOffice/ │ ├── index.html # Dashboard RH central │ ├── employees.html # Liste des collaborateurs │ ├── alexandre-esteves.html # Profil détaillé │ ├── antoine-moreau.html # Profil détaillé │ ├── marguerite-eyei.html # Profil détaillé │ └── gabriel-lowensohn.html # Profil détaillé │ ├── ChatbotFAQ/ │ ├── index.html # Bot FAQ RH │ └── config.html # Configuration du bot ├── ExtractionCV/ │ ├── index.html # Bot extraction de CV │ └── config.html # Configuration du bot ├── MatchingEvolution/ │ ├── index.html # Bot matching candidats │ └── config.html # Configuration du bot │ └── functions/api/ ├── [[path]].js # Catch-all proxy → ia.coconutservices.fr ├── employees.js # GET /api/employees ├── employees/ │ └── [id].js # GET /api/employees/:id ├── stats.js # GET /api/stats ├── notifications.js # GET /api/notifications ├── notifications/ │ └── read.js # POST /api/notifications/read ├── search.js # GET /api/search ├── chat.js # POST /api/chat → Langflow ├── extract-cv.js # POST /api/extract-cv → Langflow └── matching.js # POST /api/matching → Langflow

Base de données — Cloudflare D1

La base sodexo-talent utilise Cloudflare D1 (SQLite distribué). Le schéma est défini dans schema.sql et les données initiales dans seed.sql.

Diagramme Entité-Relation

employees PK idTEXT first_name, last_nameTEXT job_title, affiliate, siteTEXT evolution_scoreINTEGER (0-100) risk_levelTEXT (low/mid/high) turnover_risk_pct, engagement_pct skills name TEXT, percentage INT category TEXT FK employee_id → employees.id gaps competence TEXT gap_level TEXT, training TEXT FK employee_id → employees.id career_path title, company TEXT date_range, status TEXT FK employee_id → employees.id turnover_factors label TEXT, impact TEXT FK employee_id → employees.id evaluations type, score, date TEXT evaluator, comment TEXT FK employee_id → employees.id context_signals text TEXT, color TEXT view_restriction TEXT FK employee_id → employees.id notifications title, message, timestamp is_read INT, icon TEXT stats PK key TEXT, value TEXT change_label, change_direction
Diagramme ERD — Cloudflare D1 (sodexo-talent) — 9 tables

Tables

TableDescriptionClé primaireFK
employeesCollaborateurs (infos, scores, badges)id TEXT
skillsCompétences par employé (%)id INTEGERemployee_id
gapsGaps de compétences identifiésid INTEGERemployee_id
career_pathParcours carrière (timeline)id INTEGERemployee_id
turnover_factorsFacteurs de risque turnoverid INTEGERemployee_id
evaluationsÉvaluations (manager, auto-éval)id INTEGERemployee_id
notificationsNotifications globalesid INTEGER
context_signalsSignaux contextuels (RH/manager)id INTEGERemployee_id
statsKPI globaux (clé/valeur)key TEXT

Table employees — Colonnes principales

ColonneTypeDescription
idTEXT PKIdentifiant unique (ex: alexandre-esteves)
first_name, last_nameTEXTPrénom et nom
job_titleTEXTPoste actuel
affiliateTEXTFiliale Sodexo
siteTEXTSite géographique
evolution_scoreINTEGERScore d'évolution (0-100)
risk_levelTEXTlow / medium / high
turnover_risk_pctINTEGERRisque de turnover (%)
engagement_pctINTEGEREngagement (%)
badge_labelTEXTBadge (Haut Potentiel, etc.)
profile_pageTEXTURL de la page profil

Déploiement de la base

# Créer la base D1
npx wrangler d1 create sodexo-talent

# Appliquer le schéma
npx wrangler d1 execute sodexo-talent --file=schema.sql

# Insérer les données initiales
npx wrangler d1 execute sodexo-talent --file=seed.sql

API — Employees

GET /api/employees

Liste paginable et filtrable de tous les collaborateurs.

ParamètreTypeDescription
searchstringRecherche nom/prénom/poste (LIKE)
affiliatestringFiltre par filiale
sitestringFiltre par site
departmentstringFiltre par département
riskstringFiltre par niveau de risque
score_minintegerScore d'évolution minimum
score_maxintegerScore d'évolution maximum
sortstringTri : name, score, risk, tenure

Réponse :

{
  "employees": [
    {
      "id": "alexandre-esteves",
      "first_name": "Alexandre",
      "last_name": "Esteves",
      "job_title": "Chef de projet digital",
      "evolution_score": 82,
      "risk_level": "low",
      "badge_label": "Haut Potentiel",
      ...
    }
  ]
}

API — Employee Detail

GET /api/employees/:id

Profil complet d'un collaborateur avec toutes ses données associées.

Réponse :

{
  "employee": { ... },
  "skills": [
    { "name": "Leadership", "percentage": 88, "category": "soft" }
  ],
  "gaps": [
    { "competence": "Anglais C1", "gap_level": "moyen", "training_recommendation": "..." }
  ],
  "career_path": [
    { "title": "...", "company": "Sodexo", "date_range": "2024-...", "status": "current" }
  ],
  "turnover_factors": [ ... ],
  "evaluations": [ ... ],
  "context_signals": [ ... ]
}

API — Stats

GET /api/stats

KPI globaux du dashboard.

{
  "stats": [
    { "key": "total_employees", "value": "847", "change_label": "+12", "change_direction": "up" },
    { "key": "avg_evolution_score", "value": "72", ... },
    { "key": "turnover_risk", "value": "8.2%", ... },
    { "key": "high_potential", "value": "23", ... }
  ]
}

API — Notifications

GET /api/notifications

Liste des notifications, triées par date décroissante.

{
  "notifications": [
    {
      "id": 1,
      "title": "Nouvelle évaluation",
      "message": "Antoine Moreau a complété son auto-évaluation",
      "timestamp": "2026-02-10T10:30:00Z",
      "is_read": 0,
      "icon": "eval"
    }
  ]
}

POST /api/notifications/read

Marque toutes les notifications comme lues. Body vide.

// Response
{ "success": true }

GET /api/search?q=...

Proxy vers l'API Brave Search. Utilisé pour la recherche contextuelle.

ParamètreTypeRequisDescription
qstringouiTerme de recherche
Authentification
Nécessite la variable d'environnement BRAVE_SEARCH_API_KEY configurée dans Cloudflare.

Langflow — ChatbotFAQ

POST /api/chat

Proxy vers le flow Langflow ChatbotFAQ. Répond aux questions RH des collaborateurs.

Champ bodyTypeRequisDescription
messagestringouiMessage de l'utilisateur
conversationIdstringnonID session pour continuité
// Request
{ "message": "Combien de jours de congés me reste-t-il ?" }

// Response
{ "response": "Selon votre solde actuel, il vous reste..." }
Langflow
Base URL : https://flow.coconutservices.fr
Route interne : /api/v1/run/{FLOW_ID}
Variable : LANGFLOW_CHAT_FLOW_ID (default: chatbot-faq)

Langflow — Extraction CV

POST /api/extract-cv

Upload de CV (PDF/DOCX) pour extraction automatique des compétences via Langflow.

ChampTypeDescription
filesFormDataUn ou plusieurs fichiers CV
// Response
{
  "results": [
    { "file": "cv-moreau.pdf", "result": "Compétences extraites : ..." }
  ]
}
Fonctionnement
Les fichiers sont convertis en base64 côté Worker puis envoyés dans le champ tweaks.file_content du payload Langflow. Variable : LANGFLOW_CV_FLOW_ID (default: extraction-cv)

Langflow — Matching Évolution

POST /api/matching

Déclenche le pipeline de matching candidat/poste via Langflow.

Champ bodyTypeDescription
employeeIdstringID de l'employé (optionnel, sinon tous)
actionstringstart = pipeline global
// Request
{ "action": "start" }

// Response
{ "status": "running", "result": "Pipeline démarré pour 847 collaborateurs..." }

Mode DEMO / PROD / DOC

Un toggle 3 boutons est présent dans la topbar de toutes les pages. Le mode est persisté via localStorage('sodexo_mode').

ModeComportementCouleur
DEMODonnées hardcodées en HTML (aucun appel réseau)Orange
PRODDonnées chargées depuis D1 via fetch(/api/...)Vert
DOCRedirige vers /doc (cette page)Bleu Sodexo

JavaScript (/shared/mode.js)

var SODEXO_MODE = localStorage.getItem('sodexo_mode') || 'demo';

function setMode(mode) {
  SODEXO_MODE = mode;
  localStorage.setItem('sodexo_mode', mode);
  // Met à jour les boutons, body class, user, contenu
  // Appelle onModeChange(mode) si défini sur la page
}

function apiFetch(endpoint) {
  return fetch('/api' + endpoint).then(function(r) { return r.json(); });
}

function apiPost(endpoint, data) {
  return fetch('/api' + endpoint, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(data)
  }).then(function(r) { return r.json(); });
}
Intégration
Chaque page peut définir une fonction onModeChange(mode) qui sera appelée automatiquement quand l'utilisateur change de mode. En mode PROD, cette fonction déclenche les appels API pour remplacer les données hardcodées. Les bots affichent un état « Langflow non configuré » si le backend n'est pas disponible.

Design Tokens

Variables CSS définies dans /shared/dashboard.css :

VariableValeurUsage
--sodexo-primary #283897Bleu Sodexo principal
--sodexo-primary-light #E7E9F7Fond hover / sélection
--sodexo-primary-dark #2A295CTitres, texte fort
--sodexo-accent #DA2020Rouge alerte / badge
--sodexo-green #2ecc71Succès, mode PROD
--sodexo-orange #f39c12Warning, mode DEMO
--sodexo-bg #f4f5f7Fond de page
--sodexo-border #e8e8e8Bordures, séparateurs

Vues par rôle

Les pages profils disposent de 3 vues avec des informations différentes selon le rôle :

RôleClasse CSSVisibilité
RH.view-rhTout : scores, signaux, turnover, gaps, évaluations
Manager.view-managerCompétences, évaluations, gaps (sans signaux sensibles)
Collaborateur.view-collabVue personnelle : compétences propres, carrière, formations

Le toggle de rôle est dans la topbar des pages profils. Il ajoute la classe role-{role} sur <body> et le CSS masque les sections non autorisées.

Monitoring Système

Le monitoring est intégré directement dans les pages d'accueil (/index.html et /BackOffice/index.html). Il affiche l'état en temps réel des 4 services critiques de la plateforme.

Monitoring Dashboard Workers API 12ms • 99.8% D1 Database 8ms • 99.9% Langflow 340ms • 98.5% CF Access implicite • 100% DEMO : données simulées statiques PROD : health checks réels (fetch) GET /api/stats teste Workers + D1 GET /health (no-cors) flow.coconutservices.fr Statuts : Opérationnel Dégradé Non configuré Indisponible
Monitoring système — 4 services surveillés en temps réel

Services surveillés

ServiceURL de testMéthodeSémantique
Workers API/api/statsGET (fetch)Vérifie que les Pages Functions répondent. Si OK, infère que D1 est aussi opérationnel.
D1 Database(inféré via Workers)L'endpoint /api/stats interroge D1. Si la réponse est valide, D1 est opérationnel.
Langflowhttps://flow.coconutservices.fr/healthGET (no-cors)Health check du serveur Langflow. Si indisponible, affiche « Non configuré » (gris).
CF Access(implicite)Si l'utilisateur a accès à la page, Cloudflare Access est opérationnel.

DEMO vs PROD

ModeComportement
DEMOAffiche des valeurs simulées statiques (tout vert, latences fictives). Aucun appel réseau.
PRODExécute de vrais health checks en temps réel. Les résultats reflètent l'état réel de l'infrastructure. Bouton « Actualiser » disponible.

Variables d'environnement

VariableRequisDescriptionDefault
DBouiBinding D1 (auto via wrangler.toml)
LANGFLOW_CHAT_FLOW_IDnonFlow ID pour ChatbotFAQchatbot-faq
LANGFLOW_CV_FLOW_IDnonFlow ID pour ExtractionCVextraction-cv
LANGFLOW_MATCHING_FLOW_IDnonFlow ID pour Matchingmatching-evolution
BRAVE_SEARCH_API_KEYoui*Clé API Brave Search
Important
Les variables sont configurées dans Cloudflare Pages → Settings → Environment variables. Le binding D1 est défini dans wrangler.toml.

Déploiement

wrangler.toml

name = "sodexo"
compatibility_date = "2024-01-01"
pages_build_output_dir = "."

[[d1_databases]]
binding = "DB"
database_name = "sodexo-talent"
database_id = "<ID>"

Commandes

# Déploiement via GitHub (auto)
git add . && git commit -m "deploy" && git push

# Ou déploiement direct
npx wrangler pages deploy .

# Migration DB
npx wrangler d1 execute sodexo-talent --file=schema.sql
npx wrangler d1 execute sodexo-talent --file=seed.sql
CI/CD
Le déploiement est automatique via GitHub → Cloudflare Pages. Chaque push sur main déclenche un build et un déploiement. Les Pages Functions dans /functions/ sont détectées automatiquement.

TalentVision Documentation — Sodexo Ma Carrière — Coconut Services — 2026