Forfaits à allowance : ce que /usage vous montre désormais, et ce qui se passe à la limite


Manquer de quota, c’est agaçant. Ne pas savoir combien il en reste, c’est pire. Vous êtes en pleine échéance, la dernière réponse était bonne, et la suivante est refusée : limite atteinte. Quelle limite ? Celle du jour ou celle du mois ? L’allowance des grands modèles est-elle un compartiment séparé ? Quand revient-elle ? Ces réponses vivaient autrefois dans un tableau de bord web. PR #142308, fusionnée le 22 octobre 2026, les déplace dans le terminal.

Deux façons différentes de payer

Hermes a grandi avec un solde de credit : on recharge, on dépense, on s’arrête à zéro. Certains abonnements fonctionnent plutôt avec des usage windows — un jour, une semaine, un mois, plus une allowance séparée pour les grands modèles. Ce n’est pas un solde qu’on vide, c’est un quota qui se remplit.

La différence décide de l’interface. Un solde est un nombre ; un quota est un ensemble de gauges. Ce changement ne modélise donc pas les forfaits dans Hermes. Il dessine ce que le serveur envoie.

Autant de barres que le serveur en envoie

Les allowances arrivent de deux endroits, avec la même forme :

  • usage_window.gauges dans l’instantané du compte du Portal ;
  • l’en-tête de réponse x-nous-credits-window-gauges, qui accompagne aussi le refus 402.

Chaque gauge porte un scope qui indique ce qu’un gauge plein bloque :

  • scope: all — bloque tous les modèles payants (jour, semaine, mois, et toute allowance ajoutée plus tard peut utiliser ce scope) ;
  • scope: top_tier — bloque uniquement les modèles que le gateway marque comme top tier.

Un modèle gratuit n’est jamais bloqué : il ne consomme rien. Cette règle est en tête de agent/plan_limits.py, parce que la mention « épuisé » du sélecteur, la suggestion de la carte de limite et le bouton de bascule en un geste doivent tous s’accorder — une règle, une source.

Un commentaire dans agent/usage_gauges.py mérite d’être cité : Hermes ne garde ses propres mots que pour les ids qu’il connaît (ils sont traduits et ajustés à chaque surface) ; tout autre id affiche le label du serveur. Une nouvelle allowance côté serveur ne nécessite aucune release d’Hermes.

À quoi ressemble /usage maintenant

/usage était déjà la commande « combien cette session a-t-elle coûté » — tokens, coût estimé, fenêtre de contexte, durée, et une section de limites de compte quand le provider en expose une. Sur un forfait à fenêtres, elle affiche désormais une barre par allowance, avec le pourcentage utilisé et le temps avant réinitialisation.

Dans l’application Desktop, les mêmes données apparaissent sous Settings → Billing sous forme de gauges, à côté d’un interrupteur Keep going on credits : une fois une allowance épuisée, les credits rechargés peuvent-ils prendre le relais ? Cet interrupteur est le même réglage de compte que la bascule Billing → Topup du Portal — le Desktop n’est qu’une autre entrée vers ce réglage. Le modifier exige Remote Spending (billing:manage) sur ce terminal ; sans cela, le clic déclenche l’approbation elle-même, l’interrupteur reste sur la position demandée, et le changement s’applique une fois approuvé. Pas de boucle refuser, vérifier, recliquer.

Les sélecteurs de modèle retrouvent des étiquettes de prix

Sur un forfait à fenêtres, tous les modèles listés sont inclus, donc un prix par token serait du bruit. À la place, chaque ligne porte un mot : Free, Small, Medium, Large. Le gateway envoie ce mot par appelant via usage_level sur /v1/models ; Hermes ne fait que le traduire.

Autour de cela :

  • Les modèles recommandés viennent en premier ; le sélecteur du CLI divise la liste en « Recommended » et « Other models », tandis que les sélecteurs des plateformes de messagerie se contentent de mettre les recommandés en tête ;
  • Quand une allowance est épuisée, le sélecteur le dit une fois et indique quand elle se réinitialise ; les modèles bloqués sont grisés là où la plateforme le permet ;
  • Choisir un modèle Large affiche un avertissement unique : il consomme davantage de l’allowance mensuelle pour grands modèles.

Tout autre compte — credit-grant, paiement à l’usage, offre gratuite — ne reçoit rien de ce module. Leurs chemins de code restent inchangés.

À la limite, trois réponses au lieu d’une

Le refus était auparavant un générique « usage limit reached ». Il indique maintenant quelle allowance est épuisée, quand elle se réinitialise et ce qui fonctionne encore : jusqu’à deux modèles de la liste recommandée du forfait qui peuvent encore tourner. Les plateformes qui ont déjà des boutons les affichent comme des boutons ; tout le reste reçoit une phrase.

Une décision de conception mérite d’être copiée dans tout produit d’agent : Hermes ne change jamais de modèle de lui-même. Une limite d’usage window ne parcourt pas la chaîne de fallback — la chaîne de fallback existe pour « ce provider est en panne », pas pour « vous avez dépassé votre forfait ». Soit vous choisissez un modèle disponible, soit vous attendez la réinitialisation.

Deux détails propres aux canaux : les plateformes de messagerie renvoient vers le Portal plutôt que vers /topup (un bouton dans un chat pourrait dépenser l’argent du propriétaire du salon), et avec un pool de credentials, seul le modèle refusé est écarté jusqu’à la réinitialisation — pas toute la credential. Les autres modèles de cette clé continuent de fonctionner.

Compatibilité et limites

D’après la PR :

  • Sans forfait à fenêtres, chaque chemin de code est identique à avant ;
  • les en-têtes de réponse usage window et les codes de refus ne sont honorés que sur les routes Nous, un autre upstream ne peut donc pas déclencher cette UI ;
  • strictement additif : aucun comportement existant de config, d’API ou de CLI n’est retiré.

État de la release

PR #142308 a été fusionnée dans main le 22 octobre 2026 — plus de 200 fichiers, à travers le CLI, le TUI, le gateway et le Desktop. La dernière release reste v0.22.4 du 21 octobre : tout ceci n’existe donc que sur main jusqu’à ce que la prochaine release atteigne le canal stable.

Pour ne pas confondre les voisins : /usage reset échange des resets Codex bancarisés (voir cet article), Resetwatch est un plugin Desktop tiers qui réunit le quota restant de 14 plateformes sur un seul écran (voir cet article), et ce changement-ci est le support officiel des forfaits à allowance eux-mêmes. Pour le reste du comportement du sélecteur de modèle, la référence hermes model couvre les flags.