Moteur de boucle Agent
Vue d'ensemble
Le moteur de boucle Agent (Agent Loop) est le mécanisme d'exécution central du module Work de l'espace de travail. Il pilote l'agent IA dans une boucle autonome de raisonnement-exécution : analyser la tâche → choisir un outil → exécuter l'opération → évaluer le résultat → poursuivre le raisonnement, jusqu'à ce que la tâche soit terminée ou qu'une condition de sortie soit déclenchée.
Le moteur adopte une architecture provider-agnostic et prend en charge plusieurs fournisseurs de modèles via une interface LLM Adapter unifiée.
Architecture
Adaptateur LLM
AgentEngine
│
├── OpenAIAdapter
│ ├── Responses API(增量状态管理)
│ └── Chat Completions API(全量上下文)
│
└── AnthropicAdapter
└── Messages API(原生 streaming + thinking)
L'adaptateur gère automatiquement :
- La conversion du format des messages (OpenAI ↔ Anthropic)
- La conversion des définitions d'outils
- Le traitement des Think Tags (suppression automatique des balises
<think>de modèles comme DeepSeek)
Flux de la boucle
┌─ 预检验证 ──────────────────────────────────────────────┐
│ 拒绝超过输入预算 60% 的提示词,防止静默截断 │
└──────────────────────────┬──────────────────────────────┘
▼
┌─ 主循环(Round 0 → maxTurns-1)─────────────────────────┐
│ │
│ ① 上下文管理 │
│ - 预防性工具结果截断(Layer 1) │
│ - 检查是否需要压实(shouldPreemptiveCompact) │
│ │
│ ② LLM 调用 │
│ - 流式推理(text_delta + thinking + tool_use) │
│ - 事件实时推送到 UI │
│ │
│ ③ 工具执行 │
│ - validateToolCalls → 验证合法性 │
│ - 并发分区 → 按 concurrency 元数据分组 │
│ - 并行执行 → 结果归一化 │
│ │
│ ④ 退出判断 │
│ - 无工具调用 → 退出(end_turn) │
│ - 达到限制 → 退出(max_rounds/max_budget/deadline) │
│ - 异常 → 退出(circuit_breaker/fatal_error) │
│ - 有工具调用 → 继续下一轮 │
│ │
└──────────────────────────────────────────────────────────┘
Paramètres de la boucle
| Paramètre | Valeur par défaut | Description |
|---|---|---|
maxTurns |
25 | Nombre maximal de tours de boucle |
maxErrors |
— | Seuil d'erreurs d'outil consécutives |
maxBudgetInputTokens |
— | Plafond du budget de tokens d'entrée |
maxExecutionMs |
— | Limite de temps d'exécution (millisecondes) |
snapshotStrategy |
every_tool_round |
Stratégie de sauvegarde des instantanés |
resumeSessionId |
— | ID pour reprendre une session interrompue |
8 conditions de sortie
| Motif de sortie | Condition de déclenchement |
|---|---|
| end_turn | L'Agent a terminé la tâche, plus aucun appel d'outil |
| max_rounds | Le plafond maxTurns est atteint (25 tours par défaut) |
| circuit_breaker | 5 échecs consécutifs d'appels LLM |
| no_tool_calls | Aucune demande d'appel d'outil dans la réponse du LLM |
| user_cancel | Interruption manuelle par l'utilisateur |
| context_overflow | Débordement persistant après compression du contexte |
| fatal_error | Erreur irrécupérable (échec d'authentification, problème de facturation, etc.) |
| compaction_exhausted | Nombre de nouvelles tentatives de compression épuisé (5 au maximum) |
Mécanisme du disjoncteur
Empêche les échecs consécutifs du LLM de provoquer des tentatives infinies :
| Paramètre | Valeur | Description |
|---|---|---|
CIRCUIT_OPEN_THRESHOLD |
5 | 5 échecs consécutifs déclenchent le disjoncteur |
CIRCUIT_OPEN_WAIT_MS |
60 000 | Refroidissement de 60 secondes après l'ouverture du disjoncteur |
Classification des erreurs et stratégie de nouvelle tentative :
| Type d'erreur | Stratégie |
|---|---|
rate_limit |
Nouvelle tentative avec backoff exponentiel + gigue aléatoire |
timeout / overloaded |
Nouvelle tentative immédiate |
context_overflow |
Déclenche la compression du contexte |
auth / billing / model_not_found |
Levée directe (sans nouvelle tentative) |
Événements en flux continu
Le déroulement de l'exécution de l'Agent notifie l'interface utilisateur en temps réel via des événements en flux continu :
| Type d'événement | Données | Description |
|---|---|---|
text_delta |
Fragment de texte | Poussée incrémentale de la sortie textuelle de l'Agent |
thinking |
Fragment de pensée | Contenu natif de la chaîne de pensée (modèles thinking d'Anthropic) |
tool_use_start |
Nom de l'outil + paramètres | Début de l'appel d'outil |
tool_result |
Résultat d'exécution | Exécution de l'outil terminée |
error |
Message d'erreur | Erreur survenue durant l'exécution |
done |
Motif de sortie | Fin du tour de boucle en cours |
Les événements des sous-agents sont transmis à l'interface utilisateur de l'Agent parent.
Calibrage des tokens par EMA
Le moteur utilise une moyenne mobile exponentielle (EMA) pour calibrer dynamiquement la précision de l'estimation des tokens :
| Paramètre | Valeur | Description |
|---|---|---|
| Valeur initiale | 3.0 chars/token | Estimation conservatrice (adaptée aux scénarios mixtes chinois + code) |
| 3 premières fois | Convergence par moyenne | Rapprochement rapide de la valeur réelle |
| Ensuite | EMA α=0.15 | Suivi lissé de la consommation réelle |
| Filtrage | 0.5 < observed < 8 | Exclusion des valeurs aberrantes |
Après chaque appel LLM, le facteur de calibrage est mis à jour avec la consommation réelle de tokens, garantissant une estimation de plus en plus précise du budget de contexte.
Instantanés de session
Prise en charge de la persistance de l'état de la session, afin d'éviter la perte de progression en cas d'interruption inattendue :
| Stratégie | Moment de déclenchement |
|---|---|
every_tool_round (par défaut) |
Après chaque appel d'outil terminé |
every_round |
Après chaque interaction LLM |
manual |
Déclenchement manuel uniquement |
Les instantanés sont stockés sous forme de fichiers JSON, avec écriture atomique (.tmp + rename) pour éviter la corruption des fichiers. Une session interrompue peut être reprise via resumeSessionId.
Ce que cela signifie pour vous
L'Agent Loop est la capacité qui vous permet de percevoir que « l'Agent travaille en continu ». Lorsque vous dites « aide-moi à refactoriser la structure du code de ce projet », l'Agent ne se contente pas de répondre par une simple suggestion avant de s'arrêter — il parcourt automatiquement les fichiers, analyse la structure, effectue les modifications une à une et exécute les tests, jusqu'à ce que ce soit terminé.
Ce que vous pouvez observer :
- L'Agent appelle plusieurs outils à la suite (lister les fichiers → lire les fichiers → modifier les fichiers → exécuter les tests), et les appels d'outils apparaissent l'un après l'autre dans l'interface
- Si l'Agent échoue 5 fois de suite (par exemple à cause d'un délai d'attente de l'API), il fait une pause de 60 secondes au lieu de réessayer indéfiniment — vous verrez alors, après un temps d'attente, l'Agent vous signaler qu'il a rencontré un problème
- Par défaut, 25 tours au maximum sont exécutés ; les tâches extrêmement complexes peuvent s'arrêter après 25 tours, en vous indiquant que « le nombre maximal de tours a été atteint »
Ce que vous pouvez faire :
- Cliquer à tout moment sur le bouton Arrêter pour interrompre l'exécution de l'Agent
- Si l'Agent part dans une mauvaise direction, l'interrompre puis lui donner des instructions plus précises
- Pour les tâches particulièrement complexes, demander à l'Agent d'établir d'abord un plan avant d'exécuter (« établis d'abord un plan, exécute-le une fois que je l'ai confirmé »)
Documents connexes
- Stratégie de compression du contexte à 5 couches — Détails de la gestion du contexte
- Système de mémoire tridimensionnel — Injection et interrogation de la mémoire
- Interaction conversationnelle Work — Expérience de l'Agent Loop dans l'interface utilisateur
