Audits · septembre 2026Capacite du chat, 2026-09-23

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.

ChargeTours en vol
1 000 comptes, 1 message / 10 min~75
1 000 comptes, 1 message / 2 min~375
1 000 envois au meme instant1 000
1 organisation Pro, taille quelconque2

Ce que le code borne deja

GardeOuValeur
Rate limit sessionsrc/app/api/chat/route.ts20 POST / 60 s
Duree de fonctionmeme fichier, maxDuration300 s
Plan payanthandler-entitlement.ts enforcePaidPlanFree refuse avant le modele
Concurrence par orgPLAN_AI_CONCURRENCYPro 2, Max 5x 5, Max 20x 10, Custom -1. Free est a 1 mais n'atteint pas cette porte
Reserve de creditscredits-check.tspg_advisory_xact_lock par org, puis 3 SUM sur Credit
Boucle d'outilshandler.tsstopWhen: stepCountIs(10) des qu'il y a des outils
Journal SSEresumable-stream.tsflush 250 ms, soit 4 ecritures Redis / s / tour. Reprise : 4 lectures / s. TTL 15 min. Aucun second debit
Slot de concurrenceai-concurrency.tshash Redis, TTL 360 s. Redis illisible : le tour passe (fail open)
Messagesschema Messageindex [conversationId, createdAt]. Parts plafonnees a 64 000 caracteres
Pool Postgresdatabase.tsconnectionTimeoutMillis 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

  1. 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.
  2. 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.
  3. 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 un generateText Haiku des que le client envoie plus de 15 messages (history.ts, keepLast 10, summarizeAbove 15). 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.
  4. 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.
  5. 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). attachDatabasePool est deja l'item data-platform/0528, statut ready. Ne pas le reouvrir.

Suite

  • inbox/2958 : un plafond global, ferme, devant streamText.
  • 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.