ADR-0019 — Un seul moteur markdown dans le chat, et la 6 du SDK jusqu'a une eval verte
L'audit du chat du 2026-09-17 (docs/audits/2026-09-17-audit-chat-composer-et-moteur.md) a mis deux ecarts de version cote a cote, et ils n'ont pas la meme nature.
Statut
Accepté · 2026-09-17
Piliers : ai-platform, design-system
Contexte
L'audit du chat du 2026-09-17
(docs/audits/2026-09-17-audit-chat-composer-et-moteur.md)
a mis deux ecarts de version cote a cote, et ils n'ont pas la meme nature.
Deux moteurs markdown. Le chat rendait ses reponses avec Response
(react-markdown + harden-react-markdown, citations [N] par un plugin
rehype maison). Le depot installait aussi streamdown et ses quatre
plugins (@streamdown/{cjk,code,math,mermaid}), dont l'unique consommateur
etait MessageResponse : un composant vendu par npx ai-elements@latest,
exporte, et sans aucun appelant. Cinq dependances payees, injoignables, et
un second style de bloc de code qui ne rendait jamais. patterns/CLAUDE.md
avait decide de garder les exports morts d'ai-elements parce que la CLI
les remettrait (« Fighting the upstream generator is not cleanup »), ce qui
vaut pour un composant sans cout ; il ne vaut plus pour celui qui porte
cinq paquets.
AI SDK 7. ai@7.0.0 est publie depuis le 2026-06-25 (7.0.105 au
2026-09-17), avec @ai-sdk/react@4, @ai-sdk/anthropic@4,
@ai-sdk/gateway@4. Le depot est en ai@6.0.285 / @ai-sdk/react@3.0.288
apres les patchs pris dans la meme PR. Ce que la 7 change pour ce depot,
lu dans la doc de migration : system: devient instructions: sur
generateText / streamText (12 sites ; l'alias deprecie est encore
accepte), CallSettings scinde en LanguageModelCallOptions +
RequestOptions, un message system dans messages[] refuse par defaut
(allowSystemInMessages: true pour l'historique persiste), Node 22
minimum (le depot y est), ESM seulement. Un codemod officiel existe
(npx @ai-sdk/codemod v7). Trois canaux consomment le SDK : le chat web,
WhatsApp (bot-handlers.ts), la voix Hume EVI (/api/evi/chat/completions).
Décision
Response(react-markdown+harden-react-markdown) est LE moteur markdown du chat.MessageResponse,StreamingCaret,streamdownet ses quatre plugins sont retires. Le paragraphe depatterns/CLAUDE.mdqui gardait les exports morts reste vrai pour ceux qui ne coutent rien ; il ne couvre plus un export qui tire des dependances.- Le depot reste sur la ligne 6.x du SDK, patchs pris a chaque PR qui la
touche, jusqu'a ce qu'une PR de migration en une fois (codemod,
system→instructionssur les 12 sites,allowSystemInMessagessur l'historique) rejouepnpm evalsavec un score au moins egal a celui de la 6 et exerce les trois canaux. Aucune migration partielle : deux majeures du SDK dans un memenode_modulesdoublentUIMessageet cassent@ai-sdk/react.
Alternatives écartées
| Option | Pourquoi non |
|---|---|
Basculer Response sur Streamdown | Perd harden-react-markdown (prefixes d'images et de liens autorises) et le plugin rehype des citations [N], pour des plugins (math, mermaid, CJK) que les reponses e-commerce n'exercent pas. Le rendu qui marche est celui qui reste. |
| Garder Streamdown installe « au cas ou » | Cinq paquets, un composant sans appelant, deux styles de bloc de code : c'est la definition d'une incoherence, et knip ne la voyait pas parce que l'export etait atteignable. |
| Migrer en AI SDK 7 dans la PR de l'audit | Douze sites de prompt, trois canaux, un codemod a relire : c'est une PR a part, avec ses evals, pas un item glisse dans un correctif de toolbar. |
| Ne rien decider sur la 7 | C'est l'etat qui a coute l'audit : un retard et un choix se ressemblent de l'exterieur. Une ligne ecrite suffit a les distinguer. |
Conséquences
package.jsonperd cinq dependances ;chat-elements-mounted.test.tsperd deux noms de sa liste d'heritage (elle ne peut que retrecir, c'est le sens prevu).npx ai-elements@latest add messagereintroduiraitMessageResponseet son import destreamdown, qui echouerait au build : c'est voulu, le build dit alors qu'une decision existe.- Le signal pour revisiter le point 2 : une fonctionnalite de la 7 dont un
item a besoin (approbations d'outils durables,
WorkflowAgent), ou la fin du support 6.x annoncee par Vercel. L'un ou l'autre ouvre l'item de migration ; rien d'autre ne le fait.