Status : EN ATTENTE
Probleme : L'utilisateur attend 5-8s avec juste des "loading dots" sans savoir ce qui se passe.
Solution : Nouveau endpoint SSE qui emet des events de progression.
Backend (aiChat.ts) :
sendMessageStream() qui retourne un ReadableStream SSE{"step":"intent","detail":"Detection d'intent..."}{"step":"intent_result","detail":"Haute confiance: Jellyfin (recherche)"}{"step":"api_call","detail":"Appel API Jellyfin /Items?searchTerm=batman..."}{"step":"api_result","detail":"2 resultats trouves"}{"step":"formatting","detail":"Mise en forme des resultats..."}{"step":"done","message":{...},"assistantMessage":{...}}{"step":"llm_call","detail":"Envoi au LLM (mistral:latest)..."}{"step":"tool_call","detail":"Execution outil: fetch jellyfin..."}{"step":"llm_format","detail":"Formatage de la reponse..."}{"step":"done","message":{...}}API (index.ts) :
/api/ai/conversations/:id/messages → garde l'ancien comportement (retro-compatible)/api/ai/conversations/:id/messages/stream → SSE avec progress eventsFrontend (ChatMessages.tsx) :
AI
[===== ] Detection d'intent...
[==========] Haute confiance: Jellyfin
[===============] Appel API Jellyfin...
[====================] 2 resultats, mise en forme...
EventSource ou fetch avec ReadableStream pour lire le SSEFichiers modifies :
| Fichier | Action |
|---|---|
connectors-api/src/services/aiChat.ts |
Ajouter sendMessageStream() |
connectors-api/src/index.ts |
Ajouter route /messages/stream |
connectors-front/src/routes/chat/[id]/index.tsx |
Switch vers SSE |
connectors-front/src/components/ai/ChatMessages.tsx |
Affichage steps |
connectors-front/src/lib/api.ts |
Ajouter sendChatMessageStream() |
Probleme : Mistral omet les URLs "par securite", genere du texte brut au lieu de markdown.
Solution : Si le formatter LLM produit un resultat sans URLs alors que les data en contenaient, retry avec un autre modele.
Implementation dans aiChat.ts :
/player?, /api/stream/)_playerUrl/_imageUrl mais le resultat LLM non → retry avec modele fallbackconv.model → deepseek-r1:7b → llama3:latestlistModels()Fichiers modifies :
| Fichier | Action |
|---|---|
connectors-api/src/services/intentExecutor.ts |
Ajouter formatWithFallback() |
connectors-api/src/services/aiChat.ts |
Utiliser formatWithFallback() |
Probleme : Si "cherche batman" ne trouve rien sur Jellyfin, l'utilisateur recoit "0 resultats" sans alternatives.
Solution : Retry automatique avec parametres elargis.
Implementation dans intentExecutor.ts :
includeItemTypes (chercher dans TOUT)searchTerm (premier mot seulement)Fichiers modifies :
| Fichier | Action |
|---|---|
connectors-api/src/services/intentExecutor.ts |
Ajouter deepSearch() |
/messages existant (retro-compatible)