Agents en arrière-plan

Les agents en arrière-plan permettent à un agent parent de déléguer des tâches indépendantes aux agents enfants nommés. Chaque tâche s’exécute simultanément dans sa propre session d’agent enfant, tandis que le parent conserve un ID de tâche qu’il peut utiliser pour attendre, récupérer les résultats, continuer le travail ou libérer la tâche.

Important

Les agents d’arrière-plan sont expérimentaux.

Les agents en arrière-plan se distinguent des réponses d’arrière-plan. Une réponse en arrière-plan représente une demande de fournisseur que l’application interroge ou reprend. Une tâche d’arrière-plan d’un agent appelle un autre agent du framework Agent Framework, puis transmet ultérieurement le résultat textuel de cet agent à l’agent parent.

Configurer manuellement des agents en arrière-plan

Chaque agent enfant doit avoir un nom non vide, unique sans distinction entre majuscules et minuscules. Donnez des instructions ciblées sur les agents enfants et uniquement les outils nécessaires pour leur rôle délégué.

Importez BackgroundAgentsProvider et ajoutez-le à un agent standard via ChatClientAgentOptions.AIContextProviders:

using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;

var backgroundProvider = new BackgroundAgentsProvider(
    [webSearchAgent, codeAnalysisAgent]);

AIAgent parentAgent = chatClient.AsAIAgent(new ChatClientAgentOptions
{
    Name = "research-coordinator",
    AIContextProviders = [backgroundProvider],
});

AgentSession session = await parentAgent.CreateSessionAsync();

BackgroundAgentsProviderOptions personnalise les instructions du fournisseur et la mise en forme de liste d’agents.

from agent_framework import Agent, BackgroundAgentsProvider

background_provider = BackgroundAgentsProvider(
    [web_search_agent, code_analysis_agent],
    wait_timeout_seconds=30,
)

parent_agent = Agent(
    client=client,
    name="research-coordinator",
    context_providers=[background_provider],
)
session = parent_agent.create_session()

Transmettez instructions= à BackgroundAgentsProvider pour remplacer ses instructions. Insérez {background_agents} à l’endroit où la liste des agents enfants mise en forme doit apparaître.

wait_timeout_seconds définit la durée pendant laquelle chaque appel attend background_agents_wait_for_first_completion . Il doit s’agir d’un entier positif et est défini par défaut sur 300 secondes. Si le délai d’expiration expire, l’outil retourne normalement et laisse les tâches en cours d’exécution, afin que le parent puisse l’appeler à nouveau.

Note

Le fournisseur packagé d’agent d’arrière-plan décrit sur cette page n’est actuellement pas disponible en Go.

Cycle de vie des tâches

Le fournisseur ajoute les mêmes outils orientés modèle dans .NET et Python :

Tool Action de cycle de vie
background_agents_start_task Démarrez une tâche non bloquante sur un agent nommé et retournez son ID de tâche entier.
background_agents_wait_for_first_completion Attendez que la première tâche d’un ensemble fourni atteigne un état terminal.
background_agents_get_task_results Retournez le texte terminé, un message d’échec ou l’état actuel.
background_agents_get_all_tasks Répertorier les ID, les états, les noms de l’agent et les descriptions.
background_agents_continue_task Exécutez une entrée de suivi dans la session enfant existante une fois qu’une tâche s’est terminée ou échoue.
background_agents_clear_completed_task Supprimez une tâche du terminal et libérez sa session enfant.

Une séquence parent-agent classique est la suivante :

  1. Démarrez chaque tâche indépendante avant d’attendre, de sorte que les tâches s’exécutent simultanément.
  2. Attendez la première tâche terminée, récupérez-en le résultat et répétez jusqu’à ce qu’aucune tâche ne soit en cours d’exécution.
  3. Poursuivez une tâche terminée ou ayant échoué lorsque le travail de suivi a besoin de son contexte de conversation existant.
  4. Effacez les tâches terminales après avoir récupéré leurs résultats, sauf si elles seront poursuivies.

L’état de la tâche est running, completedou failedlost. Une tâche est considérée comme perdue lorsque son descripteur de tâche dans le processus ou sa session enfant n’est pas disponible, par exemple après un redémarrage du processus ou une restauration de session. Les métadonnées de tâche sérialisables peuvent rester dans la session parente, mais les handles de travail en cours et de session enfant ne survivent pas à cette limite.

Il n’existe aucun outil d’annulation dans le fournisseur. Laissez les tâches en cours d’exécution atteindre un état terminal avant de les effacer.

Réutilisez la même session parente à plusieurs tours. Chaque tâche reçoit une session enfant dédiée. Reprendre une tâche du terminal réutilise cette session enfant ; sa suppression supprime les métadonnées de la tâche et libère le descripteur de la session enfant.

Les résultats de la tâche sont renvoyés au parent sous forme de texte. Le fournisseur ne proxy pas la demande d’approbation d’outil structurée d’un enfant par le biais du parent. Configurez donc les agents enfants pour terminer le travail délégué sans approbation interactive ni gérer leurs approbations à l’intérieur de l’hôte de l’agent enfant.

Libérer une session parente à partir de l’hôte

Note

La version de session de l'agent en arrière-plan côté hôte n'est actuellement pas disponible dans .NET.

Lorsque l’hôte évince ou abandonne une session parent, libérez la tâche du fournisseur en cours de traitement et les descripteurs de session enfant dans un bloc finally :

session = parent_agent.create_session()
try:
    await parent_agent.run("Coordinate the research.", session=session)
finally:
    await background_provider.release_session(session)

release_session(session, *, cancel_running=True, timeout=30.0) est une API de cycle de vie côté hôte, et non un outil orienté modèle. Par défaut, elle annule les tâches enfants en cours d’exécution et attend jusqu’à 30 secondes que l’annulation prenne effet avant de libérer tout l’état d’exécution de la session parente. Définissez cancel_running=False pour rejeter la publication tant que des tâches sont en cours d’exécution, ou définissez timeout=None pour attendre indéfiniment.

En revanche, background_agents_clear_completed_task permet au modèle de supprimer une tâche de terminal et sa session enfant pendant une conversation. Il refuse les tâches en cours d’exécution et ne remplace pas la fermeture de la session parente côté hôte.

Note

La version de session de l’agent d’arrière-plan côté hôte n’est actuellement pas disponible en Go.

Ajouter manuellement l’attente automatique

Entourez l’élément parent composé manuellement avec LoopAgent. BackgroundTaskCompletionLoopEvaluator continue uniquement pendant qu’une tâche reste dans l’état Running :

AIAgent loopingParent = new LoopAgent(
    parentAgent,
    new BackgroundTaskCompletionLoopEvaluator(),
    new LoopAgentOptions { MaxIterations = 10 });

L’évaluateur s’arrête pour les tâches terminées, en échec et perdues.

Ajoutez AgentLoopMiddleware au parent standard et associez le prédicat de tâche d’arrière-plan à son assistant de message suivant :

from agent_framework import (
    Agent,
    AgentLoopMiddleware,
    background_tasks_running,
    background_tasks_running_message,
)

parent_agent = Agent(
    client=client,
    context_providers=[background_provider],
    middleware=[
        AgentLoopMiddleware(
            background_tasks_running(),
            next_message=background_tasks_running_message,
            max_iterations=10,
        )
    ],
)

Le prédicat reste vrai uniquement tant que l’état persistant de la tâche indique encore qu’une tâche est en cours d’exécution.

L’intégration automatique de boucles de tâche en arrière-plan n’est actuellement pas disponible dans Go.

Utiliser des agents en arrière-plan avec l’agent Harness

Utilisez cette configuration si vous souhaitez également bénéficier du pipeline par défaut de planification, de mémoire, d’approbation et d’observabilité de Harness Agent.

Définissez HarnessAgentOptions.BackgroundAgents. Ajoutez l’évaluateur d’achèvement lorsque le parent doit continuer à s’exécuter tant que le travail délégué n’est plus en cours d’exécution :

using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;

var options = new HarnessAgentOptions
{
    Name = "research-coordinator",
    BackgroundAgents = [webSearchAgent, codeAnalysisAgent],
    LoopEvaluators = [new BackgroundTaskCompletionLoopEvaluator()],
    LoopAgentOptions = new LoopAgentOptions { MaxIterations = 10 },
};

HarnessAgent parentAgent = chatClient.AsHarnessAgent(options);
// Equivalent construction: new HarnessAgent(chatClient, options)
AgentSession session = await parentAgent.CreateSessionAsync();

Utilisez HarnessAgentOptions.BackgroundAgentsProviderOptions pour personnaliser les instructions du fournisseur et la mise en forme de la liste des agents. Omettre LoopEvaluators permet de conserver la délégation en arrière-plan disponible sans nouvelle invocation automatique.

Fournir background_agents à create_harness_agent. Associez-la à une boucle délimitée lorsque le parent doit attendre automatiquement :

from agent_framework import (
    background_tasks_running,
    background_tasks_running_message,
    create_harness_agent,
)

parent_agent = create_harness_agent(
    client=client,
    name="research-coordinator",
    background_agents=[web_search_agent, code_analysis_agent],
    background_agents_wait_timeout_seconds=30,
    loop_should_continue=background_tasks_running(),
    loop_next_message=background_tasks_running_message,
    loop_max_iterations=10,
)
session = parent_agent.create_session()

Permet background_agents_instructions de remplacer les instructions du fournisseur. background_agents_wait_timeout_seconds configure la même attente limitée que wait_timeout_seconds sur BackgroundAgentsProvider. Le harnais Python active par défaut l’intergiciel d’approbation automatique des outils ; passez donc session à chaque exécution.

Note

La délégation en arrière-plan de l’agent Harness n’est pas disponible dans Go.

Considérations relatives à la sécurité

Inscrivez uniquement les agents enfants que vous approuvez. Le parent peut leur envoyer du texte dérivé d’un contexte privé ou non fiable, et leurs résultats sont réintégrés au contexte du parent. Un enfant compromis peut exfiltrer une entrée déléguée ou retourner du contenu d’injection d’invite indirecte.

Étapes suivantes

Approfondir la question