logo
Développement
Rechercher
Moteur de boucle Agent

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)
                      
                      AgentEngine
    │
    ├── OpenAIAdapter
    │   ├── Responses API(增量状态管理)
    │   └── Chat Completions API(全量上下文)
    │
    └── AnthropicAdapter
        └── Messages API(原生 streaming + thinking
                    
Ce bloc de code dans la fenêtre flottante

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) │ │ - 有工具调用 → 继续下一轮 │ │ │ └──────────────────────────────────────────────────────────┘
                      
                      ┌─ 预检验证 ──────────────────────────────────────────────┐
│ 拒绝超过输入预算 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)          │
│     - 有工具调用 → 继续下一轮                             │
│                                                          │
└──────────────────────────────────────────────────────────┘

                    
Ce bloc de code dans la fenêtre flottante

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