Retour aux projets

WCSAssist — Assistant DJ piloté par IA

IA / LLM.NET 10Next.js 16PostgreSQLClean Architecture
WCSAssist — écran de connexion Spotify de l'assistant DJ West Coast Swing

Contexte du Projet

WCSAssist est un projet personnel de R&D : un assistant pour les DJ de West Coast Swing, une danse où la musique se choisit au tempo près. Préparer une soirée, c'est composer un set qui monte progressivement en énergie, alterne les ambiances et reste dansable du premier au dernier morceau — un travail d'orfèvre, fait à la main pendant des heures dans un tableur ou directement dans Spotify.

J'ai conçu WCSAssist pour répondre à une question qui dépasse largement la danse : comment intégrer un LLM dans une application métier de manière fiable, sans hallucination et sans perte de contrôle ?Ce projet me sert de laboratoire — il applique en conditions réelles l'approche que je recommande à mes clients qui veulent ajouter de l'IA à leurs outils.

L'angle IA : « l'IA règle les boutons, l'algorithme compose »

Le réflexe naïf serait de demander directement au LLM : « génère-moi une playlist ». Résultat garanti : des titres inventés, des morceaux absents de la bibliothèque, des durées fantaisistes. WCSAssist ne fonctionne pas comme ça.Le LLM ne touche jamais à un identifiant de morceau — c'est la garantie structurelle contre l'hallucination.

Le flux de génération en 4 étapes

  1. 1
    Traduction— le LLM reçoit la demande en langage naturel (« un set d'1h pour débutants, ambiance blues, montée douce ») et les statistiques de la bibliothèque, puis renvoie des paramètres de profil en JSON : plage BPM, courbe d'intensité, genres autorisés, filtres.
  2. 2
    Composition déterministe — un algorithme maison utilise ces paramètres pour sélectionner ET classer les morceaux, et calcule un score de qualité. Code testable, reproductible, zéro aléa.
  3. 3
    Contrôle — on redonne au LLM un résumé de la playlist obtenue et on lui demande un verdict : est-ce que ça répond vraiment à la demande initiale ?
  4. 4
    Boucle d'ajustement — si le verdict est négatif, le verdict est réinjecté pour que le LLM corrige ses paramètres, et on régénère une fois.

Le LLM ne fait que « régler les boutons »; le travail sensible — choisir et ordonner les morceaux — reste à un code déterministe et auditable. C'est le meilleur des deux mondes : la compréhension du langage naturel d'un côté, la fiabilité d'un algorithme de l'autre.

Anti-hallucination : l'IA doit citer ses sources

WCSAssist propose aussi une validation de morceaux par IA: analyser un titre, corriger ses genres, son année de sortie, le pays de l'artiste, sa pertinence pour le West Coast Swing. Là encore, le risque d'invention est réel — et géré frontalement.

  • Source obligatoire— toute suggestion factuelle (année, pays, langue) doit être accompagnée d'une URL source. Sans source, ou si la source n'est pas dans la liste blanche de domaines fiables, la suggestion est rejetée par le serveur.
  • Recherche web outillée — le LLM utilise des outils natifs de recherche et de lecture web pour vérifier ses affirmations. Un badge affiche le nombre de sources consultées.
  • Humain dans la boucle— l'IA ne modifie jamais la donnée directement. Elle produit une proposition; l'utilisateur coche ce qu'il accepte avant application. La décision finale reste humaine.
  • Traçabilité totale— chaque appel LLM est enregistré (prompt, réponse, modèle, tokens, latence, coût, statut) pour le debug et l'audit. Un quota journalier protège contre les dérives de consommation.

Solution Technique

Architecture

  • Backend .NET 10 — API REST en Clean Architecture stricte (Domain / Application / Infrastructure / API), CQRS via MediatR, EF Core et ASP.NET Core Identity.
  • Frontend Next.js 16 + React 19— interface MUI, graphiques Chart.js pour visualiser les courbes BPM et l'énergie des sets.
  • PostgreSQL — base relationnelle, migrations EF Core appliquées automatiquement au démarrage.
  • Couche LLM abstraite — un même prompt fonctionne avec plusieurs fournisseurs : API Anthropic, endpoints compatibles OpenAI, ou Claude en mode headless. On change de moteur sans toucher au code métier.
  • Intégrations externes — Spotify Web API pour la bibliothèque, et enrichissement des métadonnées via MusicBrainz, Discogs, Last.fm et ReccoBeats, traités en tâches de fond.
  • Docker + Azure Pipelines — conteneurisation complète, CI/CD automatisé, déploiement sur infrastructure souveraine hébergée en France.

Fonctionnalités

Génération conversationnelle

On décrit la soirée voulue en français ; l'IA règle les paramètres et l'algorithme compose un set scoré, prêt à exporter vers Spotify.

Curation IA des morceaux

Analyse en lot des titres : correction des genres, de l'année, du pays, de l'adéquation WCS — chaque suggestion sourcée et validée par l'humain.

Analyse audio & insights

BPM, énergie, valence, dansabilité, tonalité Camelot pour chaque morceau. Détection des anomalies de tempo et visualisation de la distribution de la bibliothèque.

Profils de génération

Courbes d'intensité réutilisables (montée gaussienne, mini-vagues), règles de transition et de cool-down pour cadrer chaque type de soirée.

Import / export Spotify

Connexion du compte, import de la bibliothèque et des playlists, export en un clic des sets générés vers Spotify.

Console d'administration LLM

Gestion des fournisseurs et des prompts, traces complètes des appels IA, quotas par utilisateur — l'IA reste pilotable et auditable.

Aperçu de l'application

Cliquez sur une capture pour l'agrandir et parcourir la galerie.

Génération de playlist : on décrit le set en français, l'IA règle les paramètres.
Curation IA : suggestions sourcées, corrections de genres et de BPM à valider.
Détail d'un set : courbe BPM, énergie et score de qualité algorithmique.
Insights : distribution BPM/énergie et détection des anomalies de tempo.
Admin LLM : fournisseurs interchangeables, prompts et traces des appels IA.
Bibliothèque : 1 000+ morceaux analysés, filtres multi-critères.

Défis Techniques Relevés

  • Cadrer un LLM — concevoir le contrat (un JSON de paramètres strict), parser des réponses imparfaites, gérer les boucles de correction et les défauts sûrs pour tout champ manquant.
  • Algorithme de composition— traduire des paramètres abstraits en un set réel : courbes d'intensité, contraintes de transition, quotas par artiste, distribution de genres, slots de fin de soirée.
  • Réconciliation de données externes— agréger Spotify, MusicBrainz, Discogs et Last.fm sur le même morceau malgré les incohérences de titres, d'artistes et de référentiels.
  • Coût & observabilité IA— tracer chaque appel, mesurer tokens, latence et coût, imposer des quotas — pour qu'une fonctionnalité IA reste maîtrisée en production.

Ce que ce projet démontre

  • Une IA fiable se conçoit— l'hallucination n'est pas une fatalité : c'est une question d'architecture. On confie au LLM ce qu'il fait bien (comprendre le langage) et on garde le reste sous contrôle d'un code déterministe.
  • L'IA s'intègre dans une vraie application— pas un chatbot isolé, mais une fonctionnalité branchée sur une base de données, des API métier et une logique d'entreprise existante.
  • Indépendance vis-à-vis du fournisseur — la couche LLM abstraite évite le verrouillage : on peut changer de modèle ou de fournisseur sans réécrire le métier.
  • Méthode reproductible— cette approche « IA encadrée » se transpose à n'importe quel métier : devis, planning, recommandation, classification, assistance à la décision.

Conclusion

WCSAssist est né d'un besoin concret de danseur, mais c'est avant tout une démonstration : oui, on peut mettre de l'IA dans une application métier sans sacrifier la fiabilité.La clé n'est pas de tout déléguer au LLM, mais de lui confier le rôle qu'il tient le mieux et d'encadrer le reste avec du code testé, tracé et auditable. C'est exactement cette approche — pragmatique et sans esbroufe — que j'applique quand j'accompagne une entreprise qui veut ajouter de l'IA à ses outils.

Un projet qui mérite de l'IA ?

Discutons de la manière d'intégrer un LLM dans votre application métier — de façon fiable, mesurée et hébergée en France.