# Correction du bug de gestion d'erreur MCP ## Problème identifié L'agent Nabu entrait dans une boucle infinie en essayant d'accéder à une URL Wikipedia inexistante avec l'outil `web-search-web_url_read`. Le problème était dans le fichier `core/agent/mcp.go` à la ligne 68. ### Symptômes observés dans les logs : ``` mcphub-1 | [2025-06-14T13:51:11.649Z] [INFO] [web-search] [child] Error: Failed to fetch the URL: Not Found localagi-1 | time=2025-06-14T13:51:11.649Z level=DEBUG msg="MCP response" response="&{Result:{Meta:map[]} Content:[{Annotated:{Annotations:} Type:text Text:Error: Failed to fetch the URL: Not Found}] IsError:true}" ``` ### Code problématique : ```go // Traiter le résultat textResult := "" if result.IsError { return types.ActionResult{}, err // ❌ err est nil ici ! } ``` Quand `result.IsError` était `true`, le code retournait `err` qui était `nil`, ce qui faisait que l'agent ne recevait aucune information sur l'erreur et continuait à essayer la même action. ## Solution implémentée ### 1. Correction de la gestion d'erreur - Extraction du contenu de l'erreur avant de vérifier `result.IsError` - Retour du message d'erreur comme résultat au lieu de faire échouer l'action - Ajout de suggestions spécifiques selon le type d'erreur ### 2. Code corrigé : ```go // Traiter le résultat textResult := "" // Extraire le texte du résultat selon le format de mark3labs/mcp-go for _, content := range result.Content { if textContent, ok := content.(*mcp.TextContent); ok { textResult += textContent.Text + "\n" } else { xlog.Error("Unsupported content type", "type", content) } } // Si c'est une erreur, retourner le contenu de l'erreur comme résultat // plutôt que de faire échouer complètement l'action if result.IsError { xlog.Error("MCP tool returned error", "tool", m.toolName, "error", textResult) // Fournir des suggestions spécifiques selon le type d'erreur errorMessage := textResult if strings.Contains(strings.ToLower(textResult), "not found") { if m.toolName == "web-search-web_url_read" { errorMessage = "L'URL spécifiée n'a pas pu être trouvée. Essayez plutôt d'utiliser l'outil de recherche web 'web-search-searxng_web_search' pour chercher des informations sur ce sujet." } else { errorMessage = "Ressource non trouvée: " + textResult } } // Retourner le message d'erreur comme résultat pour que l'agent puisse réagir return types.ActionResult{ Result: "Erreur: " + errorMessage, }, nil } ``` ### 3. Améliorations apportées : - ✅ L'agent reçoit maintenant le message d'erreur complet - ✅ Suggestions intelligentes pour utiliser des outils alternatifs - ✅ Logging approprié des erreurs MCP - ✅ Prévention des boucles infinies sur les erreurs ## Impact attendu Avec cette correction, quand l'agent Nabu rencontre une erreur "Not Found" avec `web-search-web_url_read`, il : 1. Recevra le message d'erreur complet 2. Sera guidé vers l'utilisation de `web-search-searxng_web_search` comme alternative 3. Pourra adapter sa stratégie au lieu de répéter la même action échouée ## Corrections supplémentaires ### Problème de parsing des réponses MCP Après le premier fix, un nouveau problème est apparu : LocalAGI n'arrivait pas à parser correctement les réponses MCP qui utilisent la structure : ```json { "content": [ { "type": "text", "text": "Title: Meteo Montjaux... [contenu complet]" } ], "isError": false } ``` ### Solution : Utilisation de `mcp.AsTextContent()` Le problème était dans la conversion de type à la ligne 71. Au lieu d'utiliser : ```go if textContent, ok := content.(*mcp.TextContent); ok { ``` Il fallait utiliser la fonction appropriée de la bibliothèque `mark3labs/mcp-go` : ```go if textContent, ok := mcp.AsTextContent(content); ok { ``` ## Test de la correction La correction a été testée avec : ```bash go build ./core/agent # ✅ Compilation réussie docker build -f Dockerfile.webui -t localagi-fixed:v2 . # ✅ Image Docker construite ``` ## Fichiers modifiés - `core/agent/mcp.go` : - Correction de la gestion d'erreur MCP (ligne 68) - Correction du parsing des réponses MCP (ligne 71) - Ajout de l'import `strings` pour la détection de type d'erreur ## Prochaines étapes recommandées 1. Tester avec un déploiement Docker complet 2. Vérifier que l'agent utilise bien `web-search-searxng_web_search` après cette erreur 3. Surveiller les logs pour confirmer que les boucles infinies sont évitées