@Atlas Channels API
Distribution layer for @Atlas across multiple channels.
Distribution layer for @Atlas across multiple channels.
Ce fichier vivait dans
src/app/api/channels/README.md. Le retrait du canal REST (security-identity/0271) a vide ce repertoire de tout code, etsrc/test/ownership-map-is-real.test.tsrefuse — a raison — qu'un repertoire ne contenant qu'un README soit revendique comme un module. Aucun des canaux decrits ici n'a jamais vecu sousapi/channels/: ils sont sous/api/chat,/api/webhooks/[platform]et/api/mcp/v1/.
Channels
| Channel | Status | Endpoint |
|---|---|---|
| Web | Built-in | /api/chat (existing) |
| Chat SDK | /api/webhooks/whatsapp (Vercel Chat SDK) | |
| API | Retire le 2026-09-05 | supprime, voir ci-dessous |
| MCP | Built-in | src/app/api/mcp/v1/ |
| Voix (Hume EVI CLM) | Built-in | /api/evi/chat/completions |
Ce que chaque canal reserve avant de streamer
Un canal metre est un canal qui reserve. La lecture simple
(getCreditBalance puis balance <= 0) est un read-then-allow : N tours
simultanes lisent le meme solde et chacun peut le depenser en entier, ce qui
laisse l'organisation a un decouvert complet par tour supplementaire.
reserveCreditsForChannel prend un verrou consultatif par organisation, relit
le solde dessous, et insere une ligne Credit de type hold avant de le
relacher : le tour suivant voit un solde deja diminue.
| Canal | Reservation | Regle |
|---|---|---|
Web (/api/chat) | evaluatePrestreamGate | holdId rendu par la porte pre-stream |
WhatsApp plateforme (bot-handlers.ts) | reserveCreditsForChannel | canal whatsapp |
WhatsApp par boutique (whatsapp-per-store.ts) | reserveCreditsForChannel | canal whatsapp-per-store |
Voix (/api/evi/chat/completions) | reserveCreditsForChannel | canal voice, depuis ai-platform/0274 |
La voix a ete le dernier chemin a ne faire qu'une lecture, et c'est celui ou la course est la plus facile a declencher : Hume ouvre une requete CLM par enonce.
Le canal voix exige un orgId resolu avant d'exister : GET /api/chat/voice
signe la session avec getOrgAccess / getStoreAccess, et refuse (403
NOT_A_MEMBER / STORE_NOT_IN_ORG) un appelant qui nomme une organisation ou
une boutique qu'il n'atteint pas. Avant ai-platform/0597 la route lisait
OrganizationMember a la main : le proprietaire d'une organisation heritee, qui n'a pas
de ligne membre, recevait une session signee VIDE, que le CLM servait sans
solde a debiter. Le micro fonctionnait, et personne n'etait facture.
Une reservation se regle sur les trois sorties, jamais sur une seule.
onFinish passe holdId a trackUsage, qui ecrit l'usage et supprime le hold
dans la meme transaction. onAbort fait la meme chose avec la somme des etapes
DEJA finies : le SDK n'appelle pas onFinish sur un abort, donc sans ce
rappel un plafond dur perdait a la fois la consommation partielle et la
reservation. onError libere, sauf si des etapes ont deja consomme des jetons,
auquel cas il facture ce partiel (voir
runtime/handler-error-settlement.ts). Un verrou usageSettled garantit une
seule ligne d'usage : une seconde serait un double debit reel.
Chat SDK (unified)
WhatsApp (and future platforms) use the Vercel Chat SDK (chat@4.23).
- Dynamic webhook:
src/app/api/webhooks/[platform]/
Le bot Chat SDK vit dans src/features/ai/bot/ :
bot.ts (singleton paresseux + adaptateur WhatsApp), bot-handlers.ts (prompt
@Atlas, outils de recherche, rate limit par thread, historique, persistance et
debit de credits) et whatsapp-per-store.ts (canal par boutique, scopes
Shopify). Cette section a affirme jusqu'au 2026-09-05 que ces fichiers
« n'ont jamais ete ecrits » : c'etait faux. Le webhook ci-dessus ne fait que
router vers eux ; ajouter une plateforme veut dire ajouter un adaptateur dans
bot.ts et un handler dans bot-handlers.ts.
TODO
WhatsApp Channel
- Meta Business Account setup + verification
- Dedicated WhatsApp phone number
- Environment variables (WHATSAPP_PHONE_NUMBER_ID, WHATSAPP_BUSINESS_ACCOUNT_ID, WHATSAPP_ACCESS_TOKEN, WHATSAPP_VERIFY_TOKEN)
- HMAC-SHA256 webhook signature validation (crypto)
- Conversation persistence (database)
- Conversation history in AI context (multi-turn)
- Message delivery status tracking (sent/delivered/read)
- Rate limiting (Meta allows ~80 msgs/sec)
- Media message support (images, documents)
- Human escalation flow (notify Christopher)
- Knowledge base injection (Shopify docs, BoostEcom FAQ)
- Credit deduction per message
- WhatsApp template messages for outbound (proactive)
- Error retry logic with exponential backoff
API Channel (retire)
POST /api/channels/api a ete supprime le 2026-09-05
(security-identity/0271). Sa seule authentification etait une credential
sk_ conservee dans une Map de processus : aucune cle n'a jamais survecu a
une frontiere de requete, donc la route a repondu 401 a chaque appel depuis le
jour de sa mise en ligne. La premiere case de cette liste, « API key validation
against database », n'a jamais ete cochee, et c'est exactement ce qui manquait.
La position publique est la meme : « Is there a REST API? Not yet, and we would rather say so than sell one. » Les surfaces programmatiques supportees sont le MCP par boutique, le MCP Intelligence public et l'API REST Intelligence avec ses propres cles.
Ce qu'un vrai canal REST exigerait avant d'exister a nouveau est ecrit dans
backlog/security-identity/0353 et la decision dans docs/decisions/0007.
- SDK client libraries (TypeScript, Python)
- Streaming SSE support
- Webhook callbacks for async responses
Database
ChannelDatabaseOperationsn'existe plus, etsrc/types/channels.tsnon plus (dead-code-duplication-10) : c'etait 284 lignes et 22 types exportes par le barrel globalsrc/types, zero implementation et zero lecteur, dont unWhatsAppWebhookPayloadque le vrai webhook (api/webhooks/[platform]) ne connaissait pas. Cette case a coche etait la seule reference au symbole dans tout le depot. Un futur provider definira son contrat la ou il vit, pas dans un barrel de types partage.
- Definir le contrat de persistance a cote du provider qui l'implemente
- SQL migrations for channels, conversations, messages tables
- Indexes for conversation lookup by external ID
- Message archiving and cleanup (90-day retention)
Platform UI
- Channel management page in team settings
- WhatsApp configuration wizard
- API key + channel binding UI
- Conversation viewer/dashboard
- Real-time message monitoring
- Analytics: messages/day, response time, escalation rate
Infrastructure
- Vercel deployment: webhook URL must be HTTPS
- Environment variable management
- Monitoring: webhook failures, API latency
- Logging: structured logs for debugging