Cost & Spend Tracking (Français)
Ce que c’est (et ce que ce n’est pas)
Section intitulée « Ce que c’est (et ce que ce n’est pas) »OmniRoute attribue un coût en USD à chaque requête de complétion en multipliant le nombre
de jetons par les tarifs du modèle. Ces chiffres alimentent le tableau de bord Coûts,
les commandes CLI omniroute cost / omniroute usage, les exportations CSV/JSON et les
budgets par clé API.
Le « coût » du tableau de bord est un indicateur d’économies, pas une facture. OmniRoute ne vous facture jamais — il achemine vos requêtes vers des fournisseurs que vous avez déjà connectés (vos propres abonnements, offres gratuites et clés API). Un « coût total de 290 $ » entièrement cumulé sur des modèles gratuits signifie qu’environ 290 $ n’ont pas été payés à une API payante. Ce chiffre est une estimation de ce que le même trafic aurait coûté aux tarifs catalogue standard, afin que vous puissiez voir où se concentre votre utilisation et combien l’acheminement vers des fournisseurs moins chers ou gratuits vous fait économiser.
Cette présentation est indiquée directement dans le fichier README du projet (« le “coût” du tableau de bord est un indicateur d’économies, pas une facture »).
Comme ce chiffre est une estimation :
- Il dépend de la grille tarifaire dont OmniRoute dispose pour chaque modèle. Un modèle
sans entrée tarifaire contribue un coût de
0(il apparaît comme une ligne « Ancien / Gratuit » dans l’explorateur). - Le trafic relevant d’une offre gratuite ou d’un abonnement cumule tout de même un coût estimé — il s’agit du montant que vous économisez, et non d’un montant dû.
Comment les coûts sont estimés
Section intitulée « Comment les coûts sont estimés »La source des tarifs
Section intitulée « La source des tarifs »Les coûts proviennent d’une grille tarifaire déterminée selon l’ordre de priorité suivant
(src/lib/pricingSync.ts) :
- Remplacements définis par l’utilisateur — les prix que vous définissez dans le tableau de bord ou via
PATCH /api/pricing. - Tarifs externes synchronisés — récupérés depuis le fichier public
model_prices_and_context_window.jsonde LiteLLM lorsque la synchronisation est activée (stockés dans un espace de nomspricing_synceddistinct afin de ne jamais écraser vos remplacements). - Valeurs par défaut codées en dur — fournies avec OmniRoute.
La synchronisation des tarifs externes est facultative et désactivée par défaut. Variables
d’environnement concernées (voir .env.example) :
| Variable d’environnement | Valeur par défaut | Rôle |
|---|---|---|
PRICING_SYNC_ENABLED |
false |
Active la synchronisation des tarifs LiteLLM en arrière-plan au démarrage. |
PRICING_SYNC_INTERVAL |
86400 |
Intervalle de synchronisation en secondes (quotidien par défaut). |
PRICING_SYNC_SOURCES |
litellm |
Liste de sources séparées par des virgules (seul litellm est actuellement pris en charge). |
La formule de calcul du coût
Section intitulée « La formule de calcul du coût »Le coût est calculé pour chaque requête à partir du nombre de jetons et des tarifs par
million de jetons dans
src/lib/usage/costCalculator.ts
(computeCostFromPricing / calculateCost) :
- Jetons d’entrée (moins les lectures du cache et les jetons de création du cache) × tarif
input. - Jetons lus dans le cache × tarif
cached(utilise le tarif d’entrée à défaut). - Jetons de création du cache × tarif
cache_creation(utilise le tarif d’entrée à défaut). - Jetons de sortie × tarif
output. - Jetons de raisonnement × tarif
reasoning(utilise le tarif de sortie à défaut).
Tous les tarifs sont interprétés en USD pour 1 000 000 de jetons. Un niveau de service
Codex "fast"/"priority" ou "flex" applique un multiplicateur de coût
(getCodexFastCostMultiplier) — par exemple, "flex" bénéficie d’une réduction de 50 %
sur les jetons, présentée comme des économies flex dans le tableau de bord.
Les noms de modèles sont d’abord normalisés (les préfixes de chemin de fournisseur tels
que openai/ ou accounts/fireworks/models/ sont supprimés) afin que les lignes
historiques correspondent toujours à un tarif.
Comment les dépenses sont enregistrées
Section intitulée « Comment les dépenses sont enregistrées »-
Le coût par requête est calculé après la réponse et enregistré sans attendre le résultat, afin de ne jamais ajouter de latence pour le client. La consommation du quota partagé est planifiée au prochain tour de la boucle d’événements via
src/lib/quota/spendRecorder.ts. -
Les dépenses des clés API sont mises en mémoire tampon et écrites par lots par
SpendBatchWriter(intervalle d’écriture par défaut de 60 s, mémoire tampon de 1 000 entrées). Paramétrable via :Variable d’environnement Valeur par défaut Rôle OMNIROUTE_SPEND_FLUSH_INTERVAL_MS60000Intervalle d’écriture en millisecondes. OMNIROUTE_SPEND_MAX_BUFFER_SIZE1000Nombre maximal d’entrées en mémoire tampon avant écriture.
Les chiffres de coût du tableau de bord ne sont pas lus depuis un montant en dollars stocké pour chaque ligne — ils sont recalculés à la volée à partir du nombre de jetons et de la grille tarifaire actuelle chaque fois que le point de terminaison analytique est exécuté. Cela signifie que la correction d’un tarif erroné (et une nouvelle synchronisation) met à jour rétroactivement les estimations de coûts historiques.
Tableau de bord : la page Coûts
Section intitulée « Tableau de bord : la page Coûts »La page Coûts se trouve à l’adresse /dashboard/costs
(src/app/(dashboard)/dashboard/costs/).
Sa vue principale est l’onglet Vue d’ensemble des coûts
(src/app/(dashboard)/dashboard/costs/CostOverviewTab.tsx),
qui charge toutes les données depuis GET /api/usage/analytics.
Ce qu’elle affiche :
- Tuiles de dépenses — dépenses estimées pour Aujourd’hui (1d), 7d, 30d et la
période sélectionnée. Sélecteur de période :
7d,30d,90d,all. - Indicateurs principaux — requêtes sur la période, fournisseurs actifs, modèles actifs, coût moyen par requête.
- Explorateur de coûts — un tableau triable/filtrable regroupé par fournisseur, modèle, clé API, compte ou niveau de service, avec le coût, les requêtes, les jetons, le coût moyen par requête et la part en % du total.
- Utilisation des jetons — jetons totaux / d’entrée / de sortie et ratio entrée:sortie.
- Efficacité du routage — nombre de replis, taux de repli et couverture du modèle demandé.
- Prévision mensuelle — projette les dépenses de fin de mois à partir de la moyenne quotidienne récente.
- Comparaison des périodes — variation en % entre la première et la seconde moitié de la période.
- Graphiques — tendance quotidienne des coûts, part des fournisseurs (camembert), principaux fournisseurs, principaux modèles, coût par clé API, coût par compte, profil d’utilisation hebdomadaire et carte thermique de l’activité.
- Exportation — téléchargement de la période actuelle au format CSV ou JSON (les boutons apparaissent dès que les données de coût sont non nulles).
Lorsqu’il n’y a aucun trafic tarifé, les lignes affichent une étiquette « Hérité / Gratuit »
au lieu de $0, conformément au modèle de suivi des économies.
Sous-pages associées aux coûts
Section intitulée « Sous-pages associées aux coûts »La section Coûts comprend également les pages suivantes (toutes sous
/dashboard/costs/) :
- Tarification (
/dashboard/costs/pricing) — consulter et remplacer les tarifs par modèle (affiche l’onglet Tarification partagé). - Budget (
/dashboard/costs/budget) — définir des limites de dépenses par périmètre (affiche l’onglet Budget partagé). - Partage de quota (
/dashboard/costs/quota-share) — pools de quotas partagés et vues du taux de consommation.
Points de terminaison de l’API
Section intitulée « Points de terminaison de l’API »Tous nécessitent une authentification de gestion (boucle locale/JWT, via
requireManagementAuth), sauf indication contraire.
Analyses de l’utilisation et des coûts
Section intitulée « Analyses de l’utilisation et des coûts »| Méthode | Point de terminaison | Objectif |
|---|---|---|
GET |
/api/usage/analytics |
Analyses complètes des coûts/de l’utilisation : résumé, tendance quotidienne, par fournisseur/modèle/clé API/compte/niveau. Requête : range, startDate, endDate, apiKeyIds, presets. |
GET |
/api/usage/utilization |
Utilisation des quotas par fournisseur au fil du temps. Requête : range (1h/24h/7d/30d), provider. |
GET |
/api/usage/history |
Lignes brutes de l’historique d’utilisation. |
GET |
/api/usage/call-logs |
Journaux d’appels par requête (modèle, jetons, coût, latence, statut). |
GET |
/api/usage/quota |
État des quotas des fournisseurs. |
GET |
/api/usage/proxy-logs |
Journaux des requêtes du proxy. |
| Méthode | Point de terminaison | Objectif |
|---|---|---|
GET |
/api/usage/budget |
Résumé des coûts + contrôle du budget pour une clé API (apiKeyId requis comme paramètre de requête). |
POST |
/api/usage/budget |
Définir les limites quotidiennes/hebdomadaires/mensuelles en USD + le seuil d’avertissement d’une clé API. |
GET |
/api/usage/budget/bulk |
Résumés groupés des budgets pour plusieurs clés API. |
L’API de budget est limitée à chaque clé API (
apiKeyId). Les limites renvoyées parGET /api/usage/budgetcomprennentdailyLimitUsd,weeklyLimitUsd,monthlyLimitUsd, unwarningThresholdet les totaux cumulés (totalCostToday,totalCostMonth, …).
Tarification
Section intitulée « Tarification »| Méthode | Point de terminaison | Objectif |
|---|---|---|
GET |
/api/pricing |
Tarification fusionnée actuelle (utilisateur + synchronisée + valeurs par défaut). ?includeSources=1 pour afficher la source de chaque entrée. |
PATCH |
/api/pricing |
Remplacer la tarification pour { provider: { model: { input, output, cached, … } } }. |
DELETE |
/api/pricing |
Réinitialiser la tarification aux valeurs par défaut (éventuellement limitée par ?provider=&model=). |
GET |
/api/pricing/defaults |
Afficher les tarifs de repli par défaut par million. |
GET |
/api/pricing/models |
Tarification indexée par modèle. |
POST |
/api/pricing/sync |
Déclencher une synchronisation manuelle depuis des sources externes (LiteLLM). |
GET |
/api/pricing/sync |
État actuel de la synchronisation. |
DELETE |
/api/pricing/sync |
Effacer toutes les données tarifaires synchronisées. |
Autres points de terminaison liés aux coûts
Section intitulée « Autres points de terminaison liés aux coûts »| Méthode | Point de terminaison | Objectif |
|---|---|---|
GET |
/api/free-tier/summary |
Total des jetons des modèles gratuits, utilisation du mois et quota gratuit restant. |
GET |
/api/quota/pools/[id]/usage |
Utilisation d’un pool de quotas partagés. |
La CLI d’OmniRoute fournit des commandes relatives aux coûts, à l’utilisation et à la tarification (enregistrées dans
bin/cli/commands/registry.mjs).
omniroute cost
Section intitulée « omniroute cost »Un rapport de coûts agrégé à partir de /api/usage/analytics.
omniroute cost # 30 derniers jours, regroupés par fournisseuromniroute cost --period 7d # 7 derniers joursomniroute cost --group-by model # regrouper par provider | model | combo | api-key | dayomniroute cost --since 2026-06-01 --until 2026-06-13omniroute cost --api-key <key> --limit 50Colonnes : groupe, requêtes, jetons en entrée/sortie, coût (USD) et % du total. Une ligne de total général
est affichée à la fin (masquée avec --quiet ou --output json).
omniroute usage
Section intitulée « omniroute usage »omniroute usage analytics --period 30d [--provider <id>] # récapitulatif des coûts par fournisseuromniroute usage logs [--limit 100] [--follow] [--api-key <k>] [--search <q>]omniroute usage quota [--provider <id>] [--check]omniroute usage utilization [--api-key <k>]omniroute usage history [--limit 100]omniroute usage proxy-logs [--limit 100]
# Budgetsomniroute usage budget listomniroute usage budget get [scope]omniroute usage budget set <amount> [--scope global] [--period monthly]omniroute usage budget reset [scope]omniroute pricing
Section intitulée « omniroute pricing »omniroute pricing list [--provider <p>] [--model <m>] [--limit 200]omniroute pricing get <model>omniroute pricing sync [--provider <p>] [--force] # POST /api/pricing/syncomniroute pricing diff [--model <m>]omniroute pricing defaults showomniroute pricing defaults set [--input <p>] [--output <p>] [--cache-read <p>] [--cache-write <p>]
pricing defaults showlitGET /api/pricing/defaults. Pour modifier plutôt les prix de modèles individuels, utilisez la page Tarification du tableau de bord ouPATCH /api/pricing.
Dépannage
Section intitulée « Dépannage »- Tous les coûts affichent 0 $ / « Legacy / Free ». Les modèles utilisés ne disposent d’aucune entrée tarifaire.
Activez la synchronisation externe (
PRICING_SYNC_ENABLED=true) et exécutezomniroute pricing sync, ou définissez les prix manuellement via la page Tarification /PATCH /api/pricing. - Le prix d’un modèle historique est incorrect. Corrigez le prix (par remplacement ou resynchronisation) — le coût est recalculé à partir du nombre de jetons à chaque lecture des données analytiques, les estimations sont donc mises à jour rétroactivement.
- Les dépenses sont actualisées avec un décalage par rapport au temps réel. Les dépenses par clé sont traitées par lots ; réduisez
OMNIROUTE_SPEND_FLUSH_INTERVAL_MSsi vous avez besoin de données plus récentes.
Pour savoir comment ces fonctionnalités s’intègrent au tableau de bord dans son ensemble, consultez le Guide de l’utilisateur et la Galerie des fonctionnalités.
HagiCode
HagiCode est un espace de développement agentique qui associe workflows structurés, exécution multi-agent et vues Hero Dungeon.
Transformez vos idées en logiciels utiles grâce à un workflow agentique plus intelligent, rapide et agréable.

- SmartDes workflows structurés transforment une intention en parcours exécutable, de l’idée à la livraison.
- EfficientLes workflows multi-agents font avancer recherche, réalisation et revue en parallèle.
- FunHero Dungeon rend les longues sessions de code plus visuelles et collaboratives.