Files
LocalAGI/BUGFIX_MCP_ERROR_HANDLING.md
2025-06-14 21:47:16 +02:00

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 :

  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 :

{
  "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 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