Quand le LLM n'est plus le premier réflexe : routage déterministe pour agents IA
Ceci n'est pas l'histoire d'un système qui supprime les LLM. C'est l'histoire
d'un système qui déplace le LLM vers le seul endroit où il
sert vraiment. Une couche déterministe placée avant le modèle
résout directement un ensemble de demandes connues — et la preuve, mesurée,
tient en deux nombres : LLM_CALLS = 0 sur le chemin direct, et
un basculement propre vers le raisonnement quand la demande est inconnue.
Le problème : une décision laissée au LLM
Dans un serveur MCP classique, le client appelle tools/call
avec le nom de l'outil. Mais qui choisit ce nom ? Dans l'architecture
d'origine de la Tour (« tour_webmcp »), ce choix appartenait à un LLM : le
modèle décidait, parmi neuf outils, lequel répondait à la demande. Or plusieurs
de ces outils étaient déjà déterministes — lire la carte,
donner le statut, lister les projets ou les rappels, dérouler un circuit.
Le résultat est une architecture où le LLM est le premier réflexe pour tout, y compris pour ce qui est parfaitement connu à l'avance. Ce n'est ni une économie (chaque appel coûte), ni une fiabilité (l'aléa du modèle joue sur une décision qui pourrait être une règle), ni une nécessité.
La solution : un front-door déterministe
Nous avons intercalé une couche de routage sans modèle entre la requête entrante et les outils : un front-door. Il applique, dans l'ordre, des règles sur une forme canonique de la demande (casse et accents préservés), et produit un contrat observable :
MATCH → {"decision": "MATCH", "tool": "statut_tour",
"llm_required": false, "matched": "statut tour"}
NO_MATCH→ {"decision": "NO_MATCH", "llm_required": true}
Sur un MATCH, l'outil réel est appelé et le résultat construit
est renvoyé. Sur un NO_MATCH, aucun déterministe n'est forcé et
aucune réponse inventée : le front-door renvoie la main au LLM — explicitement.
Ce que nous avons mesuré
Ces valeurs sortent d'une exécution sur une base de test isolée ;
tour_prod n'a pas été modifiée.
| Élément | Résultat |
|---|---|
| Suite de tests | 18 — 0 échec, 0 erreur |
| Tests WebMCP comptés | 22 |
| Requête déterministe réelle | statut tour |
| Routage | MATCH |
| Outil sélectionné | statut_tour |
| Appels LLM sur ce chemin | 0 |
| Requête inconnue | NO_MATCH → bascule LLM |
| Authentification sans clé | HTTP 401 |
| Preuve transport | curl + HttpCase (vrai serveur HTTP) |
| Base de test | isolée (vierge) — prod intacte |
L'observabilité est elle-même mesurable : chaque passage du front-door
écrit une ligne de log avec request_id, decision,
tool et llm_required. Sur le chemin déterministe,
le log ne contient aucune ligne d'appel modèle — c'est la
preuve LLM_CALLS = 0.
Les deux chemins, prouvés
Chemin direct. requête → front-door → MATCH →
outil réel → résultat réel. LLM_CALLS = 0.
La distinction cruciale entre idée (mettre du déterministe avant le LLM), implémentation (le front-door), et preuve (les deux chemins mesurés) est ce qui sépare une intuition d'un résultat.
Le rôle du LLM ne disparaît pas. Il change de position.
Avant : requête → LLM → décision → outil.
Après : requête → déterministe ⟶ capacité connue → exécution,
⟶ inconnue → LLM.
Avec WebMCP, c'est une tour de contrôle : le front-door est l'aiguillage, « yeux et mains vers l'extérieur », qui laisse la Tour accéder à des capacités exposées par d'autres applications — sans payer un raisonnement modèle pour un geste connu.
Limites — et ce qui reste à valider
- Seules certaines commandes sont actuellement routées (statut, carte, projets, rappels, fil d'actus, exécution de circuit).
- Le front-door ne comprend pas encore librement toutes les formulations humaines.
LLM_CALLS = 0est démontré sur le périmètre testé, pas sur toute la Tour.- Gains en tokens / coût non encore mesurés.
- Reproductibilité Docker/Ansible à valider.
Ce que ça change vraiment
Présenter cette expérience comme « nous avons supprimé les LLM » serait faux — et surtout, ce serait moins intéressant. La leçon, c'est qu'une architecture agentique peut rendre son premier réflexe déterministe et plier son coût en conséquence, tout en gardant le raisonnement comme filet de sécurité. Le modèle devient une ressource appelée à la demande, pas un mur au milieu de tout.