LiteLLM¶
LiteLLM est un proxy open-source qui unifie l'accès à plusieurs APIs de LLM derrière une interface compatible OpenAI. Il est déployé sur le cluster de production pour centraliser et contrôler l'utilisation des modèles d'IA générative Scaleway par les applications.
Contexte et raison d'être¶
Scaleway ne fournit pas de mécanisme natif pour :
- Restreindre l'accès aux APIs par application — toute application ayant la clé API Scaleway peut appeler n'importe quel modèle
- Distinguer l'usage par application ou par environnement — impossible d'attribuer la consommation à un projet précis
LiteLLM répond à ces deux problèmes en jouant le rôle de proxy : chaque application reçoit sa propre clé API LiteLLM, avec les modèles autorisés explicitement définis. LiteLLM traçe l'usage par clé et transmet les requêtes à Scaleway avec la clé maître.
Architecture¶
Application (clé API LiteLLM propre à l'app)
↓ API compatible OpenAI
LiteLLM — cluster service, namespace litellm
↓ clé API maître Scaleway
Scaleway Generative APIs (modèles LLM)
Déploiement Terraform¶
| Run Terraform | Rôle |
|---|---|
infrastructure/main-infra/scw-service/terraform/032.vault-secrets |
Création des chemins Vault qui accueilleront les clés (projets externes uniquement) |
infrastructure/main-infra/scw-service/terraform/080.litellm_installation |
Installation de LiteLLM sur le cluster |
infrastructure/main-infra/scw-service/terraform/081.litellm_configuration |
Configuration des modèles et des clés API par application |
Mettre à jour la liste des modèles disponibles¶
La liste des modèles Scaleway disponibles est consultable ici : https://www.scaleway.com/fr/tarifs/model-as-a-service/
Elle est définie dans scw-init-config/001.config_infrastructure/terraform.tfvars sous la clé gen_apis_models_definition.
Après modification, appliquer le run 081.litellm_configuration.
Créer une clé API pour une application¶
Éditer scw-init-config/002.config_applications et définir :
generative_api_accessàtruegenerative_api_modelsavec les modèles souhaités (issus de001.config)
"app_name" = {
project_name = "app_name"
generative_api_access = true
generative_api_models = ["gpt-oss-120b", "mistral-small-3.2-24b-instruct-2506"]
}
Puis appliquer 081.litellm_configuration.
Cela crée automatiquement une entrée litellm_api_key dans Vault sous ademe/apps/<projet>/<env>, pour chaque environnement applicatif, à référencer dans les secrets du chart Helm de l'application.
Créer une clé API pour un projet externe¶
Un projet externe est un projet hébergé en dehors de l'infrastructure ADEME, auquel on ouvre l'accès aux services mutualisés — ici les APIs d'IA générative. Il n'a ni projet Scaleway, ni environnements int / rec / preprod / prod, ni arborescence ademe/apps/<projet> dans Vault. Il est donc déclaré à part, dans sa propre variable.
1. Déclarer le projet¶
Éditer scw-init-config/002.config_applications/terraform.tfvars, variable external_projects_config :
external_projects_config = {
"geco" = {
generative_api_access = true
generative_api_models = ["gpt-oss-120b"]
}
}
Contrairement à projects_config, il n'y a pas de clé project_name : la clé de la map fait office de nom de projet.
2. Appliquer les runs, dans l'ordre¶
# 002 : publie la config dans son state, lu par les deux runs suivants
cd infrastructure/main-infra/scw-init-config/002.config_applications && terraform apply
# 032 : crée le chemin Vault, vide
cd ../../scw-service/terraform/032.vault-secrets && terraform apply
# 081 : crée l'utilisateur LiteLLM et écrit la clé dans le chemin
cd ../081.litellm_configuration && terraform apply
032 avant 081
Le run 081 lit le chemin Vault avant de l'écrire, pour ne pas régénérer une clé déjà distribuée. Une lecture Vault sur un chemin inexistant échoue dès le plan : 032 doit donc être appliqué avant, une seule fois par projet externe.
Le run 032 crée le chemin avec une valeur vide et ignore ensuite son contenu (ignore_changes), ce qui lui évite d'écraser la clé écrite par 081 aux applies suivants. 081 conserve la clé déjà en place et n'en génère une nouvelle que si le chemin est vide — supprimer la valeur dans Vault est donc la façon de faire tourner une clé.
3. Récupérer la clé¶
| Applications internes | Projets externes | |
|---|---|---|
| Déclaration | projects_config |
external_projects_config |
| Nombre de clés | une par environnement | une seule |
| Utilisateur LiteLLM | <env>-<projet>-user |
ext-<projet>-user |
| Chemin Vault | ademe/apps/<projet>/<env> |
ademe/external_apps/<projet> |
| Accès Vault | APPSVC-Reader / -Operator / -Admin |
APPSVC-Admin uniquement |
Accès Vault volontairement restreint
Les policies APPSVC-Reader et APPSVC-Operator s'arrêtent au préfixe ademe/data/apps/* : elles ne couvrent pas ademe/external_apps/*. Seul APPSVC-Admin, dont la policy porte sur ademe/data/*, peut lire ces clés. C'est un choix : ces secrets ne sont consommés par aucun workload du cluster, ils sont transmis au tiers hors bande. Ouvrir l'accès aux autres rôles demanderait d'étendre le module scw-tf-modules/vault-oidc-global-policies.
Le préfixe external_apps étant hors de l'arborescence apps, il n'apparaît pas dans l'UI Vault pour les rôles non-admin.
Interface d'administration¶
L'UI LiteLLM est accessible à l'adresse : https://litellm.svc.ademe-scw.fr/ui/login/
La clé de connexion (master key) est stockée dans le secret Kubernetes litellm-masterkey-secret (namespace litellm).
TODO¶
- Implémenter les budgets et quotas par application (ressource Terraform déjà présente sous forme commentée — la complexité réside dans la définition de la structure de données par utilisateur)