MUNICIPAL REQUESTS · SELF-HOSTED · MADE IN EUROPE
Auto-sort the waste requests.
Escalate everything else.
mtlm-router reads each incoming citizen request and returns a typed route — collecte OM, dépôt illicite, dotation de bacs, déchèterie… — or a calibrated escalate when it isn't sure. On-prem, on CPU, in ~200ms. Nothing leaves the collectivité's network.
What a collectivité gets
Automatic routing
Clear requests go straight to the right service — collecte, dépôt sauvage, colonnes d'apport, compostage, positionnement de bacs. The obvious half of the queue empties itself.
Safe abstention
Ambiguous, off-topic or out-of-scope requests (état civil, passeports, factures) are escalated to a human instead of being guessed. A misrouted signalement is a citizen complaint — the system refuses rather than improvises.
Trained on your data
Each collectivité gets its own head — a ~19KB file trained on their labeled export, in hours. Your vocabulary, your routes, your edge cases.
Sovereign by design
Runs on a VM inside your network. Citizen request text never transits a hosted LLM. Flat cost — no inference billing per request.
Honest scope
- ✓ Agent-transcribed or picklist-shaped requests route automatically at high confidence.
- ✓ Near-domain out-of-scope requests (mailbox vandalism, passports, facility hours) escalate confidently.
- ! Free-form citizen phrasing tends to abstain rather than route — the system removes the clear traffic, not the hard cases.
- ! Overlapping source labels (collecte OM vs sélective) cap accuracy — that is a taxonomy problem, fixable with a cleaner label set.
We publish holdout and live-eval numbers side by side. If a deployment doesn't hold up on your real traffic, we say so.
For software vendors
Signalement apps already market "IA triage" — most of it is a hosted LLM call per citizen report. mtlm-router is the engine you embed instead: a typed, abstaining classifier you can white-label, deploy at a client's site, and sell under your own pricing model.
Embed it behind your portail usager: one POST to /v1/route, one JSON decision back. Your app keeps the UI; ours makes the call.
$ curl localhost:8097/v1/route \
-d '{"messages":[{"role":"user","content":"Depot illicite rue des Lilas"}]}'
{"route":"depot_illicite","confidence":0.92,"action":"tool_call"}
Try it on your own requests.
The demo appliance is a 7.8MB tarball — a dev poste can run it in under a minute. Send us a labeled export and we train a head on your routes; the first two trainings are on us.