đŹđ§ English version
Voir aussi : Guide comparatif ProcessTypes · Schéma YAML · Retour à l'index
Orchestration agentique autonome
Vue d'ensemble
Orkeon fournit un mode d'orchestration autonome (ProcessType.Autonomous) oĂč les agents s'auto-organisent pour rĂ©clamer des tĂąches, dĂ©lĂ©guer rĂ©cursivement Ă leurs pairs, et spawner des sous-agents spĂ©cialisĂ©s Ă la volĂ©e. Toute l'exĂ©cution est contrainte par un AgentExecutionBudget multi-dimensions qui garantit la terminaison.
Défaut DI à connaßtre : de base,
ITaskDelegatorest un stub qui refuse toute demande de dĂ©lĂ©gation (il avertit une fois, avec le correctif) â voir Comportements par dĂ©faut avant de cĂąbler une crew qui dĂ©lĂšgue beaucoup.
Contrairement aux modes Sequential/Hierarchical oĂč l'orchestrateur contrĂŽle le flux, et au mode Graph oĂč le graphe d'Ă©tat dĂ©finit la topologie, le mode Autonomous laisse les agents prendre les dĂ©cisions de dĂ©lĂ©gation et de spawn. L'orchestrateur n'intervient que pour enforcer le budget et collecter les rĂ©sultats.
Positionnement par rapport aux autres stratégies
| Stratégie | Décision de routing | Délégation récursive | Spawn dynamique | Budget multi-dimensions | Communication A2A |
|---|---|---|---|---|---|
| Sequential | Fixe (ordre liste) | Non | Non | Non | Non |
| Hierarchical | Manager LLM | 1 niveau | Non | Non | Unidirectionnel |
| Graph | Edges conditionnels | Non | Non | Non (circuit breaker) | Non |
| Autonomous | Agent auto-selection | Oui (profondeur contrÎlée) | Oui (quota) | Oui (5 dimensions) | Request/Response |
Architecture
Couche Domain â Budget d'execution
| Classe | Fichier | Role |
|---|---|---|
AgentExecutionBudget |
Autonomous/AgentExecutionBudget.cs |
Budget multi-dimensions : tool calls, delegation depth, wall time, tokens, spawns |
BudgetSnapshot |
Autonomous/AgentExecutionBudget.cs |
Snapshot immutable pour logging et telemetrie |
BudgetExhaustedException |
Autonomous/AgentExecutionBudget.cs |
Exception typee avec BudgetDimension (ToolCalls, DelegationDepth, WallTime, Tokens, SpawnedAgents) |
BudgetDimension |
Autonomous/AgentExecutionBudget.cs |
Enum des 5 dimensions du budget |
Le budget est thread-safe (compteurs Interlocked) et immutable aprÚs construction (limites en init). Chaque action (RecordToolCall, RecordDelegation, RecordSpawn, RecordTokens) décrémente le budget et lÚve BudgetExhaustedException si la limite est atteinte.
Couche Domain â ProcessType
ProcessType.Autonomous est ajouté au value object existant. IProcessStrategy expose une nouvelle méthode :
Task<CrewOutput> ExecuteAutonomousAsync(
Crew crew,
AgentExecutionBudget budget,
IReadOnlyDictionary<string, string>? inputVariables = null,
CancellationToken cancellationToken = default);
Couche Application â Communication A2A
| Classe | Fichier | RĂŽle |
|---|---|---|
IAgentChannel |
Interfaces/Services/IAgentChannel.cs |
Canal bidirectionnel request/response entre agents |
AgentChannelRequest |
Interfaces/Services/IAgentChannel.cs |
Request avec correlation ID, intent, payload |
AgentChannelResponse |
Interfaces/Services/IAgentChannel.cs |
Response corrélée avec succÚs/erreur |
NullMemoryScope |
Context/NullMemoryScope.cs |
Singleton no-op pour les contextes sans mémoire |
IAgentChannel supporte trois modes :
- RequestAsync : request/response synchrone avec timeout configurable
- RegisterHandler : enregistrement d'un handler par agent (retourne
IDisposable) - BroadcastAsync : notification Ă tous les agents d'un crew (fire-and-forget)
Couche Infrastructure â StratĂ©gie autonome
| Classe | Fichier | RĂŽle |
|---|---|---|
AutonomousProcessStrategy |
Crew/Strategies/AutonomousProcessStrategy.cs |
Implémente IProcessStrategy.ExecuteAutonomousAsync |
InMemoryAgentChannel |
Communication/InMemoryAgentChannel.cs |
Implémentation in-process du canal A2A (lock-free, ConcurrentDictionary) |
SpawnAgentTool |
Tools/SpawnAgentTool.cs |
Outil permettant aux agents de spawner des sous-agents |
Couche Infrastructure â Modifications existantes
| Classe | Modification |
|---|---|
ProcessStrategyFactory |
Ajout du case "Autonomous" â AutonomousProcessStrategy |
SequentialCrewOrchestrator |
Ajout du dispatch "Autonomous" avec AgentExecutionBudget.Permissive |
DelegateWorkTool |
Ajout du paramÚtre AgentExecutionBudget? optionnel, appel RecordDelegation() avant chaque délégation |
Flux d'execution
ââââââââââââââââââââââââââââââââââââââââââââââ
â AutonomousProcessStrategy â
â â
Crew.Tasks âââș â pour chaque task : â
â 1. AssignTaskAsync (LLM-based) â
â 2. budget.RecordToolCall() â
â 3. ExecuteTaskAsync(agent, task) â
â 4. Si Ă©chec + AllowDelegation : â
â ââ budget.RecordDelegation() â
â ââ channel.RequestAsync(peer, task) â
â ââ peer exĂ©cute avec childBudget â
â 5. BudgetExhausted? â partial output â
â â
ââââââââââââââââââââââââââââââââââââââââââââââ
SpawnAgentTool (optionnel, injecté dans l'agent) :
1. budget.RecordSpawn()
2. IAgentFactory.CreateAgentAsync(spawnRequest)
3. ExecuteTaskAsync(spawnedAgent, task) avec childBudget
Budget multi-dimensions
Le budget contrÎle 5 dimensions indépendantes. Chaque dimension a un compteur thread-safe et une limite. L'épuisement de n'importe quelle dimension lÚve BudgetExhaustedException.
| Dimension | Défaut | Strict | Permissive | Description |
|---|---|---|---|---|
| MaxToolCalls | 15 | 8 | 50 | Nombre max d'appels outils |
| MaxDelegationDepth | 2 | 1 | 4 | Profondeur max de dĂ©lĂ©gation rĂ©cursive (AâBâC = 2) |
| MaxWallTime | 5 min | 2 min | 15 min | Temps réel maximum |
| MaxTokensConsumed | 16 000 | 8 000 | 64 000 | Tokens totaux (prompt + completion) |
| MaxSpawnedAgents | 3 | 1 | 10 | Nombre max de sous-agents créés |
Presets
// Production : limites conservatrices
var budget = AgentExecutionBudget.Strict;
// Développement : limites larges
var budget = AgentExecutionBudget.Permissive;
// Custom
var budget = new AgentExecutionBudget
{
MaxToolCalls = 20,
MaxDelegationDepth = 3,
MaxWallTime = TimeSpan.FromMinutes(10),
MaxTokensConsumed = 32_000,
MaxSpawnedAgents = 5
};
Child budgets
Quand un agent delegue ou spawne, le sous-agent recoit un child budget derive avec les quotas restants :
var childBudget = parentBudget.CreateChildBudget();
// MaxToolCalls = parent.Max - parent.Current
// MaxDelegationDepth = parent.Max - parent.Current - 1
// MaxWallTime = parent.Max - parent.Elapsed
// etc.
Cela garantit que la somme des consommations enfants ne dépasse jamais le budget parent.
Communication A2A (IAgentChannel)
Le canal bidirectionnel permet aux agents de communiquer en mode request/response :
// Agent A demande a Agent B de clarifier
var request = AgentChannelRequest.Create(
from: agentA.Id,
to: agentB.Id,
intent: "clarify",
payload: "Quel format de données pour le rapport ?");
var response = await channel.RequestAsync(request, timeout: TimeSpan.FromSeconds(30));
if (response.Success)
Console.WriteLine($"Réponse: {response.Payload}");
Intents standards
| Intent | Description |
|---|---|
delegate |
Délégation de travail (traitement par le handler du target) |
clarify |
Demande d'information ou de précision |
broadcast |
Notification Ă tous les agents du crew |
L'implémentation InMemoryAgentChannel est in-process et lock-free. Pour un déploiement multi-host, implémenter IAgentChannel avec Redis Streams ou un message broker.
SpawnAgentTool â Self-spawn d'agents
Outil injecté dans les agents autonomes pour créer des sous-agents spécialisés à la
volée. La classe est livrée dans Orkeon.Infrastructure mais aucune racine de
composition livrée ne l'enregistre : un hÎte qui veut le self-spawn enregistre
SpawnAgentTool explicitement (il exige un IAgentFactory) â voir
l'inventaire des tools.
// Le LLM de l'agent génÚre cet appel d'outil :
{
"tool": "spawn_agent",
"parameters": {
"role": "data_analyst",
"goal": "Analyser les tendances de ventes Q4",
"task": "Produire un rapport CSV des ventes par region",
"wait_for_result": true,
"allow_delegation": false
}
}
Chaque spawn est contrÎlé par le budget (RecordSpawn). L'agent spawné reçoit un child budget avec des limites réduites (5 itérations max, quotas restants).
Observabilite
Metadata de sortie
Le CrewOutput en mode Autonomous inclut des metadata de budget :
{
"process_type": "autonomous",
"agent_count": 3,
"budget_tool_calls": "12/15",
"budget_delegation_depth": "1/2",
"budget_tokens": "9200/16000",
"budget_spawned": "1/3",
"budget_exhausted": false
}
BudgetSnapshot
budget.ToSnapshot() retourne un BudgetSnapshot immutable à tout moment, loggable et sérialisable.
Logging structuré
Tous les événements clés sont loggés via LoggerMessage :
Starting autonomous execution for crew {CrewId} (budget: {MaxToolCalls} tool calls, depth {MaxDepth})Agent {AgentId} claimed task {TaskId}: {Reason}Delegation: {From} -> {To} for task {TaskId} (depth: {Depth})Budget exhausted for crew {CrewId}: dimension={Dimension}, {Message}Agent {ParentId} spawned sub-agent {ChildId} (role: {Role})
Configuration YAML
# Racine plate â pas d'enveloppe crew: ; agents: est un mapping indexĂ© par id.
name: research-team
process: autonomous # â active le mode autonome
goal: "Produire un rapport de recherche complet"
agents:
researcher:
role: Chercheur
goal: "Trouver des sources fiables"
allowDelegation: true
tools: [web_search, spawn_agent] # â spawn_agent pour self-spawn (enregistrĂ© par l'hĂŽte)
analyst:
role: Analyste
goal: "Analyser et synthétiser les données"
allowDelegation: true
tools: [json_tool, csv_reader]
writer:
role: Rédacteur
goal: "Rédiger le rapport final"
allowDelegation: false
Note : il n'existe pas de clé YAML
autonomousBudgetâ le loader n'en parse pas. Dans les crews YAML, le mode Autonomous s'exĂ©cute toujours avecAgentExecutionBudget.Permissive(50 appels d'outils, profondeur 4, 15 min, 64 000 tokens, 10 spawns) ; un budget personnalisĂ© (presetsStrict/Default/Permissiveou valeurs custom) n'est disponible que via l'API C#.
Complémentarité avec les autres modes
| Besoin | Mode recommandé |
|---|---|
| Pipeline linéaire, déterminisme maximal | Sequential |
| Manager centralisé, review de qualité | Hierarchical |
| Tùches indépendantes, parallélisme | Parallel |
| Boucles de raffinement, retry conditionnel | Graph |
| Agents auto-organisés, délégation récursive, spawn dynamique | Autonomous |
Le mode Autonomous est le plus expressif mais aussi le moins dĂ©terministe. Pour les workloads de production sensibles, prĂ©fĂ©rer Sequential ou Hierarchical et rĂ©server Autonomous aux cas oĂč l'autonomie des agents apporte une valeur supĂ©rieure au coĂ»t de non-dĂ©terminisme (recherche exploratoire, creative writing, rĂ©solution de problĂšmes complexes multi-domaines).
Voir aussi : Guide comparatif ProcessTypes · Orchestration Graph · Schéma YAML · Retour à l'index