4.5 KiB
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:<nil>} Type:text Text:Error: Failed to fetch the URL: Not Found}] IsError:true}"
Code problématique :
// 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é :
// 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 :
- Recevra le message d'erreur complet
- Sera guidé vers l'utilisation de
web-search-searxng_web_searchcomme alternative - 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 :
{
"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 :
if textContent, ok := content.(*mcp.TextContent); ok {
Il fallait utiliser la fonction appropriée de la bibliothèque mark3labs/mcp-go :
if textContent, ok := mcp.AsTextContent(content); ok {
Test de la correction
La correction a été testée avec :
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
stringspour la détection de type d'erreur
Prochaines étapes recommandées
- Tester avec un déploiement Docker complet
- Vérifier que l'agent utilise bien
web-search-searxng_web_searchaprès cette erreur - Surveiller les logs pour confirmer que les boucles infinies sont évitées