ADRADR-0019 · Un seul moteur markdown dans le chat, et la 6 du SDK jusqu'a une eval verte

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

  1. Response (react-markdown + harden-react-markdown) est LE moteur markdown du chat. MessageResponse, StreamingCaret, streamdown et ses quatre plugins sont retires. Le paragraphe de patterns/CLAUDE.md qui gardait les exports morts reste vrai pour ceux qui ne coutent rien ; il ne couvre plus un export qui tire des dependances.
  2. 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 → instructions sur les 12 sites, allowSystemInMessages sur l'historique) rejoue pnpm evals avec un score au moins egal a celui de la 6 et exerce les trois canaux. Aucune migration partielle : deux majeures du SDK dans un meme node_modules doublent UIMessage et cassent @ai-sdk/react.

Alternatives écartées

OptionPourquoi non
Basculer Response sur StreamdownPerd 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'auditDouze 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 7C'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.json perd cinq dependances ; chat-elements-mounted.test.ts perd deux noms de sa liste d'heritage (elle ne peut que retrecir, c'est le sens prevu).
  • npx ai-elements@latest add message reintroduirait MessageResponse et son import de streamdown, 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.