Trace of bugfix
This commit is contained in:
127
BUGFIX_MCP_ERROR_HANDLING.md
Normal file
127
BUGFIX_MCP_ERROR_HANDLING.md
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
# 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 :
|
||||||
|
```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
|
||||||
Reference in New Issue
Block a user