Capacite du chat, 2026-09-23
Lecture du code de POST /api/chat. Pas une mesure de production : la checklist operateur a encore le drain de logs decoche, donc aucun chiffre ci-dessous n'est un p50 observe.
Lecture du code de
POST /api/chat. Pas une mesure de production : la checklist operateur a encore le drain de logs decoche, donc aucun chiffre ci-dessous n'est un p50 observe.
Verdict
Des milliers de comptes payants qui parlent peu, oui. Des milliers de tours en vol en meme temps, non.
Le hero marketing est un intake. Le prompt est remis au dashboard, et c'est
le dashboard qui appelle POST /api/chat. Un visiteur sur le site ne tient
pas une fonction de stream. Un onglet dashboard ouvert hydrate une fois
(GET des 100 derniers messages, plafond route 500) puis se tait.
useSharedChatPoll (intervalle 8 s) est exporte et n'a aucun appelant dans
src/.
Ce qui compte est le nombre de tours en vol. Modele, pas mesure : loi de
Little, L = (comptes / intervalle) * duree. Duree moyenne supposee 45 s.
| Charge | Tours en vol |
|---|---|
| 1 000 comptes, 1 message / 10 min | ~75 |
| 1 000 comptes, 1 message / 2 min | ~375 |
| 1 000 envois au meme instant | 1 000 |
| 1 organisation Pro, taille quelconque | 2 |
Ce que le code borne deja
| Garde | Ou | Valeur |
|---|---|---|
| Rate limit session | src/app/api/chat/route.ts | 20 POST / 60 s |
| Duree de fonction | meme fichier, maxDuration | 300 s |
| Plan payant | handler-entitlement.ts enforcePaidPlan | Free refuse avant le modele |
| Concurrence par org | PLAN_AI_CONCURRENCY | Pro 2, Max 5x 5, Max 20x 10, Custom -1. Free est a 1 mais n'atteint pas cette porte |
| Reserve de credits | credits-check.ts | pg_advisory_xact_lock par org, puis 3 SUM sur Credit |
| Boucle d'outils | handler.ts | stopWhen: stepCountIs(10) des qu'il y a des outils |
| Journal SSE | resumable-stream.ts | flush 250 ms, soit 4 ecritures Redis / s / tour. Reprise : 4 lectures / s. TTL 15 min. Aucun second debit |
| Slot de concurrence | ai-concurrency.ts | hash Redis, TTL 360 s. Redis illisible : le tour passe (fail open) |
| Messages | schema Message | index [conversationId, createdAt]. Parts plafonnees a 64 000 caracteres |
| Pool Postgres | database.ts | connectionTimeoutMillis 10 s. max non pose (defaut pg : 10). Pas de attachDatabasePool |
Il n'y a pas de file d'attente devant streamText. Un refus de concurrence
repond ai_concurrency_reached. Le debit du AI Gateway (RPM du provider)
n'est pas dans le depot : ai-concurrency.ts le dit, le provider ordonnance
son propre travail.
Ou ca lache
- Pic synchronise. Mille tours tiennent mille fonctions jusqu'a 300 s,
chacune pouvant enchainer 10 allers-retours modele, plus jusqu'a 5
handshakes MCP natifs si leur URL d'environnement est posee
(
config/native-mcps.ts: shopify-ai-toolkit, figma, higgsfields, le MCP de tendances, notion). Les sockets restent ouverts jusqu'a la fin du tour. - Une seule organisation. Le cap est par org, pas par personne. Mille membres sur Pro : 2 tours, le reste est refuse. Custom est illimite, et la le plafond redevient la plateforme.
- Temps avant le premier token. Le tour enchaine, en serie : gates,
contexte store, selection de skill, assemblage du prompt, handshake MCP,
fenetre glissante, reserve de credits. Le routeur de skill n'appelle
Haiku que si le regex est ambigu (
skills/router.ts). La fenetre, elle, attend ungenerateTextHaiku des que le client envoie plus de 15 messages (history.ts,keepLast10,summarizeAbove15). La conversation est immortelle (une par boutique, partagee, ou une par utilisateur sans boutique), donc ce seuil est l'etat stable d'un compte actif. - Redis du journal. 4 ecritures / s / tour. A 200 tours : 800 commandes / s, avant les lectures de reprise. Le quota Upstash du compte n'est pas dans le depot.
- Neon au demarrage, pas pendant le stream. Les requetes sont seriees
et la connexion n'est pas gardee pendant les 300 s. Le risque est un
demarrage synchronise qui sature le pooler, puis un echec a 10 s
(
connectionTimeoutMillis).attachDatabasePoolest deja l'itemdata-platform/0528, statutready. Ne pas le reouvrir.
Suite
inbox/2958: un plafond global, ferme, devantstreamText.inbox/2959: sortir le handshake MCP et le resume Haiku du chemin du premier token.data-platform/0528: attacher le pool. Deja ouvert.
Fluid Compute est le defaut plateforme documente en juin 2026.
vercel.json ne pose pas "fluid". La checklist
docs/ops/vercel-dashboard-checklist.md etait encore decochee au 6
septembre. get_project sur prj_N4eSu9paeoSCQ7tEdfdLA7elzPln
(boostecom.app) ne renvoyait pas le drapeau le 23 septembre. Dernier
deploiement production lu ce jour-la : dpl_H1DRE5pY4BbkEud1M5dqk2x5wEj7,
etat READY, Node 22.x.