# Changelog — FlowDeck ## v4.11.1 (2026-09-05) — Correction & intégration des points d'entrée IA > Aligne les entrées AI de l'interface sur le FlowDeck Agent (alignement Guide Notion AI) et corrige > les trois boutons qui ne fonctionnaient pas : **Ask AI**, **AI meeting note** (toolbar « Get > started » de l'éditeur de page) et le **bouton rond flottant FlowDeck Agent** (coin bas-droit). ### Fix - **Bouton flottant Agent 🤖 (coin bas-droit)** : le chat restait inerte tant qu'aucune conversation n'existait (`send()` retournait silencieusement sans `currentConv`). Ajout d'une création de conversation **lazy** (`ensureConversation()`) effectuée avant chaque envoi — la 1ère saisie crée la conversation puis l'exécute (mode offline ou LLM réel). - **« Ask AI » & « AI meeting note »** : ne faisaient qu'insérer du texte placeholder (« Ask AI to write... » / « AI Meeting Note ») sans aucun appel IA. Ils déclenchent désormais une **génération inline réelle** via le FlowDeck Agent : - méthodes `askAI()` / `meetingNote()` / `aiRun()` / `applyAIBlocks()` sur l'éditeur de page ; - un prompt contextuel est envoyé au panneau agent (exposition d'`window.fdAgent.ask`) ; - la réponse (`event final` du flux SSE) est **insérée automatiquement dans la page** sous forme de blocs édités (hook `window.__fdInsertAI`). - Un état `aiBusy` évite les doubles envois pendant la génération. ### Infra - `VERSION` → 4.11.1. ## v4.11.0 (2026-09-05) — Agent IA : clés API par utilisateur & chargement dynamique des modèles > Suite de v4.10.1 : migre la config LLM d'un **global admin** vers des **credentials par > utilisateur**. Chacun peut enregistrer plusieurs provider + clé API dans son profil, les modèles > disponibles sont **chargés automatiquement depuis le fournisseur**, et le provider/modèle actif > d'une conversation se pilote **directement dans le chat** via des commandes slash. ### Added - **Clés par utilisateur** : table `user_llm_keys` (UNIQUE(user_id, provider)) + service `app/services/llm_config.py` : `get_user_llm_key`, `list_user_llm_keys` (masqué), `upsert_user_llm_key`, `delete_user_llm_key`. Une clé vide conserve l'existante. - **Chargement dynamique des modèles** : `fetch_provider_models()` (httpx) — GET `{base}/models` pour OpenAI-compatible (Bearer), headers `x-api-key`/`anthropic-version` (Anthropic), `x-goog-api-key` (Gemini) ; stockés dans `models_json` et fusionnés dans `GET /providers`. - **Endpoints API** (tout utilisateur authentifié) : - `GET /api/agent/keys`, `PUT/DELETE /api/agent/keys/{provider}`, - `POST /api/agent/keys/{provider}/models` (fallback sur la clé stockée, pas de fuite de clé), - `PATCH /api/agent/conversations/{id}` (title / provider / model — commande slash). - **`POST /run`** : utilise la clé API de l'utilisateur pour le provider de la conversation (sinon config globale / `.env` / offline mock). - **UI Settings → Agent & IA** (visible pour tous, plus seulement admin) : carte par provider (clé API masquée, URL API, « Charger les modèles » en live, modèle par défaut, Enregistrer / Supprimer). La config globale reste admin sous « Configuration globale ». - **Commandes slash dans le panel agent** : `/help`, `/providers`, `/keys`, `/provider `, `/model ` — menu de suggestions live, appliquées via `PATCH` et sans appel LLM. ### Infra - `VERSION` → 4.11.0 ; migration idempotente (création table `user_llm_keys` + index). ### Tests - **239 tests verts** (+7 : CRUD clés + masquage des secrets, isolation par utilisateur, provider invalide, fetch modèles (clé stockée / body gagnant / erreur), PATCH conversation, `/run` utilise la clé de l'utilisateur). > Comble le trou UX de v4.10.0 : l'utilisateur pouvait discuter avec l'agent mais **ne pouvait > configurer ni provider ni modèle**. Ajout d'un sélecteur provider/modèle dans le panneau, d'une > config runtime persistée en base (table `llm_config`) et d'un écran admin avec test de connexion. ### Added - **Sélecteur provider/modèle dans le panneau agent** (`agent_panel.html`) : deux `