Notes de version AgentDoc – Avril 2026

Journal des modifications · 6 min de lecture

Une sĂ©rie courte et dense de corrections a Ă©tĂ© livrĂ©e dans AgentDoc (aussi connu sous le nom de agent doc, agentdocs, docedit) au cours du dernier sprint. Le thĂšme de cette fois est la justesse du moteur de rendu : des cas limites oĂč la sortie d'outil de l'agent Ă©tait techniquement valide mais oĂč la couche visuelle perdait des informations ou, pire encore, fabriquait des styles que l'agent n'avait pas rĂ©ellement demandĂ©s. Cinq correctifs, tous ciblĂ©s, sans modification de l'API.

1. Listes imbriquées : profondeur relative préservée pendant la normalisation

c62928c · fix(renderer): preserve relative depth in nested-list normalization

Lorsque l'agent Ă©mettait des listes ordonnĂ©es/non ordonnĂ©es imbriquĂ©es avec une indentation mixte, la passe de normalisation du moteur de rendu rĂ©duisait les profondeurs au niveau minimum prĂ©sent dans le markdown – ce qui signifiait qu'une liste de la forme 1. → 1.1. → 1.1.1. s'affichait comme trois Ă©lĂ©ments du mĂȘme niveau plutĂŽt que comme une arborescence. Le correctif fait passer le normaliseur du plancher absolu au dĂ©calage relatif : les diffĂ©rences de profondeur au sein du bloc sont prĂ©servĂ©es, seule l'indentation globale est normalisĂ©e.

Pourquoi cela compte pour les agents : de nombreux modÚles émettent des appels insert_text dont le contenu a été reformaté au niveau du LLM (par exemple un modÚle ayant appris l'indentation à 2 espaces alors que le document utilise 4 espaces). Le moteur de rendu doit respecter la structure, et non les espaces bruts.

2. Les classes de décoration se composent désormais au lieu de se remplacer

ddfb64a · fix(formatting): decoration-* classes compose instead of replacing

Auparavant, appeler apply_decoration(target, "decoration-underline") sur un span qui portait dĂ©jĂ  decoration-strikethrough Ă©crasait la classe existante. C'est la mauvaise sĂ©mantique : les dĂ©corations sont orthogonales (vous pouvez souligner et barrer le mĂȘme token), et notre docstring promettait exactement cela. Le bug provenait d'une unique affectation className = dans le setter de dĂ©coration, que nous avons remplacĂ©e par une gestion appropriĂ©e de classList qui ajoute sans supprimer les frĂšres de la mĂȘme famille.

3. Les outils apply_* ont désormais une sémantique TOGGLE correcte

8201f0a · fix(content_ops): implement TOGGLE on apply_* tools (matches docstrings)

La surface d'outils MCP annonçait un comportement de bascule sur apply_bold, apply_italic, apply_underline, etc. – ce qui signifie qu'un second appel sur la mĂȘme sĂ©lection devait retirer la mise en forme, et non l'appliquer en double. L'implĂ©mentation, cependant, Ă©tait toujours en mode activation. Le correctif introduit une vĂ©rification d'Ă©tat sur le span rĂ©solu et se ramifie : si la mise en forme est dĂ©jĂ  prĂ©sente et couvre entiĂšrement la sĂ©lection, elle est retirĂ©e ; si elle est absente ou partielle, elle est appliquĂ©e uniformĂ©ment.

Cela compte plus qu'il n'y paraßt. Les flux vocaux s'appuient fortement sur « en fait, annule ça » comme signal de répétition ; l'agent qui traduit cela en un second appel apply_bold fait désormais ce qu'il faut sans avoir besoin d'appeler un outil remove_format distinct. Nous avons supprimé deux allers-retours LLM d'un chemin courant.

4. Échappement du code en ligne Ă  l'intĂ©rieur des attributs [text]{.class}

1e32d70 · fix(renderer): rewrite [text]{.class} swallowed inside inline-code

La prĂ©-passe du moteur de rendu pour notre syntaxe d'attributs Ă©tendue s'exĂ©cutait avant l'Ă©tape markdown-vers-HTML, ce qui signifiait que des chaĂźnes comme `[text]{.foo}` apparaissant Ă  l'intĂ©rieur de code en ligne dĂ©limitĂ© par des backticks (c'est-Ă -dire la documentation littĂ©rale de la syntaxe) Ă©taient réécrites en spans stylisĂ©s au lieu d'ĂȘtre affichĂ©es comme du code. Nous ignorons dĂ©sormais la réécriture lorsque l'offset se trouve Ă  l'intĂ©rieur d'un span de code. Les pages de documentation – y compris celle-ci – s'affichent Ă  nouveau correctement.

5. Les classes decoration-* s'appliquent à n'importe quel élément

a05b44c · fix(frontend): style decoration-* classes on any element, not just span

Les rĂšgles CSS pour .decoration-underline, .decoration-strikethrough etc. Ă©taient cantonnĂ©es Ă  span.decoration-*. Cela fonctionnait pour le cas courant mais Ă©chouait lorsque l'agent appliquait une dĂ©coration Ă  un titre, un Ă©lĂ©ment de liste ou une cellule de tableau. Le correctif retire le qualificateur de nom d'Ă©lĂ©ment, de sorte que les dĂ©corations sont dĂ©sormais orthogonales au type d'Ă©lĂ©ment – cohĂ©rent avec le correctif de sĂ©mantique de bascule ci-dessus et avec la documentation.

La suite

Le prochain lot de travaux est en file d'attente autour des flux BYOK (apportez votre propre clĂ© API Gemini), ce qui nĂ©cessite d'apprendre Ă  la fenĂȘtre modale du frontend et Ă  la pastille d'Ă©tat du quota Ă  coexister avec les nouveaux modules byok_modal.js et quota_status.js. Ensuite, nous effectuerons une passe ciblĂ©e sur le routeur de chat, qui a accumulĂ© des branches.

Si vous souhaitez comprendre le raisonnement technique derriĂšre les dĂ©cisions de conception d'outils Ă©voquĂ©es ci-dessus, l' article sur la granularitĂ© des outils prĂ©sente le cadre que nous utilisons pour dĂ©cider si un comportement doit ĂȘtre un outil, un argument d'outil, ou poussĂ© dans la couche de raisonnement du LLM.

← GranularitĂ© des outils dans les agents LLM Suivant : Reconstruction de l'export PDF + DOCX →