Mohamed Keita

AI Runtime

Ne pas lier une application IA à un seul fournisseur.

V0 validée · pré-production
Multi-fournisseurRoutageRepriseLocal / cloudObservabilité

Une couche d’exécution qui regroupe l’appel des modèles, le routage déterministe, la reprise sur erreur et les métadonnées d’observabilité. Le point de départ était pratique : pouvoir changer de chemin sans réécrire l’application.

ApplicationAI RuntimeFournisseurs
Règles de routageAdaptateurs de fournisseurs
RepriseJournauxLatenceCoût estimé

Schéma de l’interface commune qui isole l’application des fournisseurs et des choix de déploiement.

V0

État du projet

V0 validée · pré-production

Les intégrations réelles, le fallback local vers distant et l’absence de contenu sensible dans les journaux ont été vérifiés. Il n’y a pas encore de déploiement multi-instance, de test de charge à grande échelle ni d’engagement de disponibilité.

Contexte

Un appel API devient vite une dépendance.

Au départ, brancher un modèle à une application est direct : un appel HTTP, une clé API, une réponse. Cette simplicité cache un couplage qui se révèle vite : la forme exacte de l’API du fournisseur, le nom du modèle, son comportement de retry, son coût, sa latence, ce qui quitte réellement la machine, et ce qui se passe quand ce chemin échoue. Sans couche intermédiaire, ces décisions se dispersent dans le code applicatif au lieu d’être posées une fois, explicitement.

Ce qui a été construit

Une interface commune et des règles explicites

  • Interface AIRuntime.generate() : un point d’entrée commun pour tous les appels de génération.
  • Adaptateurs par fournisseur : OpenAI, Anthropic, Mistral et Ollama derrière une même interface ; cloud et local traités de la même façon côté application.
  • Routage déterministe par politique : des politiques YAML décident du chemin exécuté plutôt qu’une sélection opaque.
  • Retry et fallback structurés : un nombre de tentatives défini, puis un chemin alternatif si le premier échoue.
  • Observabilité structurée : latence, fournisseur, chemin exécuté et coût estimé journalisés, sans prompt, réponse ni secret.

Architecture

Les politiques décident, les adaptateurs exécutent

L’application appelle le runtime ; une politique sélectionne un fournisseur et un modèle ; l’adaptateur traduit ensuite l’appel pour le fournisseur concerné. Les tentatives, la reprise et les métadonnées sont gérées autour de ce chemin, plutôt que dans chaque cas d’usage. Le Runtime n’essaie pas de masquer les différences entre fournisseurs : il impose un contrat commun autour duquel le routage, le retry et le fallback peuvent être testés une fois, plutôt que réimplémentés à chaque intégration.

ApplicationAI RuntimePolitique de routage
AdaptateursOpenAI · Anthropic · Mistral · Ollama

Choix et compromis : la souveraineté a un coût opérationnel

Les zones S0 Frontier, S1 Hybride et S2 Souveraine sont des conventions de routage internes, pas des labels. Elles expriment un niveau de confidentialité ou de performance visé par une politique ; elles ne constituent ni une certification ni une garantie de conformité réglementaire.

Le coût est estimé au mieux à partir des métadonnées renvoyées par chaque fournisseur. Les prix et le comportement des fournisseurs changent, et les paramètres de génération ne sont pas parfaitement interchangeables d’un fournisseur à l’autre.

Le mode local évite l’envoi du contexte vers un fournisseur distant : c’est un gain réel de contrôle sur la donnée. Mais sur la machine de test (un portable CPU-only, sans GPU), ce gain a un coût direct : qwen3:4b via Ollama répond en dizaines de secondes, contre quelques centaines de millisecondes pour Mistral dans le cloud. Ce n’est pas un verdict sur les modèles eux-mêmes, mais la démonstration d’un compromis matériel : la confidentialité locale se paie en latence sur du matériel contraint, et l’architecture doit rendre ce compromis explicite et réversible plutôt que de le masquer derrière une interface uniforme.

Validation

Mesurer les chemins réellement exécutés

Les intégrations Mistral et Ollama ont été exécutées en conditions réelles. Le fallback local → distant a été testé en rendant volontairement indisponible l’endpoint Ollama : les tentatives locales échouent, puis Mistral prend le relais sans intervention manuelle. Les journaux de métadonnées ont été contrôlés pour vérifier l’absence de prompts, de réponses et de secrets.

Les trois chemins ont exécuté les 10 requêtes du benchmark sans échec. En local, Ollama avec qwen3:4b affiche une moyenne de 29,5 s (p95 : 48,9 s), avec un écart marqué entre la requête la plus rapide (7,1 s) et la plus lente (53,8 s), signe d’une forte variance sur ce matériel. Interrogé directement, Ollama tourne à un débit de 6,46 jetons/s avec un premier chargement de 12,4 s, pour une moyenne quasi identique (30,3 s ; p95 : 43,7 s). Mistral répond en 447 ms de moyenne (p95 : 715 ms ; minimum 282 ms, maximum 851 ms). Ces chiffres ne classent pas les modèles entre eux : mesurés sur un Intel i7-8650U CPU-only, 4 cœurs / 8 threads, 16 Go de RAM, ils décrivent un compromis matériel (confidentialité locale contre latence cloud) dans cet environnement précis, pas une comparaison générale entre fournisseurs. Sur ce benchmark, le coût par requête Mistral était estimé entre 0,000006 $ et 0,0000084 $.

Limites connues

Pas encore un service de production

  • Maturité de production : pas de déploiement de production complet ni de SLA.
  • Échelle : pas de test de charge à grande échelle ni d’orchestration multi-instance.
  • Sécurité : pas d’audit de sécurité complet.
  • Télémétrie de coût : estimation au mieux, pas une facturation exacte.
  • Dépendance à l’environnement : les performances locales dépendent fortement du matériel et du modèle choisis ; le comportement et la tarification des fournisseurs peuvent évoluer.

Un projet similaire ?

Discutons-en.

Que ce soit pour une mission de conseil, un projet spécifique ou simplement échanger sur une idée, je suis à l’écoute.

Me contacter