Boucle Agent & Récupération d'Erreurs
La boucle agentique principale : recevoir un message, appeler le LLM, exécuter les outils, itérer, répondre.
Flux de la Boucle Agent
- Persister le message utilisateur — stocké avec un score d'importance
- Auto-router le modèle — classifier la complexité de la requête (si non forcé manuellement)
- Construire le prompt système — prompt de base + compétences correspondantes + faits connus
- Récupérer le contexte — récupération tri-hybride de la mémoire
- Itérer (jusqu'à
max_iterations) :- Collecter les anciens souvenirs épinglés + messages récents (dédupliqués)
- Construire la liste de messages au format OpenAI
- Appeler le LLM avec récupération d'erreur classifiée
- Si appels d'outils → exécuter chacun, persister les résultats, continuer la boucle
- Si pas d'appels d'outils OU dernière itération → retourner la réponse texte
- Nombre max d'itérations atteint → retourner un message de timeout
Budget d'Itérations Dynamique
L'agent dispose d'un outil intégré request_more_iterations qui étend le budget de la boucle lorsque la limite actuelle est insuffisante :
- Étend le budget de 10 itérations par appel
- Un plafond strict empêche l'extension illimitée (typiquement 25 au total)
- Nécessite un paramètre
reasonexpliquant ce qui reste à faire - Utilisé lorsque l'agent a un plan clair mais manquerait d'itérations en cours de tâche
Stratégie de Récupération d'Erreurs
La méthode call_llm_with_recovery classifie les erreurs et réagit en conséquence :
| Type d'Erreur | Stratégie |
|---|---|
| Auth / Billing | Retourner immédiatement à l'utilisateur — pas de nouvelle tentative |
| Rate Limit | Attendre retry_after_secs (plafonné à 60s), réessayer une fois |
| Timeout / Network / Server Error | Attendre 2s, réessayer une fois ; en cas d'échec, basculer vers le modèle précédent |
| Not Found (bad model) | Basculer immédiatement vers le modèle de secours |
| Unknown | Propager comme erreur |
Last Known Good
Après chaque appel LLM réussi, la configuration actuelle est sauvegardée en tant que
config.toml.lastgood. Cela permet la récupération automatique après des changements de configuration incorrects.Correction de l'Ordre des Messages
Pour satisfaire les contraintes des fournisseurs Gemini, Anthropic et OpenAI, aidaemon exécute une correction en trois passes sur l'historique des messages avant chaque appel LLM :
- Passe 1 : Fusionner les messages consécutifs du même rôle (combine les tableaux tool_calls)
- Passe 2 : Supprimer les résultats d'outils orphelins (pas de tool_call assistant correspondant) et retirer les tool_calls orphelins (pas de résultat d'outil correspondant)
- Passe 3 : Fusionner à nouveau après que la suppression des orphelins peut créer de nouveaux messages consécutifs du même rôle
Exécution des Outils
Pendant la boucle, chaque appel d'outil reçoit :
_session_id— injecté automatiquement pour le suivi de session_untrusted_source— indicateur défini pour les sessions provenant de déclencheurs
Détection de Blocage & Répétition
La boucle agent inclut des protections contre les blocages :
- Détection de blocage — si le même outil est appelé 3+ fois consécutivement avec des arguments similaires, la boucle s'interrompt
- Détection de répétition — détecte le texte de réponse répété et force une interruption
- Limite stricte d'itérations — par défaut 10, extensible à 25 via
request_more_iterations
Types de Sessions
| Type de Session | Format | Trusted |
|---|---|---|
| Chat Telegram | ID du chat en chaîne | Oui |
| Canal Slack | slack:{channel_id} ou slack:{channel_id}:{thread_ts} | Oui |
| Canal Discord | discord:{channel_id} | Oui |
| Déclencheur email | email_trigger | Non |
| Déclencheur d'événement | event_{uuid} | Non |
| Sous-agent | sub-{depth}-{uuid} | Hérité |