Espaces de travail AI Workspace

Un palier d'espace de travail tient dans une chaîne sur votre compte, et un enregistrement de configuration décide de son prix.

L'échelle compte huit paliers avec la catégorie ai_workspace dans PLAN_OBJ (config.json:2206 pour le palier gratuit, puis :2225, :2245, :2265, :2285, :2305, :2325 et :2345). Chacun porte id, name, storage, category, price, ai_credits, size, price_id et un tableau features de sept phrases marketing, plus un member_price_id sur les sept paliers payants, et rien d'autre. Aucun rank, aucun price_note, aucun flags, dans un objet où six autres catégories portent un rank, treize portent des flags et une porte un price_note. Le palier lui-même est le champ ai_workspace_plan sur le document de compte dans xuda_accounts, initialisé à free_ai_workspace à la création du client Stripe (stripe_module:2213 et :4823) et accompagné d'un horodatage ai_workspace_plan_changed à chaque changement. Chaque prix, chaque nombre de crédits et chaque étiquette de stockage sur cette page sont lus directement dans ces huit paliers. Le nombre de jetons qu'un crédit permet d'acheter ne l'est pas, car il ne peut pas l'être : la formule est dans le dépôt, le total d'usage faisant autorité provient d'une fonction de liste CouchDB qui ne l'est pas, et le code recale l'un pour atteindre l'autre. C'est pourquoi cette page le dit plutôt que de deviner.

Huit paliers, de 0 $ à 230 $
Prix par crédit, de 0,0400 $ à 0,0230 $
Pas de chiffre crédits par jeton, et voici pourquoi
Un palier d'espace de travail tient dans une chaîne sur votre compte, et un enregistrement de configuration décide de son prix.
8

Paliers ai_workspace dans PLAN_OBJ de config.json

4 sur 8

Identifiants de palier dont le chiffre ne correspond pas aux crédits accordés

7

Points d'appel qui créditent le grand livre, et aucun n'est un palier d'espace de travail

2

Paliers dont l'identifiant de prix Stripe est encore un placeholder TODO

Une rectification

La version de cette page que vous avez peut-être lue est erronée à quatre endroits, dont le titre.

La page publiée s'ouvre sur le routage de modèle, et cette affirmation ne survit pas à la lecture de la fonction sur laquelle elle repose. Trois autres de ses affirmations non plus. La colonne de gauche paraphrase ce que dit cette page plutôt que de la citer ; la colonne de droite est la source, avec le fichier et les lignes. Tout ce qui suit ce bloc s'appuie uniquement sur la seconde colonne.

Ce que dit la page publiée
Ce que dit la source
Routage de modèleChaque étape d'une construction est associée à un modèle adapté, si bien que le travail courant n'est pas facturé au tarif le plus élevé.La sélection automatique n'existe que dans une seule fonction, pick_dashboard_model (ai_module:11152-11163), appelée depuis une seule ligne sur le chemin de l'assistant de projet, avec deux issues possibles. Son palier fort retombe sur gpt-3 car strong_ai_model est absent de config.json, si bien que gpt-4 et gpt-5 ne sont jamais atteints automatiquement.
GPT-5.5GPT-5.5 est le modèle coûteux que le routage vous évite.GPT-5.5 n'est pas un nom de catalogue. C'est une clé d'alias à config.json:625 pointant vers le code gpt-5, dont l'identifiant de modèle réel est gpt-5.6-sol. L'alias aboutit bien à une entrée de catalogue active, donc rien n'est facturé à un tarif obsolète, mais ce nom n'est pas un modèle.
Le palier gratuitL'espace de travail gratuit accorde 30 crédits AI par mois.Ni mensuel, ni en un seul octroi. Un bonus d'accueil unique de 30 crédits (misc_module:938), plus 1 crédit de période toutes les 24 heures pour les comptes encore sur free_ai_workspace (account_module:9597). Les crédits de période ne se reportent pas ; le bonus d'accueil reste disponible jusqu'à ce qu'il soit dépensé.
Le tableau des paliersUn tableau de six paliers, avec les crédits et le stockage pour chacun.Six sur huit : 200_ai_workspace et 1500_ai_workspace sont absents. Les chiffres de crédits sont ceux d'avant la refonte, appliqués au stockage actuel, si bien que quatre de ses six lignes sous-estiment les crédits, et le tableau ne comporte aucun champ de prix.
Les huit paliers

Les huit paliers, tels que stockés.

Par ordre de prix, directement issu de config.json : gratuit 0 $ pour 30 crédits et 15 Go, 200_ai_workspace 8 $ pour 200 crédits et 100 Go, 400_ai_workspace 15 $ pour 400 crédits et 500 Go, 600_ai_workspace 25 $ pour 800 crédits et 1 To, 1500_ai_workspace 45 $ pour 1500 crédits et 2 To, 2000_ai_workspace 75 $ pour 2500 crédits et 3 To, 3000_ai_workspace 115 $ pour 4000 crédits et 5 To, 6000_ai_workspace 230 $ pour 10000 crédits et 10 To. Les sept paliers payants portent aussi un member_price_id à côté de celui affiché ici ; le palier gratuit est le seul sans aucun prix membre. Deux limites méritent d'accompagner le tableau plutôt que de figurer en dessous. La colonne stockage est une étiquette : le champ réellement lu par le code pour les droits est size, en octets, et les deux peuvent diverger. Et ce sont les copies du dépôt, connues pour diverger de la configuration maîtresse en production, donc traitez chaque chiffre comme non vérifié face à la plateforme réelle.

Prix mensuel
ai_credits sur le palier
Étiquette de stockage
Identifiant de prix Stripe
free_ai_workspace0 $US3015 GoUn identifiant de prix réel
200_ai_workspace8 $US200100 Goprice_LIVE_200_AI_WORKSPACE_TODO
400_ai_workspace15 $US400500 GoUn identifiant de prix réel
600_ai_workspace25 $US8001 ToUn identifiant de prix réel
1500_ai_workspace45 $US15002 Toprice_LIVE_1500_AI_WORKSPACE_TODO
2000_ai_workspace75 $US25003 ToUn identifiant de prix réel
3000_ai_workspace115 $US40005 ToUn identifiant de prix réel
6000_ai_workspace230 $US1000010 ToUn identifiant de prix réel
Un palier, tel quel

La clé dit 600. Le palier accorde 800.

Pour quatre des huit paliers, le chiffre dans l'identifiant est une étiquette historique plutôt que le nombre de crédits accordés. 600 accorde 800, 2000 accorde 2500, 3000 accorde 4000 et 6000 accorde 10000. Seuls gratuit, 200, 400 et 1500 restent cohérents avec leur propre clé. Ce qui s'est passé est visible dans le palier : la chaîne name a été mise à jour avec le nouveau chiffre et la clé est restée telle quelle, et le PlanCard du tableau de bord affiche name, si bien qu'un client ne voit jamais l'identifiant. Le commit 8a9b09673, daté du 2026-07-09, a effectué cette refonte et le dit dans son propre message : deux nouveaux paliers plus des hausses de crédits sur les échelons 600, 2000, 3000 et 6000. Rien dans le code n'extrait un chiffre de l'identifiant, donc l'écart est cosmétique pour le moteur d'exécution et dangereux uniquement pour les humains qui en écrivent la description.

config.json:2245-2256 . PLAN_OBJ, catégorie ai_workspace
"600_ai_workspace": {
"id": "600_ai_workspace",
"name": "800 AI Credits / 1 TB storage",
"storage": "1 TB",
"category": "ai_workspace",
"price": 25,
"ai_credits": 800,
"size": 1099511627776,
"price_id": "price_... un identifiant Stripe réel, omis ici",
"member_price_id": "price_... celui à 10 pour cent",
"features": [ sept phrases marketing, condensées sur cette ligne ]
}
la chaîne name a été mise à jour lors de la refonte . pointe vers la ligne name ci-dessus
la clé, elle, ne l'a pas été, et 600 n'est plus qu'une étiquette . pointe vers la ligne ai_credits ci-dessus
Le même schéma se répète à config.json:2265 (2000_ai_workspace, ai_credits 2500), :2285 (3000_ai_workspace, ai_credits 4000) et :2305 (6000_ai_workspace, ai_credits 10000). Un chiffre de plus mérite d'être mentionné pendant que le palier est ouvert : 6000 porte une taille de 10 737 418 240 000 octets, et get_effective_entitlements divise size par 1073741824, si bien que le chiffre livré est de 10 000 Go contre une étiquette annonçant 10 To.
Prix par crédit

Divisez chaque palier par lui-même : la remise de volume est de 42,5 pour cent, avec un palier plat au milieu.

Diviser un prix par le chiffre figurant dans l'identifiant du palier donne une courbe qui n'existe pas. Le diviser par ai_credits sur le même palier donne la vraie courbe, et elle est plus plate que ne le suggèrent les identifiants : de 0,0400 $ par crédit sur l'échelon payant le moins cher à 0,0230 $ sur le plus grand, soit un total de 42,5 pour cent de remise, répartie sur sept échelons plutôt que concentrée en haut de l'échelle.

  • Les sept échelons payants, prix divisé par ai_credits sur le même palier : 0,0400 $, 0,0375 $, 0,03125 $, 0,0300 $, 0,0300 $, 0,02875 $ et 0,0230 $.
  • La courbe est monotone mais plate à un endroit. 45 $ et 75 $ coûtent exactement le même prix par crédit, donc la seule raison de passer d'un échelon à l'autre est le téraoctet supplémentaire et le plafond plus élevé, pas un meilleur tarif.
  • L'avantage membre est une remise de 10 pour cent sur le même produit, portée sur chaque palier payant via member_price_id, appliquée tant que l'abonnement est payant, avec retour au prix standard dès son expiration (stripe_module:211-223). Les montants vivent dans Stripe et aucun champ de config ne les contient, donc cette page n'affiche aucun montant membre en dollars. NON VÉRIFIÉ.
  • Chiffres du dépôt uniquement. La configuration maîtresse en production est connue pour diverger, et config_dev.json tarife les deux mêmes identifiants, 200_ai_workspace et 1500_ai_workspace, à 1 100 $ et 3 500 $ pour des produits entièrement différents.
Prix par crédit, en dixièmes de cent
200_ai_workspace, 8 $
0,0400 $ par crédit
L'échelon payant le moins cher, et le crédit le plus coûteux de toute l'échelle
600_ai_workspace, 25 $
0,03125 $ par crédit
25 $ divisé par 800, pas par 600. L'identifiant donnerait un chiffre différent
2000_ai_workspace, 75 $
0,0300 $ par crédit
Identique à l'échelon 45 $ juste en dessous, le fameux palier plat de la courbe
6000_ai_workspace, 230 $
0,0230 $ par crédit
42,5 pour cent sous l'échelon à 8 $, et le plancher de toute l'échelle
Cumul

Sur un abonnement gratuit, le palier d'espace de travail que vous avez payé n'est pas comptabilisé du tout.

get_effective_entitlements n'ajoute le palier d'espace de travail à l'allocation d'abonnement que si membership_plan est défini et n'est pas la chaîne free (account_module:677-683). Sur un abonnement gratuit, le palier n'est jamais lu, donc ni son ai_credits ni son size ne sont ajoutés, et le compte reste sur l'allocation d'abonnement gratuit de 30 crédits et 15 Go, quel que soit le palier d'espace de travail détenu. Le module complémentaire Drive juste en dessous est traité de façon délibérément opposée : il s'ajoute à tous les paliers d'abonnement, y compris gratuit (:686-689), avec un commentaire précisant que refuser un espace qui a sa propre ligne de facturation reviendrait à ne rien vendre du tout. La même fonction contient donc deux politiques, appliquées à deux modules complémentaires, à quelques lignes d'écart. La même condition d'abonnement payant conditionne aussi les deux modes d'images générées dans le créateur de site, gen_low et gen_high, qui exigent chacun un abonnement payant et un palier d'espace de travail non gratuit (ai_module:4608-4625). La limite se situe à l'autre bout du flux, et c'est elle qui décide si ce cas est même atteignable : nous n'avons pas vérifié si le passage en caisse empêche un compte à abonnement gratuit d'acheter un palier d'espace de travail. NON VÉRIFIÉ.

Abonnement gratuit
Abonnement payant
ai_credits de votre palierNon lu. La branche à :677 ne s'ouvre jamais, donc le chiffre n'est ajouté nulle partAjouté à l'allocation d'abonnement comme droit affiché
Le stockage de votre palierNon lu non plus, même branche, donc aucun stockage n'est ajoutéAjouté, et size est le champ en octets, pas l'étiquette de stockage
Ce qu'il vous resteLa seule allocation d'abonnement gratuit : 30 crédits et 15 GoL'abonnement plus le palier d'espace de travail détenu par le compte
Le module complémentaire DriveS'ajoute quand même, sur tous les paliers y compris gratuit (:686-689)S'ajoute de la même façon, par le même chemin inconditionnel
Images générées dans le créateur de sitegen_low et gen_high tous deux refusés (ai_module:4608-4625)Les deux modes disponibles sur un palier d'espace de travail non gratuit
Des jetons au solde

Le chiffre qui devient votre solde est calculé en dehors de ce dépôt.

Cinq étapes séparent un appel de modèle du chiffre lu par le portail, et la quatrième n'est pas dans ce dépôt. Les trois premières sont : un appel renvoie un objet d'usage, une fonction le tarife par rapport à une copie figée du catalogue, et un document atterrit dans une base de données. La quatrième est une fonction de liste CouchDB qui produit le total de période faisant autorité, et le code qui l'appelle indique clairement que le coût brut en jetons n'est pas l'unité de crédit rapportée par le grand livre. C'est pourquoi cette page n'affiche aucun chiffre crédits par jeton ni crédits par dollar. Non parce que le calcul serait difficile, mais parce que le dépôt définit la forme de la conversion, et quelque chose d'autre en définit l'échelle.

Ce qui est constaté, c'est la forme de l'écart, pas un chiffre qui le comble. Ce qui survit à cet écart est un seul ratio, et il est marqué : sur les cinq modèles texte, le tarif d'entrée s'étend de 0,05 à 5,00 par million de jetons et le tarif de sortie de 0,40 à 30,00 (config.json:520-619), soit un facteur 100 en entrée et 75 en sortie. La configuration ne nomme aucune devise nulle part, et les tarifs ne sont par million que parce que chaque consommateur divise par 1e6.
Ce qui est facturé

Une seule fonction écrit chaque charge, et son étiquette source est toute la piste d'audit.

Chaque facturation sur la plateforme est un unique appel à account_module.record_ai_usage, qui écrit un document docType ai_usage et diffuse le nouveau solde. Il n'existe pas de second chemin de facturation, ce qui signifie que la liste des étiquettes source est la liste de tout ce qui vous coûte quoi que ce soit. Cela signifie aussi qu'une omission est invisible : une surface qui n'appelle jamais cette fonction est gratuite, et rien dans le code ne précise si c'était voulu ou oublié.

  • Dix-sept points d'appel actifs : quinze dans ai_module, un à voice_module:3812 et un dans le proxy Xucode à http_module:327, portant seize étiquettes source distinctes entre eux. Deux des dix-sept ne peuvent jamais écrire de palier du tout, car ils ne fournissent aucun account_profile_info et la fonction lève une exception dès sa première ligne.
  • Le traitement des e-mails est facturé comme submit chat sur gpt-1, via deux points d'appel de synthèse, l'un pour un corps texte et l'autre pour un corps HTML (email_module:2885 et :2898). L'enrichissement de contact atteint le même compteur via quatre méthodes ai_module appelées depuis le chemin de contact : get_business_info, is_business_contact_has_person, get_person_info et get_name_from_email_addr.
  • Un appel vocal en temps réel accumule des jetons à chaque response.done et écrit un palier unique au raccroché, tarifé à voice-2, l'entrée la plus chère du catalogue. La transcription est mesurée tout autrement : 0 jeton en entrée et le nombre de caractères de la transcription retournée comme jetons de sortie, contre whisper-1. C'est ce que fait le code, et ce n'est pas un prix à la minute audio. Les deux fonctionnalités vocales sont désactivées dans la configuration.
  • L'effort de raisonnement est un argument par appel, pas une fonctionnalité de forfait ni un réglage utilisateur. Quatre valeurs, chacune avec ses propres délais de requête, et internal_ai_effort est absent à la fois de config.json et de config_dev.json, si bien que chaque tâche interne retombe sur sa valeur codée en dur. L'effort n'a pas de prix propre et ne joue sur la facture qu'à travers le nombre de jetons.
Étiquettes sous lesquelles une charge est enregistrée
submit chat, où atterrit aussi la synthèse d'e-mails
conversation chat, sur le modèle réglé pour l'agent, gpt-1 par défaut
execute codex request, toujours sur un code de catalogue réel
code run, le finaliseur en arrière-plan, modèle pris sur l'exécution
xucode run, écrit par le proxy qui mesure lui-même l'exécution
create image, sur img-1 ou img-2
transcribe, sur whisper-1, facturé au nombre de caractères de la transcription
avatar de profil, avatar virtuel, avatar d'agent et image de profil
appel vocal, un palier écrit à la fin de l'appel
Ce qui n'est pas facturé

La plus grande surface de chat de la plateforme vérifie votre solde et ne le débite jamais.

dashboard_chat appelle validate_credits_limit à ai_module:11513 et refuse à zéro crédit, et il n'y a de record_ai_usage nulle part dans son corps, de la ligne 11340 à la ligne 12142. Il lit le solde et ne le modifie jamais. chat_studio n'a ni le portail ni l'enregistrement : il exécute un plugin npm privé dans un NodeVM dont tout l'environnement se limite à couch, app_id, uid, userName et agent_info, et la OPENAI_API_KEY appartenant à la plateforme est injectée dans la configuration du plugin. La création et la modification de plugins AI passent par ce même constructeur. misc_module.submit_chat_gpt_prompt est un second client OpenAI sans aucune facturation. Deux limites méritent d'être signalées ici. Le paquet du constructeur est un npm privé, absent de ce dépôt, donc savoir s'il se mesure lui-même par une voie invisible ici est NON VÉRIFIÉ ; rien dans le bac à sable qui lui est confié n'en fournit une. L'absence de portail et d'enregistrement côté Xuda est vérifiée par la lecture des fichiers. Et rien nulle part n'indique si dashboard_chat est censé être gratuit ou s'il lui manque un appel.

Refuse à zéro crédit
Écrit un palier d'usage
dashboard_chat, l'assistant de projetOui, validate_credits_limit à ai_module:11513Non. Rien entre les lignes 11340 et 12142
chat_studio, le constructeur d'applications StudioAucun portail nulle part sur le cheminAucun enregistrement. Le plugin s'exécute dans un NodeVM avec la clé de la plateforme
Création et modification de plugins AIAucun portail. Même constructeur, même cheminAucun enregistrement côté Xuda de l'appel
misc_module.submit_chat_gpt_promptAucun portail. Un second client OpenAI entièrement distinctAucune facturation d'aucune sorte
Les deux appels d'images de vêtementsNon contrôlésException immédiate : pas d'account_profile_info (account_module:9477)
Le grand livre

Sept portes créditent un compte, et votre palier d'espace de travail n'en fait pas partie.

Le solde dépensable n'est pas un chiffre de droits. C'est un grand livre : documents d'octroi actifs moins usage enregistré, et la seule façon d'y faire entrer un crédit est un appel à record_ai_credit. Il existe exactement sept points d'appel de ce type dans cpi, et tous les sept arrivent ici comme des flèches entrantes, regroupées sur les cinq lignes au-dessus de la ligne de séparation. La sixième ligne est le palier d'espace de travail lui-même, qui atteint le droit affiché et s'arrête là, parce que les deux chemins d'octroi pilotés par forfait testent d'abord la catégorie et refusent tout ce qui n'est pas un abonnement.

Une recherche exhaustive de record_ai_credit( dans cpi renvoie exactement sept points d'appel, et ce sont ceux listés ci-dessus. Le mécanisme derrière ce refus mérite d'être nommé précisément, car ce n'est pas tant une exclusion délibérée qu'une incompatibilité de forme : les deux chemins pilotés par forfait lisent plan.features?.ai_credits, que seuls les paliers d'abonnement portent sous forme d'objet. Sur un palier d'espace de travail, features est un tableau de sept phrases marketing, si bien que cette lecture renvoie undefined. Ceci est lu depuis le code source et n'a pas été confirmé face à un grand livre de compte payant réel en production. NON VÉRIFIÉ, et l'affirmation la plus délicate de toute cette page, dans les deux sens.
Report

Deux bassins, et un seul survit à la fin d'un mois.

Chaque document de crédit porte un kind, et il en existe deux (CREDIT_KIND, account_module:9532-9536). La dépense est prélevée en priorité sur le bassin de période, ce qui est le détail qui décide de tout le reste : le bassin qui expire est celui qui se vide en premier, si bien qu'un pack acheté est toujours là quand l'allocation de forfait est retirée. Les crédits de période sont l'allocation pour une fenêtre de facturation, et la fenêtre est la période de facture Stripe quand elle est estampillée et courante, sinon le mois calendaire.

Un détail joue en sens inverse, et il a sa place ici plutôt qu'en note de bas de page : le dépassement au-delà de l'ancienne allocation est imputé au bassin de recharges lors du renouvellement, si bien que des crédits achetés peuvent absorber un dépassement sur des crédits accordés, et cela ne peut pas être récupéré le mois suivant. Une seconde limite pèse sur le bassin censé être permanent. ai_credit_packs n'existe que dans config_dev.json, à 100 crédits pour 10 $, 500 pour 45 $ et 1200 pour 100 $, et la clé est absente de config.json, si bien que purchase_ai_credits rejetterait chaque identifiant de pack qui s'y trouve (stripe_module:3305). On ignore si la configuration de production réelle porte cette clé.
Le refus

Les mots exacts que vous recevez, et lequel est le vôtre.

_SCOPE_REASON est une table de six entrées à account_module:8934-8941. Le portail choisit l'entrée du grand livre quand la première clé de dépassement est ledger, et sinon l'entrée nommée par la portée du dépassement, avec repli sur la chaîne pool. Les refus de gel et d'accès au modèle ne proviennent pas du tout de cette table : ils portent leurs propres chaînes et leur propre block_kind. Deux surfaces reformulent le refus pour le client plutôt que de transmettre la chaîne brute, le créateur de site à ai_module:4597-4599 et l'assistant de projet à :12093. La première ligne ci-dessous, en minuscules et peu grammaticale, est la chaîne historique, et c'est celle que reçoit un compte ordinaire, car seuls Team et au-dessus peuvent enregistrer des règles, et un compte sans règles emprunte la branche ledger.

portée ledger . la chaîne historique, et le compte par défaut reçoit celle-ci
ai credits reach to hard limit
portée pool
Your account has reached its AI credit limit.
portée profile
This profile has reached its AI credit limit.
portée user
This member has reached their AI credit limit.
portée model
This model has reached its AI credit limit.
portée source
This action has reached its AI credit limit.
absent de cette table . gel, block_kind freeze
This profile is paused.
This member is paused.
absent de cette table aussi . accès modèle, règle de profil vérifiée en premier
This model is not allowed for this profile.
et ce que dit le créateur de site à la place, ai_module:4599
You’re out of AI credits. Top up to keep generating.
et l'assistant de projet, ai_module:12093
You’re out of AI credits. Top up to keep chatting.
Seul un blocage dur envoie l'e-mail au propriétaire, dédupliqué en mémoire une fois par propriétaire, portée et jour UTC, avec l'objet « AI credit limit reached ». Le gel et le refus de modèle reviennent avant l'appel d'alerte, donc aucun des deux n'envoie jamais d'e-mail.
Le portail

Une seule fonction, un ordre fixe, et elle échoue en laissant passer.

Chaque appel AI passe par account_module.evaluate_credit_gate(req), qui prend uid, profile_id, model et source (account_module:8955-9035). ai_module.validate_credits_limit est un adaptateur léger qui transforme un blocage en erreur portant credit_limit_error. Le gel intervient avant toute lecture d'usage, donc il agit dès le prochain appel, tandis qu'un dépassement de plafond est comparé à un chiffre mis en cache. L'accès au modèle a trois modes : off ne bloque rien, deny bloque les codes listés, allow bloque tout ce qui n'est pas listé, et une liste allow vide ne bloque rien. Les cinq plafonds sont comparés avec supérieur ou égal, si bien qu'une limite dure de N refuse dès N. Tout dépassement dur refuse avec la première raison rencontrée tout en signalant aussi les dépassements souples ; un dépassement uniquement souple renvoie block false et l'appel s'exécute.

Trois limites méritent d'accompagner ce schéma. Les plafonds par portée sont servis depuis un cache en mémoire de 45 secondes, si bien qu'un dépassement de plafond peut être aussi obsolète, alors que le gel et l'accès au modèle ne le sont pas. L'agrégation par modèle et par source parcourt jusqu'à 200 000 documents bruts sur un champ imbriqué sans index Mango, et le code indique qu'il faut en ajouter un avant tout déploiement en production. Et docs/ishai_ui_requests.md:168 enregistre cette fonctionnalité comme vérifiée en développement, avec la configuration de production préparée mais non déployée au 2026-07-22. NON VÉRIFIÉ en production.
Gestion des crédits

La gestion des crédits commence à Team, et deux lignes de sa propre communication publiée en exagèrent la portée.

_is_team_tier compare le rang du forfait du compte à celui de team (free 0, pro 1, team 2 à 149 $, agency 3, enterprise_t1 à t3 de 4 à 6), et set_credit_rules refuse tout ce qui est en dessous avec la chaîne exacte « Credit management is available on the Team plan. » (:9339). get_credit_management est lisible sur n'importe quel forfait et renvoie can_edit false, ce qui explique pourquoi un compte Free ou Pro voit la page d'incitation à l'achat et non l'éditeur. Un conflit à signaler plutôt qu'à répéter : la configuration déclare min_plan « pro » sur set_credit_rules, si bien qu'un compte Pro franchit le portail de la méthode avant d'être refusé par le code. Team est l'affirmation exacte.

  • Ce qui persiste réellement : une limite d'avertissement et une limite d'arrêt sur le bassin, sur chaque profil et sur chaque membre ; le gel par profil et par membre ; une liste d'autorisation ou de refus de modèle sur les deux ; deux canaux d'alerte. L'enregistrement transmet l'objet de règles complet via set_credit_rules.
  • Le pourcentage n'est autorisé que sur pool, profile et member. Les plafonds de modèle et de source sont forcés en crédits absolus par le normaliseur, les valeurs au-dessus de 100 sont plafonnées à 100, et le pourcentage se calcule contre get_effective_entitlements().ai_credits, l'allocation de forfait. L'indication « environ N crédits » de l'éditeur est calculée à partir de l'octroi réel du grand livre, si bien que cette indication est une estimation et non le chiffre effectivement appliqué.
  • Les puces de seuils d'alerte sont inertes. rules.alerts.thresholds est initialisé par défaut à [80, 100], normalisé, enregistré et affiché sous forme de puces à 50, 75, 80, 90 et 100 pour cent, et aucun chemin de code ne le lit. Les alertes se déclenchent sur la limite souple configurée. credit.vue:135, qui promet des alertes à ces pourcentages, est une ligne à ne pas croire.
  • Les plafonds par action sont le contrôle le plus faible ici. Cinq chaînes source sont jamais transmises au portail, et seules deux d'entre elles, voice call et xucode run, correspondent à une étiquette sous laquelle un usage est réellement enregistré, si bien que les trois autres consultent une clé sans aucune dépense et ne se déclenchent jamais. L'éditeur a cessé de les exposer le 2026-08-11, ils sont conservés mais non modifiables.
Ce qu'un propriétaire Team peut réellement enregistrer
Une limite d'avertissement et une limite d'arrêt sur le bassin du compte
La même paire sur un profil donné
La même paire sur un membre donné
Un pourcentage du droit de forfait au lieu d'un nombre de crédits, sur ces trois-là
Gel sur un profil, bloquant chaque appel AI qui en provient
Gel sur un membre, vérifié juste après le profil
Une liste d'autorisation ou de refus de modèle, par profil et par membre
Deux canaux d'alerte, dans l'application via websocket et par e-mail au propriétaire
Changer de palier

Monter est facturé aujourd'hui. Descendre n'est jamais facturé, et le changement prend effet en fin de période.

La direction n'est pas déclarée par l'appelant. _change_direction la détermine, et comme les paliers ai_workspace ne portent aucun rank, le comparateur retombe sur le prix numérique (stripe_module:335-386). Les deux sens de cette comparaison ne se comportent pas du tout de la même façon. Une montée en gamme est de l'argent immédiat et un échange sur une facture payante. Une descente en gamme est un échéancier d'abonnement Stripe, rien de facturé, rien de crédité, et un marqueur que l'écran de facturation lit pour afficher un changement en attente avec un bouton d'annulation à côté.

Aucun des deux chemins n'écrit ai_workspace_plan. Le champ est écrit plus tard, par customer.subscription.updated, qui parcourt chaque ligne de l'abonnement consolidé et fait correspondre chaque prix à un palier via price_id ou member_price_id (:1611-1630, :1707-1735). Comme la direction suit l'ordre des prix, cela coïncide avec l'ordre des identifiants dans config.json, mais pas dans config_dev.json. Lu uniquement depuis le chemin de code. Aucun échéancier Stripe réel n'a été créé ni observé. NON VÉRIFIÉ.
Où le palier est écrit

Un point d'entrée change un palier, et il n'écrit jamais lui-même le champ.

Le palier est une seule chaîne sur le document de compte, ai_workspace_plan, portant la clé PLAN_OBJ, initialisée à free_ai_workspace à la création du client Stripe. Trois éléments le déplacent, et un seul l'écrit réellement. À retenir pour la troisième carte : pour toute autre catégorie, un identifiant de prix placeholder est transformé en un vrai prix Stripe issu du catalogue au premier achat, à partir d'une clé de recherche incluant le montant. ai_workspace emprunte une branche spécifique à :474-476 et :551-554 et lit le prix directement dans le palier de configuration, si bien que les deux identifiants TODO sont transmis à Stripe tels quels. Raisonné à partir du chemin de code, aucun achat n'a été tenté. NON VÉRIFIÉ.

  1. 01

    Le passage en caisse appelle une méthode

    checkout.vue:233-280 appelle stripe_update_plan pour chaque catégorie, et stripe_get_proration affiche l'aperçu selon la même classification, si bien que le devis affiché et la charge facturée sont calculés de la même façon. Aucun des deux n'écrit ai_workspace_plan. L'interface met à jour l'état local par catégorie et s'arrête là, et sur un changement planifié elle ne bascule délibérément pas le forfait.

  2. 02

    Stripe échange la ligne

    La ligne d'espace de travail sur l'abonnement consolidé est pointée vers le nouveau prix : le prix membre tant que l'abonnement est payant, le prix standard une fois expiré. Seule cette ligne est jamais touchée, ce qui évite qu'un changement d'espace de travail ne perturbe les lignes d'abonnement, de support ou de drive sur le même abonnement.

  3. 03

    Un webhook écrit la chaîne

    customer.subscription.updated synchronise le champ associé à la catégorie via _PLAN_FIELD_BY_CATEGORY et estampille ai_workspace_plan_changed (:358-370, :1733-1735). Rater ce webhook laisse le compte avec l'ancienne chaîne de palier alors que Stripe facture le nouveau. Le code porte une auto-réparation pour l'octroi de crédit d'abonnement, mais aucune pour ce champ, si bien que rien ne le remarque ni ne le corrige.

Limites honnêtes

Neuf choses que cette page ne vous dira pas, et pourquoi.

  • Chaque chiffre ici provient des copies du dépôt de config.json et config_dev.json, et la configuration maîtresse en production est connue pour diverger du dépôt, donc aucun chiffre de cette page n'est confirmé en production.
  • Il n'y a ci-dessus aucun chiffre crédits par jeton ni crédits par dollar, parce que la formule est dans le dépôt et l'unité faisant autorité se trouve dans un document de conception CouchDB qui ne l'est pas. Le code recale son propre chiffre brut vers cette vue, et cette étape de calibrage est la preuve que les deux diffèrent.
  • Le prix membre est une remise de 10 pour cent selon le commentaire à stripe_module:211-223, mais les montants vivent dans Stripe et aucun champ de config ne les contient, donc aucun montant membre en dollars n'est affiché.
  • Les échelons à 8 $ et 45 $ portent des identifiants de prix Stripe placeholder, et ai_workspace est la seule catégorie qui contourne le mécanisme de frappe automatique, donc ni l'un ni l'autre n'a sa place sur une page avec un bouton d'achat fonctionnel pour l'instant.
  • config_dev.json tarife ces deux mêmes identifiants à 1 100 $ et 3 500 $ pour 50 000 et 200 000 crédits. Le produit désigné par un identifiant dépend de la configuration chargée par le serveur.
  • Le ai_credits d'un palier d'espace de travail n'est jamais transmis à record_ai_credit. Il augmente le droit affiché plutôt que le solde dépensable, établi par recherche exhaustive et non confirmé face à un compte payant réel.
  • La gestion des crédits est enregistrée comme vérifiée en développement, avec une configuration de production préparée mais non déployée au 2026-07-22, et rien de lu cette session ne prouve un déploiement depuis.
  • Les puces de seuil d'alerte sont stockées et jamais lues, et les plafonds par action ne sont pas modifiables et ne correspondent à une étiquette d'usage enregistrée que pour deux des cinq chaînes source jamais transmises au portail.
  • La taille sur 6000_ai_workspace est de 10 737 418 240 000 octets, soit 10 000 Gio pour une étiquette de 10 To, et get_effective_entitlements la divise par 1073741824 et livre 10 000 Go.
Avant de vous engager

Les questions qu'une liste de prix vous pousse à poser

Sept réponses, chacune se terminant sur la limite qu'elle rencontre. Deux d'entre elles se terminent sur quelque chose que nous n'avons pas pu confirmer du tout, et elles le disent dans le même souffle que l'affirmation elle-même.

Enregistrement

L'enregistrement dont hérite cette page.

Ceci est l'enregistrement que le précédent document workspace_plans portait déjà dans son champ youtube, conservé ici plutôt que supprimé. Une page assemblée à partir de clés de configuration, de points d'appel et de chaînes de refus est un piètre moyen de suivre l'évolution du produit, et cet enregistrement est la partie de l'ancien document que rien dans cette réécriture ne remplace. Une règle pour le regarder. Là où l'enregistrement et cette page se contredisent sur un chiffre, c'est la page qui l'emporte, construite depuis le code source en août 2026, lue dans config.json et les modules cpi plutôt que reprise du texte précédent. Cette règle mérite sa place ici plutôt que d'être une simple politesse, car la version publiée de ce document listait six des huit paliers d'espace de travail et affichait les chiffres de crédits d'avant la refonte contre les étiquettes de stockage actuelles, ce qui laissait quatre de ses six lignes sous-estimer les crédits accordés. Elle ne comportait non plus aucun champ de prix. Un nom de palier ou un chiffre de crédits énoncés dans cet enregistrement peuvent donc être plus anciens que le palier qu'ils décrivent, et les tableaux ci-dessus reflètent ce que dit le fichier de configuration aujourd'hui.

Chaque chiffre de cette page a été lu en août 2026 dans les copies du dépôt de config.json et config_dev.json, ainsi que dans le code source des modules cpi qui les accompagnent. La configuration maîtresse en production est connue pour diverger du dépôt, donc lisez chaque chiffre comme fidèle au dépôt à cette date plutôt que comme une confirmation de production.

Ouvrez l'écran de forfait et lisez votre propre palier.

Votre palier d'espace de travail est une seule chaîne sur votre document de compte, ai_workspace_plan, portant la clé d'un palier dans le catalogue de forfaits. L'écran affiche le champ name de ce palier, ce qui explique pourquoi les mots que vous voyez portent le chiffre de crédits actuel alors que la clé en dessous peut encore porter l'ancien. Le solde affiché à côté est le grand livre, et vous savez désormais que c'est un chiffre différent, pour des raisons qui n'ont rien à voir avec ce que vous avez payé. Rien n'est facturé du simple fait de regarder. Une descente en gamme ne prélève aucun argent aujourd'hui, écrit un échéancier qui bascule en fin de période naturelle, et reste annulable jusqu'au bout. Une montée en gamme prévisualise la prochaine facture et vous indique le montant prorata avant de le facturer, et si cette charge échoue, le palier ne bouge pas. Deux points à vérifier pendant que vous y êtes. D'abord, si votre abonnement est gratuit, car le module complémentaire d'espace de travail ne s'ajoute que lorsque le forfait d'abonnement est défini et n'est pas gratuit, si bien que sur un abonnement gratuit ni ses crédits ni son stockage ne sont comptabilisés et le compte reste sur les chiffres d'abonnement. Ensuite, si l'échelon que vous consultez est l'un des deux dont l'identifiant de prix Stripe dans la configuration est encore un placeholder littéral se terminant par TODO, car la catégorie espace de travail est la seule catégorie qui ne crée pas de prix à la demande. Tout ce qui précède a été assemblé en lisant les données plutôt que le discours marketing, et l'écran que vous allez ouvrir lit les mêmes données.