Étape 6 : Agent Harness

Un framework englobe un client de chat avec l’infrastructure dont un agent a besoin pour mener à bien des tâches longues et en plusieurs étapes : modes de planification et d’exécution, liste de tâches servant de base à la planification, compression du contexte, mémoire des fichiers, accès aux fichiers et approbation des outils avec option « ne plus demander ». Au lieu d’assembler ces pièces vous-même, vous créez un agent de harnais et vous les faites sortir de la boîte.

Créez un agent de harnais à partir de tout IChatClient grâce à la méthode d’extension AsHarnessAgent. Étant donné qu’un harness fonctionne de manière interactive sur de nombreuses étapes, on le pilote généralement via une boucle de conversation : conservez une AgentSession afin que l’état du harness (plan, tâches à faire et historique) soit conservé d’un tour à l’autre, lisez l’instruction suivante de l’utilisateur et diffusez la sortie de l’agent au fil de sa production.

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

// chatClient is any IChatClient implementation (Foundry, Azure OpenAI, OpenAI, Anthropic, ...).
AIAgent agent = chatClient.AsHarnessAgent();

// A session carries the harness state (plan, todos, history) across turns.
AgentSession session = await agent.CreateSessionAsync();

Console.WriteLine("Harness agent ready. Type 'exit' to quit.");
while (true)
{
    Console.Write("> ");
    string? input = Console.ReadLine();
    if (string.IsNullOrWhiteSpace(input) || input.Equals("exit", StringComparison.OrdinalIgnoreCase))
    {
        break;
    }

    // Stream this turn's output as the harness plans and works through the request.
    await foreach (var update in agent.RunStreamingAsync(input, session))
    {
        Console.Write(update);
    }

    Console.WriteLine();
}

Le harnais gère la planification, le suivi et la persistance de l’historique pour vous dans toute la conversation. Pour une console riche en fonctionnalités — avec des invites de confirmation pour les outils, l’affichage des tâches et des modes, ainsi que des commandes slash — consultez l’exemple d’interface de terminal.

Tip

Consultez les exemples de framework de test .NET pour accéder à des applications complètes exécutables.

L’exemple complet crée un client de conversation Microsoft Foundry, l’encapsule avec create_harness_agent et réutilise une même session sur deux tours de conversation. Le framework ajoute la planification, le suivi to-do et le compactage tandis que l’exemple désactive la mémoire de fichier et la recherche web pour rester concentré.

import asyncio

from agent_framework import create_harness_agent
from agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential


async def main() -> None:
    agent = create_harness_agent(
        client=FoundryChatClient(
            project_endpoint="https://your-account.services.ai.azure.com/api/projects/your-project",
            model="gpt-6-luna",
            credential=AzureCliCredential(),
        ),
        agent_instructions="Help users plan and complete multi-step tasks.",
        disable_file_memory=True,
        disable_web_search=True,
    )
    session = agent.create_session()

    print(await agent.run("Plan a weekend trip to Seattle.", session=session))
    print(await agent.run("Turn that plan into a checklist.", session=session))


if __name__ == "__main__":
    asyncio.run(main())

La session partagée conserve l’état du harness entre les deux appels. Pour une console complète - avec des invites d’approbation d’outils, to-do et l’affichage des modes, et des commandes de barre oblique - consultez l’exemple d’expérience utilisateur du terminal.

Tip

Consultez l’exemple complet pour bien démarrer. Pour plus de modèles, consultez les exemples de harnais Python.

Tip

La agent-framework-builder-python compétence de l’agent de codage peut guider la composition du harnais et les choix de package. Il est distinct des compétences de l’agent d’exécution, qui restent une fonctionnalité du harness Python activée sur adhésion.

Prerequisites

  • Go 1.26 ou version ultérieure.
  • Une copie locale du dépôt Agent Framework Go.
  • Un point de terminaison de projet Foundry et un déploiement de modèle, configurés via FOUNDRY_PROJECT_ENDPOINT et FOUNDRY_MODEL.
  • Des informations d’identification Azure prises en charge par DefaultAzureCredential, telles qu’une connexion Azure CLI avec az login.

Configurer le harness Go

Le package agent/harness configure un agent ordinaire adossé à un fournisseur. Passez le résultat de harness.AgentConfig au constructeur du fournisseur :

import (
    "context"
    "fmt"
    "os"
    "path/filepath"

    "github.com/microsoft/agent-framework-go/agent"
    "github.com/microsoft/agent-framework-go/agent/harness"
    "github.com/microsoft/agent-framework-go/examples/internal/demo"
    "github.com/microsoft/agent-framework-go/message"
    "github.com/microsoft/agent-framework-go/provider/foundryprovider"
)
    workingDirectory, err := os.Getwd()
    if err != nil {
        return fmt.Errorf("get working directory: %w", err)
    }
    cfg, err := harness.AgentConfig(harness.Config{WorkingDirectory: workingDirectory}, agent.Config{
        Name:        "HarnessAssistant",
        Middlewares: []agent.Middleware{logger},
    })
    if err != nil {
        return err
    }
    a := foundryprovider.NewAgent(
        demo.FoundryProjectEndpoint,
        demo.FoundryTokenCredential(),
        foundryprovider.ModelDeployment(demo.FoundryModel),
        foundryprovider.AgentConfig{
            Config:             cfg,
            DisableStoreOutput: true,
            Instructions:       "Help with software engineering tasks. Use memory and todos to track the current session's work.",
        },
    )

Les valeurs par défaut incluent todos, modes plan et exécution, mémoire de fichier isolée par session, compétences, recherche web hébergée, intergiciel d’approbation d’outils et instrumentation OpenTelemetry. L’assistant permet également la persistance de l’historique des appels par service et l’injection de messages.

Cet exemple Foundry définit DisableStoreOutput: true afin que l’historique local soit propriétaire de la conversation. Définissez-le DisableWebSearch dans harness.Config si votre fournisseur ou déploiement sélectionné ne prend pas en charge la recherche web hébergée.

Exécutez l’exemple complet à partir de la racine du référentiel Go :

go run .\examples\02-agents\harness\step04_composite_harness

L’exemple réutilise une session sur deux tours, gère les demandes d’approbation des outils et ouvre une session distincte pour illustrer l’isolation de la mémoire. La mémoire du fichier est conservée sous agent-file-memory dans le répertoire de travail.

Le compactage et le bouclage sont activés sur demande plutôt qu’activés par défaut dans le harnais Go. Pour connaître les limites de configuration et des composants, consultez Agent Harness.

Étapes suivantes

Aller plus loin :