Passer au contenu principal
Tous les changements notables de ce projet sont documentés ici. Le format suit Keep a Changelog. Les versions correspondent aux jalons de la Roadmap.

[Unreleased]

Modifié

  • Les agents reconnaissent maintenant les erreurs de manière plus claire. Quand le résultat d’un outil contredit quelque chose qu’un agent a dit, il l’acknowledge et le corrige dans le même tour sans s’excuser excessivement ni remplir la réponse d’autocritique.

Sécurité

  • Blocage d’un contournement SSRF via les adresses IPv6 mappées IPv4. Une URL dont l’hôte était une adresse IPv6 mappée IPv4 (par exemple http://[::ffff:169.254.169.254]/) contournait la liste de blocage des adresses IP privées et pouvait accéder aux services internes — y compris les métadonnées d’instance cloud — sur les hôtes à double pile. Ces adresses sont maintenant dépliées et vérifiées par rapport à la liste de blocage IPv4, fermant la brèche sur tous les chemins protégés contre SSRF (récupération web, outil HTTP, connecteurs, importateur RAG).
  • Les URL des serveurs MCP SSE / Streamable-HTTP sont maintenant validées par SSRF. Un utilisateur authentifié pouvait pointer un serveur MCP vers une adresse interne et déclencher une requête vers celui-ci lors du test ou de la connexion du serveur. Les URL des serveurs sont maintenant validées à la création/mise à jour et à nouveau au moment de la connexion.
  • Les identifiants PostgreSQL de Docker Compose sont maintenant remplaçables via POSTGRES_USER / POSTGRES_PASSWORD / POSTGRES_DB. La valeur par défaut précédemment codée en dur fim:fim est à source unique (la chaîne de connexion est dérivée des mêmes variables) et documentée avec un avertissement pour la modifier avant d’exposer la base de données, de sorte que les opérateurs ne livrent plus accidentellement les identifiants administrateur par défaut.

Corrections

  • Force-logout now compares timestamps correctly on PostgreSQL. The session-invalidation check assumed the stored invalidation time was naive UTC and forced it as such, which silently corrupted comparisons against tz-aware non-UTC values that PostgreSQL can return. Timestamps are now normalized to UTC by conversion, not override, so revoked tokens are reliably rejected on every backend.
  • Enforcement hooks now fail closed when they crash. A PRE_TOOL_USE hook (e.g. an approval gate) that raised an exception previously returned allow=True, so the blocked tool call proceeded anyway — a crashing gate silently became a bypass. PRE hooks now deny by default on error; non-enforcement hooks (rate limiter, loggers) keep the old fail-open behavior via a new fail_open flag.

[v0.8.7] - 2026-06-10

Sécurité

  • Correction d’une faille d’authentification à deux facteurs. L’authentification API et chat/SSE nécessite désormais un véritable jeton d’accès (le streaming SSE accepte également son ticket de courte durée) ; le jeton temporaire 2FA, les jetons d’actualisation et les tickets de liaison/SSE — tous signés avec la même clé — ne peuvent plus être rejeu pour s’authentifier, donc un mot de passe volé seul ne peut plus contourner le deuxième facteur.
  • La connexion OAuth ne lie plus automatiquement à un compte existant sur une adresse e-mail non vérifiée. Un compte tiers n’est associé à un compte local par e-mail que lorsque le fournisseur marque cet e-mail comme vérifié, ce qui empêche la prise de contrôle via une adresse non vérifiée contrôlée par un attaquant.

Ajouté

  • file_ops.apply_patch — appliquer des correctifs au format V4A aux fichiers. Permet aux agents d’effectuer des modifications multi-lignes avec des blocs basés sur les lignes et une correspondance floue des espaces, complétant le find_replace existant pour les cas où la correspondance exacte de sous-chaîne est fragile.
  • Garde-fous de contenu pour la validation des entrées et des sorties. Une nouvelle couche core/agent/guardrail s’exécute aux côtés (sans remplacer) des portes de permission d’outils existantes et des vérifications de sécurité. Les garde-fous d’entrée (par défaut : détecteur de phrase de jailbreak) s’exécutent avant tout appel LLM et interrompent le tour s’ils sont déclenchés, économisant des tokens et affichant un avis clair « bloqué » dans le chat. Les garde-fous de sortie s’exécutent après la réponse finale. Configurable via les variables d’environnement FIM_GUARDRAILS_INPUT / FIM_GUARDRAILS_OUTPUT ; la configuration par interface utilisateur par agent arrivera dans une version future.

Changé

  • /settings?tab=billing s’affiche désormais en pleine largeur et visuellement cohérent avec les autres onglets des Paramètres. Suppression du plafond de largeur max-w-4xl et du conteneur de défilement externe redondant ; suppression de l’icône de titre de page ; réécriture des cartes plan / utilisation / abonnement / comparaison des plans pour utiliser le même motif de div bordée épurée (étiquettes compactes + nombres tabular-nums) que l’onglet Utilisation. L’ancienne mise en page ressemblait à une page autonome accidentellement coincée dans le cadre des paramètres.

Corrigé

  • Le quota de jetons se réinitialise désormais à votre date de facturation, non le 1er du mois. L’utilisation a toujours été comptabilisée par mois calendaire indépendamment de la date d’inscription, ce qui signifiait que les utilisateurs payants pouvaient être facturés le 20 mais attendre le 1er pour un quota frais — et un abonnement commencé tard dans le mois accordait effectivement un deuxième quota complet quelques jours plus tard. Le quota se réinitialise désormais à chaque anniversaire mensuel de l’abonnement (les utilisateurs gratuits se réinitialisent toujours sur le mois calendaire). Les plans facturés annuellement se remplissent correctement chaque mois, non une fois par an. L’onglet Plan & Facturation, la carte Utilisation et la boîte de dialogue quota dépassé mesurent tous l’utilisation et affichent la date de réinitialisation sur cette même période, de sorte que l’« utilisation cette période » affichée correspond au moment où le chat vous arrête réellement.
  • Les renouvellements d’abonnement font désormais avancer la période de facturation. Au renouvellement automatique, la date de fin de période affichée restait figée au cycle précédent même si Stripe avait facturé et fait avancer l’abonnement — le gestionnaire de renouvellement lisait la nouvelle période uniquement à partir de la charge utile de la facture, où elle n’est pas fiable. Il récupère désormais les limites de période faisant autorité auprès de Stripe, de sorte que la date de fin de cycle (et la réinitialisation du quota) avancent à chaque renouvellement. Cela supprime également un risque latent où l’annulation d’un tel abonnement pourrait rétrograder le compte immédiatement au lieu de la véritable fin de période.
  • Le protocole d’appel d’outil brut ne fuit plus dans les réponses de l’agent. Lorsqu’un modèle improvise un appel d’outil en texte brut (par exemple en émettant des blocs <tool_call>/<tool_response> — courant quand il atteint un outil qui n’est pas disponible), ce texte — y compris tout dump base64/fichier à l’intérieur — pouvait apparaître verbatim dans la réponse. Tous les chemins de réponse suppriment désormais ce pseudo-protocole, et l’analyseur reconnaît en outre le dialecte {"name","arguments"} comme un véritable appel d’outil au lieu de le laisser fuir.
  • Rafales intermittentes de APIConnectionError: Connection error pendant les tours d’agent. Le pool de connexions HTTP partagé conservait les connexions keep-alive inactives jusqu’à 30 s ; quand un relais en amont ou une NAT supprimait silencieusement une connexion inactive, la requête suivante réutilisait le socket à moitié mort et échouait. L’expiration du keep-alive est désormais de 5 s par défaut (les connexions chaudes au cours d’un tour sont toujours réutilisées), et le pool est réglable via LLM_HTTP_MAX_CONNECTIONS / LLM_HTTP_MAX_KEEPALIVE / LLM_HTTP_KEEPALIVE_EXPIRY — définissez LLM_HTTP_MAX_KEEPALIVE=0 pour désactiver complètement la réutilisation de connexion derrière un amont non fiable.
  • Les statistiques d’utilisation de la clé API (total_requests, last_used_at) persistent désormais à chaque requête. Auparavant, l’incrément était écrit sur la session de base de données de la requête, qui n’est validée que par les points de terminaison qui effectuent leurs propres écritures — donc les appels de clé API en lecture seule (tableau de bord, fichiers, modèles, exports, …) annulaient silencieusement le compteur. L’utilisation est désormais enregistrée sur une session indépendante qui se valide automatiquement, découplée de la réussite de la requête.

[v0.8.6] - 2026-05-08

Added

  • Facturation Stripe — abonnement au plan Pro. Un nouvel onglet Plan & Billing sous /settings?tab=billing affiche le plan actuel, l’utilisation mensuelle des tokens, la réinitialisation de la période, et soit Upgrade to Pro (Stripe Checkout) soit Manage subscription (Customer Portal). Un paiement réussi ouvre une modal de confettis indiquant le plan acheté ; les paramètres de redirection sont supprimés uniquement après fermeture pour qu’une actualisation ne le déclenche pas à nouveau. L’application des quotas respecte le plan de chaque utilisateur ; les abonnements annulés restent en Pro jusqu’à la fin de la période payante ; la boîte de dialogue de quota 402 en cours de flux se trouve maintenant sur l’onglet de facturation. Les administrateurs gèrent les plans et parcourent les abonnements sous Admin Panel → Billing. Pro utilise actuellement un prix Stripe en mode test ; le basculement en production remplace l’ID de prix.
  • Drapeau de fonctionnalité de facturation contrôlé par l’administrateur. Le bouton Enable Stripe Billing dans Admin → System Settings contrôle l’ensemble du pipeline Stripe — /api/billing/* côté utilisateur, webhook Stripe, CRUD plan/abonnement administrateur, et onglet de facturation frontend + nav administrateur se cachent tous ou retournent 503 quand il est désactivé. La première activation crée Free + Pro, définit le pointeur default_plan_id, et remplit rétroactivement users.plan_id ; les activations ultérieures off/on sont un simple basculement de drapeau. Les déploiements privés sans identifiants Stripe restent propres. La chaîne de quotas revient au Default Monthly Token Quota défini par l’administrateur quand la facturation est désactivée.
  • Quota illimité par utilisateur + colonne Registered. Un champ de quota vide hérite de la limite globale ; 0 accorde un quota illimité. Auparavant, les deux s’effondraient dans le même état. Le tableau des utilisateurs gagne également une colonne Registered.
  • Les docs non-anglais (zh / ja / ko / de / fr) affichent maintenant les sections complètes API Reference et Channels Configuration — le groupe Endpoints et le sous-groupe Configuration > Channels étaient auparavant en anglais uniquement.

Modifications

  • Plan & Billing est un onglet Paramètres, pas une page autonome. L’itinéraire /settings/billing a été replié dans /settings?tab=billing pour que la navigation de gauche reste visible lors du changement de plans (comme GitHub / Linear / Notion). L’itinéraire autonome redirige, de sorte que les anciens signets et les URL de retour de Stripe Checkout des déploiements antérieurs continuent de fonctionner. L’onglet Subscriptions est renommé en Marketplace pour éviter la confusion avec les abonnements aux plans.
  • Le quota du plan gratuit est en lecture seule sur la page Plans de l’administrateur. Provenant de Paramètres système → Quota de jetons mensuel par défaut ; les modifications y sont propagées automatiquement. Le backend ignore silencieusement monthly_token_quota sur PATCH pour le plan gratuit.
  • Les quotas de jetons s’affichent sous la forme 5M / 100K au lieu de 5,000,000 sur la page de facturation, les cartes de plan et le tableau Plans de l’administrateur. Les champs INPUT de l’administrateur acceptent toujours les nombres bruts.
  • L’autorité de traduction a changé de fichiers par locale à un glossaire unique. Les règles se trouvent dans scripts/translation-glossary.md, chargées dans chaque appel de traduction LLM (JSON, MDX, README). Le hook de pré-commit refuse inconditionnellement les modifications manuelles des fichiers de locale générés. Pour corriger une traduction incorrecte, modifiez le glossaire et régénérez avec --force.
  • Concédant et droit applicable. La licence FIM One Source Available est désormais accordée par FIM Labs Pte. Ltd. (Singapour) ; le droit applicable passe de la RPC à Singapour ; les litiges sont soumis à l’arbitrage SIAC à Singapour (un arbitre, en anglais). Un nouveau fichier NOTICE de haut niveau enregistre l’attribution R&D, les marques déposées et la politique des composants tiers. Aucune modification aux conditions d’utilisation autorisées ou aux conditions de restriction.

Corrections

  • L’approbation/rejet par l’administrateur des agents, connecteurs, bases de connaissances et serveurs MCP ne échoue plus sur PostgreSQL. La colonne reviewed_at de publish-review est maintenant consciente du fuseau horaire, de sorte que les écritures d’approbation réussissent sur PG (le bug était invisible sur les bases de données SQLite de développement).
  • Les utilisateurs OAuth peuvent à nouveau actualiser leur session. Le jeton d’actualisation émis par OAuth était stocké sous une forme que le point de terminaison d’actualisation ne pouvait jamais faire correspondre, forçant une reconnexion une fois le jeton d’accès expiré ; il est maintenant stocké sous forme de digest comme tous les autres chemins.
  • Le titre de l’onglet du navigateur reflète maintenant le sous-onglet actif dans /settings et /admin (par exemple Settings · Billing — FIM One), de sorte que plusieurs onglets épinglés sont distinguables.
  • La page d’utilisation ne rapporte plus “Illimité” quand un administrateur a défini un quota de jetons par défaut — elle se résout maintenant via la chaîne de quota unifiée (remplacement par utilisateur → niveau de plan → défaut système).
  • Paramètres d’agent : les ressources liées ne scintillent plus en tant que “(已删除)” à l’entrée. Le badge orphelin attend que les récupérations d’inventaire se stabilisent avant le rendu.
  • Les toasts suivent maintenant le thème clair/sombre au lieu d’être codés en dur en sombre.
  • La ventilation par agent de la page d’utilisation ne duplique plus les lignes “Direct Chat” pour les conversations liées aux agents supprimés.
  • Le ./deploy.sh auto-hébergé ne échoue plus avec container name already in use — il nettoie les conteneurs zombies préfixés par hash et les enfants sandbox DooD avant docker compose up.
  • Plus de commits chore(i18n): sync translations redondants après les poussées — le hook de traduction de pré-commit met maintenant en scène .translation-cache.json aux côtés des fichiers traduits.
  • Le chat d’agent ne plante plus quand un outil nécessitant une confirmation s’exécute dans une session d’agent non lié — la porte se retire gracieusement quand il n’y a pas d’agent pour router.
  • La réessai ne échoue plus sur les fournisseurs d’alternance stricte (Claude) quand l’historique contient des messages utilisateur orphelins provenant de tours arrêtés — les messages de même rôle consécutifs s’effondrent en un seul tour avant la distribution.
  • La réessai du playground ne montre plus brièvement la requête deux fois pendant la fenêtre de pré-flux.
  • L’agent ReAct reconnaît maintenant et s’arrête après qu’un opérateur rejette une demande d’approbation, au lieu de réessayer des appels d’outils paraphrasés.
  • Les “Suggestions de suivi” du playground reviennent et sont maintenant optionnelles par agent (désactivé par défaut ; nouveau bouton bascule Follow-up Suggestions dans les paramètres d’agent).

[v0.8.5] - 2026-04-23

Ajouté

  • Flux de travail i18n convivial pour les contributeurs : les contributeurs n’ont plus besoin de configurer LLM_API_KEY pour soumettre des PR qui modifient les fichiers sources en anglais. Si l’étape de traduction du pre-commit local est ignorée (pas de clé), un nouveau flux de travail .github/workflows/i18n-sync.yml traduit EN → ZH/JA/KO/DE/FR sur master après la fusion de la PR et valide automatiquement le résultat. Le hook pre-commit refuse désormais également les modifications manuelles des fichiers de locale générés (avec un remplacement ALLOW_LOCALE_EDIT=1 pour les corrections de traduction légitimes), prévenant ainsi la dérive silencieuse entre les sources EN et les résultats traduits.
  • Secours i18n CI vérifié de bout en bout : un push de test de fumée (EN uniquement, hook de traduction local ignoré) a confirmé que le flux de travail GitHub Actions détecte la source modifiée, traduit dans les cinq locales et valide automatiquement le résultat sur master avec [skip ci] pour prévenir la récursion.
  • Page de documentation d’intégration Exa : section Intégrations dédiée dans la barre latérale avec une page Exa de première classe couvrant toute la surface de recherche Exa (neural / fast / deep-reasoning / instant), filtrage, récupération de contenu et trois présets ajustés pour la surveillance d’actualités, la récupération d’articles de recherche et les agents de raisonnement profond. Sert de page d’accueil orientée partenaire pour le répertoire d’intégration Exa.
  • Support des bases de données Xinchuang (信创) : le connecteur de base de données répertorie désormais KingbaseES (人大金仓), HighGo (瀚高) et DM8 (达梦) aux côtés de PostgreSQL/MySQL. KingbaseES et HighGo sont compatibles PG et réutilisent asyncpg sans dépendances supplémentaires ; DM8 utilise la roue du fournisseur officiel dmPython. Un scripts/test_xinchuang_dbs.py autonome permet aux opérateurs de vérifier la connectivité en direct depuis la CLI.
  • Feishu Channel + confirmation gate via IM : nouveau type de ressource Channel (limité à l’org, identifiants chiffrés au repos) permettant aux orgs de connecter une application Feishu pour la messagerie sortante. Les outils marqués requires_confirmation=True envoient désormais une carte interactive Approuver/Rejeter au groupe Feishu configuré au lieu de n’afficher que la boîte de dialogue de confirmation dans le portail — tout membre autorisé du groupe peut approuver ou rejeter directement depuis Feishu. Couvre l’interface utilisateur de gestion Paramètres → Canaux (liste, créer/modifier avec protection d’état modifié, détails avec URL de rappel copiable, envoi de test), API CRUD (/api/channels) et le point de terminaison de rappel d’événement Feishu (/api/channels/{id}/callback) avec vérification de signature et support de défi d’URL. Première étape de l’élément de feuille de route Intégration de canal IM v0.9, livrée en avance pour la roadshow du 2026-04-24.
  • Système de hook d’agent (squelette) : nouvelle abstraction PreToolUseHook / PostToolUseHook dans src/fim_one/core/hooks/ permettant à la logique déterministe de s’exécuter en dehors de la boucle LLM — FeishuGateHook est la première implémentation concrète, attachée au flux de confirmation gate. Le cycle de vie complet des hooks + les hooks YAML définis par l’utilisateur restent dans la portée v0.9.
  • Le système de hook est maintenant actif dans les runtimes ReAct et DAG : les agents qui déclarent hooks.class_hooks dans leur model_config_json ont ces hooks instanciés et enregistrés à chaque session de chat. Le premier consommateur — FeishuGateHook — se déclenche automatiquement quand un agent appelle un outil dont l’action du connecteur est marquée requires_confirmation=True, envoie une carte Approuver/Rejeter au groupe Feishu de l’org, bloque l’outil et reprend ou abandonne selon le verdict. Auparavant, l’abstraction du hook était en place mais rien dans la couche web ne la connectait au chat en direct.
  • Architecture des canaux et du système de hook documentée : nouveau docs/architecture/hook-system.mdx explique les trois points de hook, pourquoi les hooks s’exécutent en dehors de la boucle LLM et parcourt FeishuGateHook de bout en bout. Les pages d’architecture existantes (system-overview, organization, react-engine, philosophy) y font référence croisée. Le README répertorie désormais les canaux de messagerie comme une capacité v0.8 de première classe et le diagramme de la couche application inclut les cibles IM aux côtés de Portal/API/iframe.
  • Hook Approval Playground : la feuille de détails des canaux dispose désormais d’une action « Test Approval Flow » qui simule un appel d’outil sensible, envoie une véritable carte de confirmation au groupe Feishu lié et interroge en direct la décision de l’examinateur. Contrairement au bouton d’aperçu existant, cela exerce le chemin de production complet (ligne ConfirmationRequest authentique, rappel Feishu réel, transitions d’état), donc les démos et les répétitions pré-déploiement utilisent le même chemin de code qu’un hook de production.
  • Notifications de fin de tâche par agent : les agents peuvent désormais envoyer une carte récapitulative au canal de l’org (actuellement Feishu) quand une tâche ReAct ou DAG longue durée se termine. Configurable par agent dans Paramètres → Agent → Notifications. Premier consommateur du modèle de notification sortante générique.
  • Confirmation gate configurable — inline ou canal : chaque agent dispose désormais d’une section « Approbation » dans les paramètres avec trois modes de routage (Auto / Inline uniquement / Canal uniquement), un sélecteur de portée des approbateurs (initiateur / propriétaire de l’agent / n’importe qui dans l’org), un remplacement « exiger une confirmation pour chaque appel d’outil » et un sélecteur de canal d’approbation explicite. Le mode Auto utilise un canal lié s’il en existe un et revient gracieusement à une carte d’approbation inline dans le flux de chat sinon — donc les agents sans canal n’échouent pas silencieusement mais obtiennent une véritable UX d’approbation. Un nouveau point de terminaison POST /api/confirmations/{id}/respond partage un chemin unique d’enregistrement de décision avec le webhook Feishu, donc chaque approbation — qu’elle soit cliquée dans le chat ou dans un groupe Feishu — marque les mêmes champs d’audit approver_user_id et decided_at.

Modifié

  • Les indicateurs de chargement du Playground utilisent désormais un léger scintillement de texte au lieu de la barre de progression peu convaincante qui se figeait à une largeur pseudo-complète après 8 secondes. Les deux implémentations de scintillement existantes (.shiny-text et .text-shimmer) ont été unifiées en une primitive unique sensible au thème avec un préréglage chaleureux optionnel.
  • Les cartes de connecteur affichent désormais un badge « Private default » (avec infobulle) quand un connecteur a allow_fallback désactivé, permettant aux propriétaires de voir en un coup d’œil quels connecteurs exigent que chaque utilisateur apporte ses propres identifiants. Le texte d’aide sous le bouton bascule Allow-Fallback dans le formulaire de paramètres du connecteur précise également que l’indicateur ne contrôle que le partage avec d’autres utilisateurs — le propriétaire peut toujours utiliser ses propres identifiants par défaut.

Corrigé

  • Les appels de connecteur effectués par le propriétaire d’un connecteur avec allow_fallback=false et uniquement une credential par défaut (pas de credential par utilisateur) ne retournent plus 401 avec “Requires authentication”. Le propriétaire est désormais exempté de la barrière de secours — cet indicateur contrôle uniquement si d’autres utilisateurs peuvent emprunter la credential par défaut du propriétaire. Auparavant, les propres agents du propriétaire envoyaient silencieusement des requêtes non authentifiées, et le même problème affectait également les nœuds connector_action de workflow.
  • L’export de conversation affiche désormais le libellé de mode correct (“Planner” / “规划”) pour les conversations DAG routées automatiquement au lieu d’afficher toujours “Standard”.
  • Les timestamps d’export respectent désormais le fuseau horaire configuré de l’utilisateur au lieu d’afficher l’UTC brut.
  • Le contenu des fichiers téléchargés ne fuit plus dans les conversations exportées ; seul le texte du message de l’utilisateur est inclus.
  • Les appels d’outils parallèles ne se heurtent plus lorsqu’un fournisseur réutilise index=0 pour chaque delta d’appel d’outil en streaming ; l’agrégateur détecte désormais les limites via un changement d’id ou de nom et remapppe les deltas suivants au bon emplacement.
  • Paramètres → Canaux reflète désormais le rôle organisationnel de l’utilisateur actuel : les membres (non-admin/propriétaire) voient un bouton “Nouveau Canal” désactivé, des actions Modifier / Activer-Désactiver / Supprimer masquées, une bannière en lecture seule et un état vide tenant compte des permissions — au lieu d’un CTA activé qui échouait à la soumission avec “Organization admin access required”.
  • La redirection d’expiration de session préserve désormais la chaîne de requête, de sorte que les utilisateurs atterrissent sur l’onglet / filtre exact qu’ils consultaient après réauthentification au lieu du chemin nu.
  • Le formulaire de canal Feishu n’affiche plus une invite “discard unsaved changes” erronée lors de l’interaction avec le sélecteur de chat superposé au-dessus de la boîte de dialogue.
  • Les indices de configuration du canal Feishu ne dupliquent plus les libellés chinois lorsque l’interface elle-même est déjà en chinois (par exemple, auparavant rendu “事件与回调 (事件与回调)”).
  • “Annotate All” dans le gestionnaire de schéma ne retourne plus 500 Internal Server Error — le chemin backend d’annotation complète avait un bug de variable non liée qui bloquait chaque invocation.
  • La modification d’un connecteur de base de données affiche désormais l’espace réservé ******** dans le champ de mot de passe au lieu du texte masqué à trois puces, ce qui rend évident que laisser le champ vide conserve le mot de passe stocké.
  • La mise à jour d’une action de connecteur ne réduit plus le panneau de détails — l’action modifiée reste sélectionnée pour que les utilisateurs puissent continuer à l’affiner.
  • L’éditeur de connecteur IA distingue désormais le succès, l’échec partiel et l’échec complet au lieu d’afficher le même message “completed” pour les trois. Les raisons d’échec sont affichées en ligne pour que les utilisateurs voient ce qui s’est réellement mal passé.
  • L’éditeur de connecteur IA ne peut plus effacer silencieusement plusieurs actions à la fois. La suppression en masse (>2 actions) nécessite désormais un mot-clé destructeur explicite dans l’instruction de l’utilisateur (“rebuild”, “全部重建”, “wipe”, etc.) ; sinon l’opération est rejetée avec une erreur claire, protégeant les paramètres requires_confirmation / JMESPath contre une perte accidentelle.
  • Les cartes de confirmation dans le chat du portail affichent désormais si la requête a été routée vers un canal (par exemple Feishu) ou traitée en ligne, accompagnée d’un indice lisible par l’homme sur qui est autorisé à approuver (l’initiateur, le propriétaire de l’agent ou tout membre de l’organisation). Les requêtes routées par canal produisent également une carte en attente en ligne pour que l’utilisateur ne se demande pas si une notification a réellement été envoyée.
  • Les cartes d’approbation Feishu deviennent désormais en lecture seule après la première décision : le webhook /callback retourne une carte de remplacement avec les boutons Approuver/Rejeter supprimés et l’en-tête coloré en vert (approuvé) ou rouge (rejeté), empêchant les clics répétés. Les clics en double qui arrivent toujours des clients Feishu obsolètes reçoivent un toast “This request was already approved/rejected.” et une copie actualisée de la carte décidée pour que la vue obsolète se mette à jour.
  • L’action “Send Test Message” simple a été restaurée sur les lignes de canal et la feuille de détails. L’Approval Playground exerce le cycle complet du hook, mais un canal de notification uniquement (pas de hook d’approbation câblé) a toujours besoin d’une vérification rapide de credential/connectivité, que le test-send simple couvre.
  • Les clics simultanés sur la même carte d’approbation Feishu ne peuvent plus réussir tous les deux. Le gestionnaire /callback bascule désormais le statut ConfirmationRequest via un UPDATE ... WHERE status='pending' conditionnel et utilise le nombre de lignes affectées pour décider quel appelant “gagne” ; auparavant deux requêtes parallèles pouvaient toutes deux lire pending et faire la course à une écriture, finissant potentiellement par approuvé-puis-rejeté sur la même ligne.
  • Les requêtes d’approbation en attente expirent désormais automatiquement après CHANNEL_CONFIRMATION_TTL_MINUTES (par défaut 24h) via un balayeur en arrière-plan. Empêche un clic obsolète des jours plus tard de basculer l’état de l’agent qui a déjà été démonté ; le clic suivant sur une carte expirée reçoit une carte décidée grise “Expired” et un toast “no longer active”.
  • Send Test Message livre désormais une notification en texte brut (pas de boutons Approuver/Rejeter) et réside uniquement dans la feuille de détails du canal — pas la liste déroulante de ligne. Les utilisateurs qui n’ont pas l’intention d’utiliser des hooks d’approbation ne sont pas confus par des boutons interactifs sur un message “test”. Le test du cycle d’approbation reste disponible via le bouton Approval Playground.
  • La feuille de détails du canal s’est resserrée : “How to finish setup” est désormais une section réductible réduite par défaut (pour qu’elle ne domine pas la feuille pour les canaux déjà configurés), et le remplissage externe a été réduit pour que le contenu se rapproche du bord de la feuille.
  • Builder AI ne signale plus les credentials masquées (****) comme manquantes — il les reconnaît désormais comme configurées et ignore les fausses orientations “credential missing”.
  • La liste d’agents du Playground affiche désormais tous les agents accessibles au lieu de seulement les agents publiés, de sorte que les agents brouillon peuvent être testés sans publication préalable.
  • Les uploads d’images de chat ne plantent plus le flux sur les URL data: malformées — l’extracteur MIME bascule désormais en toute sécurité vers application/octet-stream au lieu de lever une IndexError au milieu de la génération.
  • Les miniatures d’images du Playground annulent désormais les récupérations en vol au démontage via AbortController, évitant les assignations d’URL blob obsolètes et la bande passante gaspillée lors d’une navigation rapide.

[v0.8.4] - 2026-04-17

Ajouté

  • Récupération de conversation : les lignes synthétiques tool_result persistent désormais après une interruption ; les clients peuvent reprendre un flux SSE déconnecté via POST /chat/resume avec le dernier curseur observé.
  • Le playground se reconnecte automatiquement aux flux SSE interrompus en utilisant l’endpoint /chat/resume avec backoff exponentiel (max 3 tentatives) ; affiche un indicateur “Reconnexion…” pendant la récupération.
  • Observabilité du cache de prompt : cache_read_input_tokens et cache_creation_input_tokens sont capturés à partir des réponses LLM, agrégés par tour dans TurnProfiler, enregistrés comme une ligne de résumé turn_cache (tokens lus/créés + économies estimées), et exposés dans la done_payload du chat sous un nouveau champ cache. Permet de vérifier que la mise en cache des prompts Anthropic fonctionne réellement, et sert également de détecteur pour savoir si les stations relais API respectent la réduction de cache.

Modifié

  • Les invites système utilisent désormais un registre de sections mémorisé avec des points d’arrêt de mise en cache des invites Anthropic sur le préfixe stable — réduit le coût des jetons par tour d’environ 60-80 % sur le préfixe mis en cache pour les modèles Claude. Le mode JSON ReAct, le mode d’appel de fonction natif et la synthèse émettent tous deux messages système pour les fournisseurs compatibles avec le cache (Claude, Bedrock Anthropic, Vertex Claude) et reviennent à un seul message concaténé pour tous les autres fournisseurs.

Corrigé

  • Les tokens de réflexion/raisonnement persistent désormais dans les conversations multi-tours — le champ signature d’Anthropic est capturé et rejoué selon les exigences de l’API.
  • Politique de rejoue du raisonnement consciente du fournisseur : reasoning_content (provenant de DeepSeek-R1, Qwen QwQ, Gemini thinking, OpenAI o-series) n’est plus rejoué aux fournisseurs non-Anthropic lors des tours suivants. Auparavant, le champ était sérialisé sans condition dans ChatMessage.to_openai_dict(), ce qui violait la documentation des fournisseurs (DeepSeek et Qwen documentent explicitement « ne pas renvoyer reasoning_content dans l’historique des messages ») et invalidait silencieusement leurs caches de préfixe automatique / KV à chaque échange multi-tour. La politique est centralisée dans core/prompt/reasoning.py — la famille Claude (y compris les proxies Bedrock et Vertex) rejoue toujours les blocs de réflexion avec signature comme requis.

[v0.8.3] - 2026-04-16

Ajouts

  • Outil intégré convert_to_markdown — Nouvel outil Agent polyvalent qui convertit n’importe quel fichier, URL, lien YouTube ou URI de données en Markdown propre en utilisant MarkItDown de Microsoft. Supporte PDF, Word (.docx), Excel (.xlsx/.xls), PowerPoint (.pptx), HTML, JSON, CSV, XML, ZIP, EPUB, Outlook .msg, images, audio (parole → texte) et transcriptions YouTube. Disponible par défaut pour chaque agent — au même niveau que web_fetch. Lorsqu’un LLM capable de vision est configuré, les images intégrées et les pages PDF numérisées sont automatiquement OCR via le plugin officiel markitdown-ocr. Auparavant, cette capacité était cachée dans le pipeline d’ingestion RAG en arrière-plan ; les agents y ont maintenant accès sur le chemin de conversation interactif.
  • OCR de documents via markitdown-ocr — Les images intégrées dans DOCX / XLSX / PPTX et les pages PDF numérisées sont maintenant OCR en utilisant le même LLM capable de vision que le reste de FIM One route. S’applique à la fois à l’outil intégré convert_to_markdown et au pipeline d’ingestion RAG, de sorte que la conversion au moment du chat et l’ingestion de la base de connaissances produisent un Markdown identique pour la même entrée.
  • Support universel du fournisseur de vision pour l’OCR de documents — Un nouveau LiteLLMOpenAIShim de type canard encapsule n’importe quel OpenAICompatibleLLM de FIM One dans la forme API .chat.completions.create(...) du SDK openai, puis le distribue via litellm.completion(). MarkItDown (qui code en dur la surface du SDK openai) peut maintenant consommer Anthropic Claude, Google Gemini, Azure, Bedrock et tout autre fournisseur que LiteLLM supporte — sans code d’adaptateur par fournisseur dans FIM One.
  • Ingestion RAG consciente de la vision — Les téléchargements de base de connaissances de documents Office et de PDF numérisés résolvent maintenant le LLM de vision par défaut de l’espace de travail (priorité DB, secours ENV) et le transmettent à MarkItDown pour l’OCR lors de l’ingestion. Zéro régression : lorsqu’aucun modèle capable de vision n’est disponible, l’ingestion revient silencieusement au mode texte uniquement — exactement le comportement antérieur à la fonctionnalité.
  • Couverture de format MarkItDown étendue — RAG ingère maintenant nativement .pdf, .msg (Outlook), .epub, .mp3, .wav et .m4a via les extras de transcription audio et outlook de MarkItDown. Les URL YouTube transitent par convert_to_markdown via markitdown[youtube-transcription].
  • Variable d’environnement LLM_SUPPORTS_VISION — Opt-out facultatif (=false) pour le secours OCR de document en mode ENV. Le comportement par défaut est optimiste (true), qui couvre les configurations ENV courantes (gpt-4o, claude-3-5-sonnet, gemini-1.5-pro/flash). Définissez à false uniquement lorsque votre LLM_MODEL configuré en ENV ne supporte pas la vision (par ex. deepseek-v3, qwen-chat, llama-3.1, gpt-3.5-turbo, o1-mini) pour ignorer un appel de vision défaillant à chaque téléchargement de document. Ignoré entièrement lorsqu’un ModelGroup organisé par un administrateur est actif — le mode DB est toujours la source de vérité lorsqu’il est disponible.
  • Profileur au niveau du tour — Chaque tour ReAct enregistre maintenant les timings au niveau des phases (memory_load, compact, tool_schema_build, llm_first_token, llm_total, tool_exec) dans une seule ligne de journal structuré par tour. Basculable via REACT_TURN_PROFILE_ENABLED (par défaut : activé ; définissez à false pour une surcharge nulle sans opération).
  • Carte de travail compacte structurée — La compaction de conversation analyse maintenant sa propre sortie markdown en 9 sections dans un WorkCard typé et fusionne les nouveaux compacts dans le précédent, de sorte que les erreurs et les tâches en attente des étapes antérieures d’une longue session survivent à plusieurs tours de compaction au lieu d’être résumés à partir de zéro.

Modifié

  • Limitation de débit par utilisateur — Le limiteur de débit au niveau LLM maintient désormais un bucket séparé par utilisateur au lieu d’un bucket global unique au processus. Empêche un utilisateur bruyant de limiter tous les autres utilisateurs sur le même worker. Activable via LLM_RATE_LIMIT_PER_USER (par défaut : activé).

Corrections

  • Dangling tool_use recovery — Les conversations interrompues en cours d’exécution d’outil (arrêt utilisateur, déconnexion SSE, crash) laissaient précédemment un message assistant avec un bloc tool_use et aucun tool_result correspondant, ce qui provoquait un crash à la prochaine étape avec une erreur HTTP 400 opaque de l’API LLM. DbMemory.get_messages() détecte maintenant et répare ces blocs orphelins sur le chemin de lecture avec un tool_result synthétique [interrupted]. Le journal DB brut n’est pas modifié.
  • Les messages assistant vides avec tool_calls ne sont plus supprimés — Le filtre du chemin de chargement DbMemory supprimait précédemment silencieusement toute ligne assistant avec un contenu texte vide. Les intermédiaires d’appel de fonction natifs (qui ne contiennent que tool_calls, pas de texte) étaient effacés. Le filtre nécessite maintenant à la fois un contenu vide ET l’absence de tool_calls.

[v0.8.2] - 2026-04-10

Added

  • Intelligent Document Processing (Vision-Aware) — Adaptive document handling based on model capabilities. When the target LLM supports vision (GPT-4o, Claude 3/4, Gemini), PDF pages are rendered as images and sent via vision content blocks for full visual fidelity. Text-only models fall back to pdfplumber text extraction. Two modes: Vision and Text-only. Configurable via DOCUMENT_PROCESSING_MODE, DOCUMENT_VISION_DPI, DOCUMENT_VISION_MAX_PAGES env vars. Per-model supports_vision toggle in Admin.
  • Document vision pipeline — DOCX, PPTX, and PDF files uploaded in chat now have their embedded images extracted and sent as vision content to the LLM when vision is enabled on the model.
  • Multi-turn vision persistence — Vision content from uploaded documents and images persists across conversation turns, so the model retains visual context throughout the conversation.
  • Smart PDF processing — Text-rich PDF pages extract text plus embedded images separately (saving tokens). Scanned or image-only pages render as full-page PNG for maximum fidelity.
  • Pre-built sandbox imageDockerfile.sandbox with common data-science packages (pdfplumber, Pillow, pandas, etc.) so AI code execution works out of the box in --network=none containers.
  • Resource Fork completion — All five resource types now support fork: Agent, Connector, Workflow, MCP Server, and Skill. KB fork removed (inherently user-local).

Modifications

  • Réponses de chat plus rapides — Le flux SSE se ferme maintenant immédiatement après la fin de l’agent ; la génération de titre et les suggestions de suivi s’exécutent en arrière-plan au lieu de bloquer la réponse.
  • Compaction de contexte plus intelligente — La compaction de conversation utilise un format structuré à 9 sections qui préserve mieux les informations clés (demande originale, erreurs, tâches en attente) sur les longues sessions.
  • Réduction des boucles d’agent — Des instructions anti-boucle ajoutées aux invites d’agent ; le seuil de détection de cycle abaissé pour détecter plus tôt les appels d’outils identiques répétés.
  • Démarrage des requêtes plus rapide — Les recherches de configuration LLM et la classification de domaine s’exécutent maintenant en parallèle, réduisant la surcharge par requête de 400-1100ms.
  • Meilleure gestion des outils vides — Les outils qui ne retournent aucune sortie produisent maintenant un message descriptif au lieu d’un simple « (no output) », évitant les tentatives inutiles.
  • Nettoyage automatique des anciens résultats d’outils — Les résultats d’outils plus anciens que les 6 plus récents sont automatiquement effacés avant la compaction de contexte, gardant les conversations épurées.
  • Budget agrégé des résultats d’outils — Le total des jetons de résultats d’outils est plafonné à 40K par session ; les nouveaux résultats sont tronqués quand le budget est dépassé, évitant l’encombrement du contexte par les grandes réponses API.
  • Récupération automatique du débordement de contexte — Quand l’LLM rejette une requête en raison d’un débordement de longueur de contexte, l’agent compacte automatiquement à 50% et réessaie, au lieu de faire planter toute la conversation.
  • Sélection d’outils basée sur les mots-clés — Quand une requête correspond clairement à un outil spécifique par le nom ou les mots-clés de description, l’agent ignore l’appel de sélection d’outils basé sur l’LLM, économisant 200-500ms.
  • Mise en pool des connexions LLM — Tous les appels API LLM partagent maintenant un seul pool de connexions avec des paramètres keepalive optimisés, réduisant la surcharge de connexion sur toute la session.
  • Vérification de complétion plus intelligente — L’étape de vérification post-réponse est ignorée pour les réponses longues et détaillées (>200 jetons), éliminant un aller-retour LLM inutile.
  • Basculement de modèle en cas de panne du fournisseur — Quand le modèle principal n’est pas disponible (limité en débit, surchargé ou indisponible), l’agent réessaie automatiquement avec le modèle rapide au lieu d’échouer.

Corrections

  • Agent hallucination on unreadable files — When the AI agent could not read a file (e.g., image-based PDF), it previously read other unrelated files and presented their content as the target file’s. A file integrity guardrail in the system prompt now prevents this.
  • File ID injection for uploads — Uploaded files now include their UUID file_id in the message context, so the agent can directly access them via read_uploaded_file without guessing.
  • Vision toggle reading from new model structure — The supports_vision flag on model configs was not being read correctly from the ModelGroup/ModelProviderModel ORM structure. Fixed.
  • Improved error messages for unreadable files — When files cannot be read, the tool now returns specific guidance (file type, vision suggestion) instead of generic errors.

[v0.8.1] - 2026-03-29

Ajoutés

  • Notifications d’administrateur sensibles au fuseau horaire — Les e-mails de notification d’administrateur affichent désormais les heures des événements dans le fuseau horaire configuré de chaque destinataire au lieu de toujours afficher l’UTC.
  • Divulgation progressive des outils de base de données — Un seul méta-outil database avec les sous-commandes list_tables/discover/query remplace les outils individuels par table. Configurable via la variable d’environnement DATABASE_TOOL_MODE (progressive par défaut, legacy comme secours).
  • Chargement des outils à la demande — Quand plus de 12 outils sont disponibles, un méta-outil request_tools permet à l’agent de charger dynamiquement des outils supplémentaires en cours de conversation au lieu d’être limité à la sélection initiale.
  • Divulgation progressive des outils MCP — Un seul méta-outil mcp avec les sous-commandes discover/call remplace les outils individuels par serveur. Configurable via la variable d’environnement MCP_TOOL_MODE (progressive par défaut, legacy comme secours).
  • Disjoncteur de budget de tokens par tour — La variable d’environnement REACT_MAX_TURN_TOKENS fournit un arrêt d’urgence pour les boucles d’agent incontrôlées. Par défaut 0 (illimité) — utilisez plutôt token_quota par utilisateur pour le contrôle des coûts quotidiens.
  • Bascule Native Function Calling par modèle — Le paramètre tool_choice_enabled (ENV + Admin par modèle) permet aux modèles qui rejettent la sélection forcée d’outils de sauter le Niveau 1 et d’aller directement au Mode JSON. Configurable dans Paramètres → Modèles → Avancé.
  • Révision complète de la qualité DAG — Cinq améliorations : mise à niveau du modèle par défaut vers le modèle général pour les étapes non-rapides ; découverte automatique des compétences en planification ; vérificateur de citations pour les domaines juridique/médical/financier ; préservation du contexte de contenu structuré avec multiplicateur de troncature configurable ; classification de domaine dans le routeur avec sélection de modèle consciente du domaine.
  • Escalade de modèle de domaine dans ReAct — Les domaines spécialisés (juridique/médical/financier) s’escaladent automatiquement vers le modèle de raisonnement avec recherche web obligatoire et vérification de citation.
  • Téléchargement de pièce jointe — Les cartes de fichiers dans les messages de chat sont désormais cliquables pour télécharger le fichier original.
  • Commutateur maître de notification d’administrateur — Bascule globale activée/désactivée pour les notifications par e-mail d’administrateur avec détection SMTP à l’exécution. Affiche une bannière d’avertissement quand SMTP n’est pas configuré et désactive tous les contrôles de notification.
  • En-tête SMTP Reply-To — La nouvelle variable d’environnement SMTP_REPLY_TO permet aux réponses d’aller à une adresse différente de celle de l’expéditeur.
  • Phase 1 de Resource Fork (Serveur MCP + Compétence) — Les points de terminaison POST /api/mcp-servers/{id}/fork et POST /api/skills/{id}/fork créent des copies profondes détenues par l’utilisateur avec visibility=personal et suivi de lignée forked_from. Les env/en-têtes chiffrés sont ignorés lors du fork du serveur MCP ; le statut de publication est ignoré lors du fork de compétence. La migration Alembic ajoute la colonne forked_from aux deux tables. 41 tests.
  • Auto-abonnement aux dépendances de connexion de flux de travailDependencyAnalyzer._resolve_workflow résout maintenant récursivement les dépendances de sous-flux de travail avec détection de cycle (ensemble visité). Les nœuds d’agent et de sous-flux de travail sont correctement ajoutés en tant que dépendances de contenu dans les manifestes de dépendance. Les ressources manquantes sont gérées gracieusement (avertissement de journal, pas d’échec). 19 tests.
  • Modèles de solution prédéfinis (contenu de graine du marché) — 8 modèles de solution verticale amorcés de manière idempotente lors de l’enregistrement du premier utilisateur : Audit financier, Examen de contrat, Rapports de données, Service d’assistance informatique, Intégration RH, Assistant commercial, Rédacteur de contenu, Résumé de réunion. Chacun regroupe un Agent + Compétence avec des POS en chinois. Publié sur l’organisation Market (visibility=org, publish_status=approved) pour une disponibilité immédiate sur le marché. 4 tests.
  • Détection de cycle ReAct — Détection déterministe des appels d’outils identiques répétés. Injecte un avertissement après 3 appels consécutifs avec les mêmes arguments, empêchant les agents de boucler sur les outils défaillants. Configurable via REACT_CYCLE_DETECTION_THRESHOLD.
  • Liste de contrôle d’achèvement ReAct — Invite de vérification unique avant d’accepter les réponses finales quand des outils ont été utilisés, réduisant les réponses prématurées ou incomplètes. Basculable par instance d’agent.

Modifications

  • Seuil minimum d’outils de la liste de contrôle d’achèvement — La liste de contrôle ne s’active désormais que lorsque l’agent a effectué 3+ appels d’outils (configurable via REACT_COMPLETION_CHECK_MIN_TOOLS). Les tâches simples avec 1-2 outils ignorent la vérification pour éviter une latence inutile.
  • Budgétisation dynamique du système prompt — Suppression de la réserve fixe SYSTEM_PROMPT_RESERVE (4K tokens) du calcul du budget de contexte. ContextGuard tient désormais compte du système prompt de manière dynamique, donnant à chaque itération ~4K de contexte utilisable supplémentaire.
  • Troncature centralisée des outils — Tous les types d’outils délèguent désormais la troncature à un module partagé. Les valeurs par défaut sont configurables via les variables d’environnement TOOL_OUTPUT_MAX_CHARS, TOOL_OUTPUT_MAX_ITEMS, TOOL_OUTPUT_MAX_BYTES.
  • Détection de domaine découplée — La classification de domaine s’exécute indépendamment sur chaque endpoint, n’étant plus regroupée avec le routage automatique. Les instructions SOP de domaine sont assouplies pour guider plutôt que de mandater la recherche web.
  • Variable d’environnement AUTO_ROUTING supprimée — L’endpoint automatique classe toujours les requêtes.

Corrections

  • Soumission de message en double — L’entrée de chat utilise désormais un garde synchrone pour empêcher le même message d’être soumis plusieurs fois lors de clics rapides.
  • Chaîne de dégradation de sortie structurée — Le repli à 3 niveaux (FC natif → mode JSON → texte brut) traverse désormais correctement tous les niveaux.
  • Valeur DB json_mode_enabled ignorée — Les modèles configurés via Admin utilisent désormais correctement leur paramètre par modèle au lieu de toujours revenir à la variable d’environnement.
  • Message d’erreur de planification DAG — Affiche désormais un message bilingue convivial au lieu de l’erreur de pipeline brute.
  • Contournement du propriétaire du serveur MCP pour allow_fallback — Le propriétaire du serveur n’est plus bloqué par allow_fallback=False.

[v0.8] - 2026-03-20

Ajoutés

  • Refonte du Marketplace Phase 1 — Solutions + Composants — Modèle de Marché à deux niveaux (Solutions : Agent/Skill/Workflow ; Composants : Connector/MCP Server) avec sélecteur de portée (Marché Global / org). KB supprimé de la portée du Marché. Modèle d’abonnement unifié.
  • Injection intelligente de contenu de fichier + outil read_uploaded_file — Les petits téléchargements (moins de 32K caractères) sont automatiquement intégrés au contexte LLM ; les fichiers volumineux reçoivent des métadonnées + conseil d’outil. Outil de lecture en mode dual avec pagination et recherche regex. Point de terminaison GET /api/files/{file_id}/content.
  • Système de Blueprint de Workflow — Éditeur de workflow visuel pour l’automatisation multi-étapes : 25 types de nœuds (Start, End, LLM, ConditionBranch, QuestionClassifier, Agent, KnowledgeRetrieval, Connector, HTTPRequest, VariableAssign, TemplateTransform, CodeExecution, Iterator, Loop, VariableAggregator, ParameterExtractor, ListOperation, Transform, DocumentExtractor, QuestionUnderstanding, HumanIntervention, SubWorkflow, ENV et plus), éditeur React Flow v12 avec palette glisser-déposer, mise en page automatique, exécution en temps réel SSE, interpolation de variables, branchement conditionnel/classificateur, stratégies d’erreur par nœud, délai d’expiration par nœud, import/export/duplication, historique des versions avec visionneuse de diff, 14 modèles intégrés, 306 tests.
  • Déclencheurs de Workflow — Planification Cron avec support des fuseaux horaires ; clés API publiques (préfixe wf_) pour l’exécution externe sans authentification utilisateur ; exécution par lot (jusqu’à 100 ensembles d’entrée, parallélisme configurable).
  • Opérations de Workflow — Visionneuse de journal d’exécution en temps réel, visionneuse de trace avec snapshots de variables, superposition de relecture d’exécution sur le canevas, export d’historique d’exécution, tableau de bord analytique avec tendances quotidiennes et percentiles, panneau de statistiques par nœud, favoris/épinglage, badges de validation en ligne, recherche de nœud de canevas (Cmd+F), raccourcis clavier, magnétisme à la grille.
  • Admin Workflow + Modèles — Onglet de gestion admin pour tous les workflows, modèle WorkflowTemplate avec CRUD admin et 5 modèles de base, flux de publication avec gating de révision au niveau org, résolveur de conflits d’import pour les références externes.
  • Système de Skill Agent — Chargement de skill à la demande : modèle Skill avec CRUD/publish/review, outil read_skill(name) pour la divulgation progressive (~80% de réduction de tokens), compact_instructions par agent pour la compaction ContextGuard personnalisée. Interface utilisateur Skills complète avec page de liste, éditeur et sélecteur de skill d’agent.
  • ConnectorMetaTool (Phase de Divulgation Progressive 1-2) — Méta-outil unique remplaçant les outils par action. Le prompt système reçoit des stubs légers (~30 tokens/connecteur) ; l’agent appelle discover/execute à la demande. Drapeau de fonctionnalité CONNECTOR_TOOL_MODE pour la compatibilité rétroactive.
  • Import/export/fork de Connector — Partage de modèles de connecteur via export JSON, clonage et personnalisation via fork. Le backend assainit les identifiants à l’export.
  • Chiffrement des identifiants de Connector + remplacement par utilisateur — Table connector_credentials avec chiffrement Fernet, drapeau allow_fallback, points de terminaison GET/PUT/DELETE /my-credentials.
  • Interface utilisateur de révision de publication — Système de révision au niveau org avec flux de travail approuver/rejeter, badges de statut sur les cartes de ressources, avis de révision dans la boîte de dialogue de publication, resoumission pour les ressources rejetées.
  • Annotations de schéma sémantique — 16 balises sémantiques prédéfinies pour les champs de connecteur avec drapeaux description et pii, affichées dans les descriptions d’outils LLM.
  • Auto-réflexion en boucle d’Agent — Prompt de vérification d’objectif injecté tous les 6 itérations dans ReAct pour prévenir la dérive dans les longues chaînes.
  • Org Shadow Market + abonnements aux ressources — Partage de ressources basé sur l’extraction : ressources découvertes via le marketplace et explicitement souscrites. API Market pour parcourir/s’abonner/se désabonner.
  • Découverte automatique d’Agent + liaison de sous-agent — Drapeau discoverable + liste blanche sub_agent_ids + CallAgentTool pour la délégation à un niveau.
  • Identifiants de serveur MCP + remplacement par utilisateur — Table mcp_server_credentials avec drapeau allow_fallback pour le comportement de remplacement des identifiants.
  • Bascule Connector/KB — Points de terminaison de suspension/reprise pour les deux types de ressources.
  • Conversations KB autonomes — Champ kb_ids sur les conversations pour le chat KB direct sans liaison d’agent.
  • Onglet d’audit du journal de révision — Page d’audit admin avec bascule journal système / journal de révision et piste de révision filtrable par org/ressource.
  • Directive d’Agent dans la synthèse — Paramètre agent_directive garantissant que les réponses finales respectent l’objectif principal de l’agent.

Modifications

  • Modèle de visibilité basé sur l’abonnement — Simplifié de 3 niveaux à 2 niveaux (propre → abonné). La migration automatique préserve l’accès existant.
  • Liste blanche du cache d’outils — Remplacement de la liste noire par une propriété explicite cacheable sur les outils. 11 outils en lecture seule marqués comme pouvant être mis en cache.
  • Défaillance en cascade de l’exécuteur DAG — Les étapes échouées bloquent maintenant en cascade les dépendants avec propagation transitive.
  • Améliorations du planificateur DAG — Descriptions d’outils dans le planificateur, historique complet de la replanification sur tous les tours, 14 constantes du moteur paramétrées comme variables d’environnement.
  • Troncature d’observation stream_answer — Augmentée de 2000 à 8000 caractères (configurable via REACT_TOOL_OBS_TRUNCATION).
  • Interface utilisateur de confiance des preuves — Cartes d’avertissement ambre, badges de citation [N] avec popovers au survol, banneau d’avertissement de conflit avec comparaison côte à côte.
  • Résumés des modifications de version de flux de travail — Résumés lisibles générés automatiquement à partir des diffs de plan lors de l’enregistrement de la version.
  • Nettoyage de la rétention des exécutions de flux de travail — Tâche de nettoyage en arrière-plan avec limites d’âge/nombre configurables. Variables d’environnement : WORKFLOW_RUN_MAX_AGE_DAYS, WORKFLOW_RUN_MAX_PER_WORKFLOW.
  • Disjoncteur de connecteur — Machine à trois états (fermé/ouvert/semi-ouvert) avec suivi des défaillances par connecteur et points de terminaison de surveillance.
  • Remplacement d’elkjs par un auto-layout BFS léger — Bundle /workflows/[id] réduit de 473 kB à 43 kB.

Corrigé

  • Aplatissement de l’espace de noms d’évaluation de workflow — Résolution corrigée des noms de variables courts dans ConditionBranch et VariableAssign.
  • Pas de révision sur le basculement is_active — Le basculement de is_active ne rétablit plus publish_status de approved à pending_review.
  • Cascade-skip pour les branches de condition — Les nœuds ignorés désactivent correctement les arêtes sortantes.
  • Analyseur de dépendances — Résolution corrigée de skill_ids, correspondance de type de nœud insensible à la casse.

Supprimé

  • Suppression du champ is_global et de tous les concepts de visibilité globale — remplacés par l’organisation Market + abonnements.
  • Suppression des points de terminaison d’administration globale pour agent/serveur MCP.

[v0.7.5] - 2026-03-12

Ajouté

  • Changement de mode gratuit — Basculez entre Auto/React/DAG en cours de conversation. Suivi du mode par tour via metadata.mode.
  • Trois rôles de modèle — Configuration d’environnement indépendante pour les niveaux General, Fast et Reasoning. Le modèle Fast n’hérite plus des paramètres du modèle principal.
  • Améliorations du moteur DAG — Données structurées StepOutput, cache d’outils avec verrou asynchrone pour la prévention des pics de charge, vérification LLM par étape avec retry (DAG_STEP_VERIFICATION), routage automatique via classification LLM rapide (AUTO_ROUTING).
  • Chiffrement des identifiants du connecteur — Jetons d’authentification extraits vers la table connector_credentials avec chiffrement Fernet via CREDENTIAL_ENCRYPTION_KEY. Points de terminaison de remplacement des identifiants par utilisateur. Drapeau allow_fallback.
  • Chiffrement des clés API ModelConfig au repos — Chiffrement transparent à l’écriture / déchiffrement à la lecture avec détection de texte brut rétrocompatible.

Modifié

  • Écrans de chargement — Toutes les pages de liste/grille affichent des squelettes sensibles à la mise en page pendant le chargement au lieu de barres de progression.

Corrigé

  • Le modèle rapide n’hérite plus des paramètres du modèle principal.
  • Les noms de champs d’événement de routage SSE sont alignés avec le backend.

[v0.7.4] - 2026-03-12

Added

  • Evaluation Center — Test dataset management, parallel eval runs with LLM grading, per-case pass/fail/latency/token results viewer with auto-polling.
  • Admin: json_mode_enabled per-model flag — Explicit toggle preventing AWS Bedrock prefill issues. ENV models controlled by LLM_JSON_MODE_ENABLED.
  • SSE Protocol v2 — Real-time streaming with delta_reasoning, usage fields, split done/suggestions/title/end events.
  • AI Builder expansion — 7 new builder tools, is_builder flag, builder prompt auto-refresh, SSRF guard. Full ReAct agent dialog for connector management.
  • Dual database support — SQLite (zero-config) + PostgreSQL (production). Docker Compose auto-provisions PG with health checks.
  • Extended thinking / reasoningLLM_REASONING_EFFORT and LLM_REASONING_BUDGET_TOKENS for OpenAI o-series, Gemini 2.5+, Claude.
  • Admin: tool disable — Per-tool enable/disable toggles; disabled tools filtered from chat at runtime.
  • Settings: Organizations tab — Create, join, manage orgs with member roles directly from Settings.
  • Docker Compose deployment — Single image, named volumes, standalone Next.js output.
  • Export: PDF format — Conversations exportable as PDF documents.
  • Multi-worker supportWORKERS=N env var; Redis interrupt broker for cross-worker relay.

Modifications

  • Couche LLM : LiteLLM — Remplacement du client AsyncOpenAI direct pour une prise en charge universelle des fournisseurs.
  • Dégradation de la sortie structurée — Unification de structured_llm_call() avec extraction à 3 niveaux (Native FC → JSON Mode → texte brut + regex).
  • Routage intelligent des relais — Détection automatique du protocole API à partir des modèles de chemin d’URL pour les plateformes de relais tierces.

Corrigé

  • Traduction du chemin de montage de volume Docker sandbox (DooD).
  • Sécurité : validation AST dunder sandbox, défauts MCP stdio, rebinding DNS SSRF, évasion de métacaractères shell, injection de modèle de connecteur.
  • Crash des statistiques du tableau de bord administrateur sur PostgreSQL.
  • Docker : découverte de fichiers i18n, condition de course au démarrage, détection automatique OAuth pour les ports personnalisés.
  • Export : nom de fichier RFC 5987 pour CJK.

[v0.7.3] - 2026-03-06

Ajoutés

  • Serveurs MCP globaux — Provisionnés par l’administrateur, chargés dans toutes les sessions de chat.
  • Journalisation d’audit structurée — Assistant write_audit() avec colonnes structurées.

Corrigé

  • Rétrocompatibilité du code d’invitation pour le champ hérité registration_enabled.

[v0.7.2] - 2026-03-06

Ajouté

  • Inscription sur invitation — Trois modes (ouvert/invitation/désactivé) avec CRUD de code d’invitation.
  • Gestion du stockage — Utilisation disque par utilisateur, nettoyage et suppression des fichiers orphelins.
  • Déconnexion forcée par utilisateur — Révocation de jeton d’administrateur.
  • Modération des conversations — Administrateur peut lister/supprimer toutes les conversations.

[v0.7.1] - 2026-03-06

Ajouté

  • Tableau de bord de santé API — Statistiques système, métriques des connecteurs, graphiques d’utilisation des tokens.
  • Authentification JWT — Authentification SSE basée sur les tokens, propriété des conversations.
  • API Admin — Gestion des agents, quota de tokens par utilisateur (application de 429).

[v0.7] - 2026-03-06

Ajouté

  • Plateforme Admin — Gestion des utilisateurs, basculement des rôles, réinitialisation du mot de passe, activation/désactivation du compte.
  • Assistant de configuration initiale — Création guidée du compte administrateur.
  • Centre Personnel — Instructions globales par utilisateur, préférence de langue.

[v0.6.5] - 2026-03-05

Ajouté

  • Outils utilitairesemail_send, json_transform, template_render, text_utils.
  • Filtrage des réponses de connecteurCONNECTOR_RESPONSE_MAX_CHARS et CONNECTOR_RESPONSE_MAX_ITEMS.
  • Options de modèles d’intégration — Jina, OpenAI et fournisseurs personnalisés.

[v0.6] - 2026-03-01

Ajouté

  • Connector Platform — CRUD complet, ConnectorToolAdapter, chiffrement des identifiants par utilisateur, confirmation gate, circuit breaker, audit logging.
  • MCP integration — Découverte automatique des outils via le protocole, isolation des processus.

[v0.5] - 2026-02-28

Ajouté

  • Pipeline RAG complet — Jina embedding + LanceDB + FTS + RRF + reranker.
  • Génération ancrée — Citations basées sur des preuves, détection de conflits, scores de confiance.
  • Gestion des documents de la base de connaissances — CRUD au niveau des chunks, recherche, retry, migration de schéma.
  • ContextGuard + Messages épinglés — Gestionnaire de budget de tokens.
  • Re-planification DAG — Jusqu’à 3 rounds ; LLM Compact pour la mémoire.

[v0.4] - 2026-02-25

Ajouté

  • Conversations multi-tours — Persistance DbMemory, troncature intelligente.
  • Interface de repliage des étapes d’outils — Réduire/développer les appels d’outils.
  • Outils de requête HTTP et exécution shell.
  • Gestion des agents — Créer, configurer, publier avec modèles/outils liés.
  • Authentification JWT.

[v0.3] - 2026-02-25

Ajouté

  • Outils webweb_search (Jina/Tavily/Brave), web_fetch.
  • Opérations fichier + client MCP.
  • Visualisation DAG — Graphique de flux interactif avec statut en direct.
  • Exécution de code dans Docker--network=none, limites de mémoire, délai d’expiration.

[v0.2] - 2026-02-24

Ajouté

  • Retry & rate limiting — Backoff exponentiel.
  • Usage tracking — Comptabilité des tokens/coûts par requête.
  • Native function calling — Sélection directe des outils par le modèle.
  • Multi-model supportFAST_LLM_MODEL pour les étapes DAG.
  • Memory system — Mémoire fenêtrée, résumé, base de données.
  • FastAPI backend/api/execute, /api/stream (SSE).

[v0.1] - 2026-02-22

Ajouté

  • ReActAgent — Boucle Reason → Act → Observe.
  • DAGPlanner — Graphes de dépendances générés par LLM, exécution concurrente, vérification des résultats.
  • Tools — Calculatrice, exécution Python.
  • Portal UI — Next.js avec streaming, thème clair/sombre, KaTeX.