COUCHE DE DÉCISION TYPÉE · AUTO-HÉBERGÉ · CONÇU EN EUROPE

Un routeur qui sait
quand dire non.

mtlm-router transforme des requêtes en langage naturel en décisions de routage typées et calibrées — on-prem, sur CPU, en ~100 millisecondes. Quand une requête ne correspond à aucune route connue, il répond escalate au lieu de deviner.

Les APIs de décision américaines facturent au token et gardent vos requêtes. mtlm-router est une appliance de 7,5 Mo qui tourne sur le serveur que vous possédez déjà — coût fixe, les données restent à l'intérieur.

7,2M
paramètres
~180ms
inférence CPU
8Mo
modèle int8
0
GPU · cloud · dépendances
Voir la décision

Tapez votre propre demande. Regardez-le décider.

En direct sur le routeur hébergé, voies métier uniquement (helpdesk IT, outils généraux, chat). Une demande hors sujet doit s'abstenir, pas deviner.

Le même POST /v1/route que vos agents appelleraient. Quelques essais par visiteur ; prenez un portefeuille pour plus.

Un appel. Trois réponses typées.

Une seule requête renvoie une route validée, une confiance calibrée et une proposition de remplissage d'outil — ou un escalate propre quand il ne sait pas.

$ curl -s localhost:8080/assess -d '{"req":"salut, c'est la troisième fois que mon VPN coupe aujourd'hui"}'

{
  "route":       "create_ticket",
  "confidence":  0.87,
  "noul":        0.91   // "novel / unhandled / loss" — cadran d'abstention,
  "candidate":   "open_ticket",
  "score":       0.83,
  "action":      "tool_fill",
  "fill": { "subject": "VPN drops repeatedly", "priority": "high" }
}

Il ne discute pas

C'est un routeur, pas un chatbot. Il émet des décisions lisibles par machine que votre agent, helpdesk ou répartiteur peut exécuter directement.

Il ne devine pas

Les requêtes hors périmètre tombent sur la route calibrée escalate. Un petit modèle ne devrait pas faire semblant de savoir — celui-ci ne le fait pas.

Il ne débat pas

Pas de température, pas d'échantillonnage, pas de dérive de prompt. Un softmax déterministe sur vos routes — même requête, même réponse, à chaque fois.

Pensé pour les workflows de PME, pas pour les datacenters.

Les requêtes qui mangent le temps d'une PME sont des décisions, pas des dissertations — trier la boîte mail, dispatcher le ticket, router le devis. C'est exactement le travail d'un routeur.

Tri emails & tickets

Devis, commandes, litiges, demandes urgentes — classés, priorisés et poussés vers la bonne file ou l'ERP. Plus de copier-coller, plus d'emails perdus.

Commandes ops typées

« Redémarre le spouleur sur srv2 », « marque la commande 4412 pour revue » — le langage naturel devient une action typée que votre automatisation exécute, ou un escalate quand il ne faut pas.

Relais conformité

Confiance faible ou requête risquée : escalade vers un humain plutôt qu'exécution. Piste d'audit incluse — chaque décision est journalisée avec sa confiance.

Une instance, plusieurs clients

Intégrateurs : déployez le même tronc chez chaque client et livrez une tête par client — un fichier ~7 Ko entraîné sur son vocabulaire en quelques heures, pas un modèle sur mesure.

Porte d'entrée pour la grosse IA

Placez-le en shadow devant votre LLM hébergé pour mesurer ce qu'il aurait pu traiter localement — puis ne coupez la facture API que là où les données le disent.

Pas besoin d'équipe ML

Une archive, un binaire, un endpoint. Si votre stack sait faire un POST JSON, elle sait router. RGPD natif : rien ne quitte jamais votre réseau.

Mixture of experts — un tronc, plusieurs cerveaux.

Le tronc 7M figé est le cerveau partagé. La connaissance métier vit dans des têtes de ~7 Ko que vous livrez, échangez et auditez comme des fichiers de config. Une tête gate choisit l'expert ; l'expert choisit la route.

Chaque tête déclare son propre prélèvement de features — last-token, mean@-3, max@-3 — pour qu'une seule instance serve la recette de pooling qui a réellement gagné l'éval de chaque domaine. Les clients qui connaissent leur domaine peuvent aussi épingler leur expert et sauter le gate entièrement.

                 ┌─────────────────────────────────────┐
  request  ──▶  │  tronc mtlm-router — modèle 7M figé  │
  tokens         └──────────────┬──────────────────────┘
                    hidden state du prefill (1 × d_model)
            ┌────────────┐ ┌─────────────┐
            │ gate.head  │ │ expert.head │   ← par domaine, ~7 Ko
            │ choisit le domaine │ │ choisit la route │
            └────┬───────┘ └─────┬───────┘
       it_helpdesk ───┘        reset_password ───┘  + confiance calibrée

Livrez des cerveaux, pas des modèles

Un déploiement client = le tronc figé + quelques fichiers de têtes de quelques Ko. Onboardez un nouveau domaine en entraînant une tête sur ~50 exemples labellisés par route — une lane fonctionnelle en quelques heures ; votre export complet la fait monter.

Pooling par tête

Les gains de pooling ne sont pas uniformes — mean@-3 gagne sur les experts synthétiques courts, max@-3 sur le trafic en prose longue, last-token garde le gate. Les flags mhd2 portent chaque recette ; le serveur obéit.

Épinglez votre lane

{"state":"depot illicite rue des lilas","expert":"mairie"} — un client qui connaît son domaine saute le gate et les veto OOD. La propre classe escalate de son expert reste le chemin d'abstention. Essayez dans la démo live ci-dessus.

Chiffres — holdout, calibrés, honnêtes.

Métrique Tête Résultat
Précision de routage tête decide mhd3, holdout 800 lignes, eval live sans fuite 98,4%
Calibration NOUL cadran d'abstention, holdout 800 lignes, eval live sans fuite 99,4%
Précision du score niveau de complexité 1–4, holdout 800 lignes, live sans fuite 98,8%
Précision du gate gate métier mhd3, 149 lignes holdout, live sans fuite, 3 domaines 98,7%
Expert mairie multi-tap mhd3 concat3 (max@-4,-2,-3), 6 402 lignes réelles, live sans fuite 78,5% → 81,5%
Mairie, taxonomie fusionnée même tête, paire collecte ambiguë fusionnée — le résultat pilote, live sans fuite 90,7% · 97,8% auto à <1% err (conforme α=0,02)
Intents génériques — CLINC150 mhd3 mean@-2,-3,-4, 151 classes dont hors-scope, holdout 5 500 lignes 73,8% · AUROC détection OOS 0,842
Données nécessaires par lane courbe few-shot, corpus municipal réel 16 routes, holdout 633 lignes 50 ex/route → 68% · export complet → 80% (fusionné : 90,7%)
Expert fleet poolé tap max@-3 sur issues en prose longue 48% → 63%
Éval gate en live matrice canary réelle, pas holdout — agrégat toutes lanes 81,6% · tools 62/63

Les holdouts laissent passer des candidats que le trafic canary réel rejette — on publie les deux. L'écart entre la précision labo et l'agrégat live est exactement ce à quoi servent les contraintes par domaine et le flywheel.

Comment fonctionne le gate d'abstention conforme → blog.intrane.fr

Il s'entraîne sur son propre trafic.

Chaque décision /v1/route est journalisée. Un flywheel quotidien moissonne le log, range les lignes incertaines dans une file de revue persistante, fusionne les verdicts jugés dans le corpus d'entraînement et déduplique avant ré-entraînement. Le gate s'étoffe sur des requêtes réelles — jamais sur ses propres prédictions confiantes.

decisions.jsonl ──▶ harvest ──▶ file de revue ──▶ verdict ──▶ corpus train ──▶ nouvelle tête
                 (replay des lignes sans domaine · seen = résolu seulement · dédup à la fusion)

Regardez une vraie lane décider.

La lane mairie fait tourner la tête phare — entraînée sur un export de production réel, servie en direct sur la démo publique (pin expert:"mairie") : dépôt illicite. micro onde → depot_illicite @ 1.00, demande de passeport → escalate → delegate. ~190ms par décision sur CPU.

» "Dépôt illicite. micro onde"          [router] depot_illicite @ 1.00 (186ms)
» "1ere dotation. bac pour le verre"    [router] dotation_bacs  @ 1.00 (174ms)
» "demande de passeport"                [router] escalate       @ 0.42 — délègue, ne devine pas
+1,4Mo / ~0ms
5 lanes sur un seul tronc — mesuré (bench/lane_scaling)
−0,2%
surcharge du scoring canari, A/B entrelacé (bench/shadow_overhead)
96,8%
rappel hors-scope — classe `oos` explicite de civic 0.2.1 (bench/oos_eval)
~470 tok/s
débit de génération, tronc 7M int8, CPU standard (bench/gen_speed)
61ms / 75ms
API route p50/p95, CPU local (bench/route_latency)

Chaque chiffre embarque son harnais de test dans le dépôt — relancez-le, ne nous croyez pas.

Les alternatives, honnêtement comparées.

Tourne chez vous Modèle de coût Sortie typée Sait s'abstenir
mtlm-router CPU, ~180ms, air-gap OK Fixe — une appliance route + confiance + fill escalate, calibré
Jev (TypeSafe) Non — API US uniquement 0,042 $/M tokens entrée noul / choice / score Probabilités calibrées
LLM de chat + parsing de prompt Seulement si auto-hébergé (GPU) Au token, entrée et sortie Texte libre à parser Hallucine quand même une réponse
Règles écrites à la main Oui Fixe Ce que vous codez Seulement les cas prévus

De zéro au routage en quelques jours.

1

Posez l'appliance — décompressez, lancez un binaire, POSTez sur /v1/route.

2

Entraînez votre tête — ~50 exemples labellisés par route suffisent pour une lane fonctionnelle ; votre export complet + une calibration donnent le point certifié.

3

Roulez en shadow — journalisez les décisions sur trafic réel ; le flywheel range ce dont il n'est pas sûr.

4

Promouvez sur preuve — passez en autoritatif seulement quand les chiffres live le disent, pas le holdout.

Limites honnêtes.

C'est un routeur, pas un raisonneur

Il ne résume pas, n'explique pas, ne compose pas. Besoin de génération de texte ? Routez vers un plus gros modèle — c'est exactement le rôle de escalate.

Des lanes fines existent

La paraphrase libre s'abstient — la tête mairie délègue une formulation nouvelle même proche. C'est voulu : étoffer une lane avec des lignes client labellisées via le flywheel, pas baisser la barre. Le manifeste livre les comptes par domaine pour voir les lanes faibles en premier.

La calibration vieillit

La température a été ajustée sur le mix de requêtes du jour. Le trafic dérive ; réajustez depuis les lignes de production labellisées avant de faire confiance aux confidences en aval.

Vérifiez avant d'autoriser

Lancez-le d'abord en routeur shadow. Ne le promouvez en autoritatif qu'après que le trafic réel a prouvé le gate + la tête sur votre mix de requêtes.

Audit de routage gratuit sur vos propres demandes.

Laissez votre email. Nous répondons avec un court questionnaire (vos routes, 30 demandes d'exemple) ; 48 h plus tard vous recevez un rapport : précision sur votre vocabulaire, calibration, ce qui serait escaladé. Sans engagement.

Stocké dans notre backend européen, utilisé uniquement pour vous envoyer l'audit. Pas de newsletter.

Des voies prêtes. Des chiffres certifiés.

Un .lanepack est une voie de décision pour un domaine — les poids plus son évaluation sans fuite, son point de calibration et sa licence, dans un tarball de ~500 ko. Posez-le dans l'appliance et ce type de demande est traité. Chaque pack montre ses chiffres ; les packs démo sont marqués comme tels.

voiecouvreholdoutstatut
civic 13 routes de dégradations urbaines — nids-de-poule, dépôts sauvages, éclairage… (vrais rapports FixMyStreet, EN) 96,8 % · α=.05 → 93,7 % auto à 0,79 % d'err gratuit · certifié
civic_fr 11 routes civiques — vraie taxonomie DansMaRue (Paris), énoncés synthétiques corpus synthétique (démo tant qu'il n'y a pas de vrais signalements) gratuit · démo
clinc150 151 intentions génériques + hors-scope 73,8 % · AUROC OOS 0,842 gratuit · certifié
helpdesk 6 routes IT + oos explicite — s'abstient sur les mails facilities/RH/hors-IT rappel OOS 0,90 · vérifié en direct gratuit · démo
eq_tone 5 classes de ton — signaux d'escalade (frustration/détresse) 51,4 % · voie volontairement honnête (s'abstient ~84-95 %) gratuit · démo

Catalogue + installation : parcourir le catalogue · github.com/javimosch/mtlm-heads — une voie ajustée sur vos routes, c'est l'offre « tête sur mesure » ci-dessous.
3 voies livrent une classe oos explicite (civic 0.2.1, civic_fr 0.1.1, helpdesk 0.2.0) — l'abstention est une fonctionnalité, pas une lacune.

Trois façons de l'utiliser. L'une est gratuite.

Hébergez l'appliance gratuitement, payez à la décision sur l'API hébergée, ou confiez-nous l'entraînement de la tête pour vos routes. Même tronc, mêmes réponses typées, mêmes chiffres honnêtes.

APPLIANCE
Gratuit

Apache-2.0, pour toujours.

L'archive v0.11.1 (~8 Mo) : moteur mhd3 multi-tap, modèle int8, têtes outils/helpdesk/mairie, unité systemd, smoke.sh + monitor.py + openapi.yaml. Tourne sur n'importe quelle machine x86-64, sans GPU ni Python. Vos données ne quittent jamais votre réseau.

Télécharger v0.11.1
API HÉBERGÉE
0,01 € / 20 décisions

Paiement à la décision, portefeuille prépayé, sans abonnement.

Le même /v1/route sur api.mtlm-router.intrane.fr, facturé via peage (EUR, recharges Stripe). Les nouveaux portefeuilles démarrent avec un crédit offert : les premières décisions ne coûtent rien. Reçu signé à chaque débit.

Créer un portefeuille et appeler
TÊTE SUR MESURE
149 € / domaine, une fois

Vos routes, entraînées et calibrées, sous 3 jours ouvrés.

Envoyez-nous votre table de routes (noms + quelques formulations d'exemple). Vous recevez une .head de ~7 Ko pour l'appliance ou l'API hébergée, un rapport d'évaluation (précision holdout, calibration) et un ré-entraînement offert après une semaine de trafic en ombre.

Envoyer vos routes

Prix en EUR hors TVA. Les décisions de l'API hébergée sont servies depuis une infrastructure européenne ; le trafic hébergé n'est journalisé que pour la calibration et ne sert jamais à entraîner les têtes d'autres clients.

Une archive. Tourne partout.

Toute la stack — binaire serveur, tokenizer, modèle int8, têtes — tient dans une archive autonome de ~7,8 Mo. On extrait, on lance ./start.sh, c'est tout. Pas d'install d'anvil, pas de pip, pas de téléchargement de modèle, pas de serveur de licence — rien ne quitte la machine.

$ tar xzf mtlm-router-v0.11.1-linux-amd64.tar.gz && cd mtlm-router-v0.11.1-linux-amd64
$ ./start.sh &
$ curl localhost:8097/v1/route -d '{"state":"Dépôt illicite. micro onde","expert":"mairie"}'
{"route":"depot_illicite","domain":"mairie","action":"tool_call","confidence":0.999,...}

Pilotable par agent, pas juste lisible.

L'archive embarque une CLI mtlm-router pensée pour les agents IA : JSON seul sur stdout, codes de sortie sémantiques, guide embarqué, cycle de vie du démon sondé via /_health, et self-update par hash de contenu. Le serveur se décrit lui-même — /guide, /llms.txt, /v1/whoami, /v1/feedback. 28/28 sur cli-spec-conformance — vérifié, pas juste affiché.

$ ./mtlm-router daemon start        # loopback, sonde /_health — jamais de sleep fixe
{"daemon":"up","port":8097,"url":"http://127.0.0.1:8097"}
$ ./mtlm-router guide               # manuel opérateur embarqué (JSON)
$ ./mtlm-router update --check      # self-update par hash → retour .bak
$ ./mtlm-router daemon stop         # POST /_shutdown propre

Assez petit pour être fiable. Assez typé pour être utile.

Source pure Machin sous licence Apache-2.0, conçue en Europe, avec la discipline des chiffres honnêtes intégrée — holdout et éval live publiés côte à côte. Lisez le doc produit, auditez les évals, livrez votre première tête.