Paso 6: Arnés del agente

Un harness envuelve un cliente de chat con la estructura que un agente necesita para llevar a cabo tareas largas de varios pasos: modos de planificación y ejecución, una lista de tareas pendientes sobre la que planificar, compactación de contexto, memoria de archivos, acceso a archivos y aprobación de herramientas sin necesidad de volver a preguntar. En lugar de montar esas piezas tú mismo, creas un agente de harness y las obtienes listas para usar.

Crea un agente de harness a partir de cualquier IChatClient con el método de extensión AsHarnessAgent. Dado que un harness administra las tareas de forma interactiva a lo largo de numerosos pasos, lo habitual es controlarlo mediante un bucle de conversación: mantener un AgentSession para que el estado del harness (plan, tareas pendientes e historial) se conserve entre turnos, leer la siguiente instrucción del usuario y transmitir la salida del agente a medida que se genera.

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();
}

El harness se encarga de la planificación, el seguimiento de las tareas pendientes y la persistencia del historial por ti a lo largo de toda la conversación. Para ver una consola con todas las funciones —con mensajes de solicitud de aprobación de herramientas, visualización de tareas pendientes y modos, y comandos con barra— consulta la experiencia de usuario de terminal de ejemplo.

Tip

Consulte los ejemplos de .NET para ver aplicaciones completas listas para ejecutar.

El ejemplo completo crea un cliente de chat de Microsoft Foundry, lo envuelve con create_harness_agent y reutiliza una misma sesión en dos turnos. El arnés añade planificación, seguimiento de tareas pendientes y compactación, mientras que el ejemplo desactiva la memoria de archivos y la búsqueda web para mantener el enfoque.

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 sesión compartida conserva el estado del harness en ambas llamadas. Para obtener una consola con todas las funciones —con mensajes de aprobación de herramientas, visualización de tareas pendientes y modos, y comandos de barra— consulta la experiencia de usuario de la terminal de ejemplo.

Tip

Consulte el ejemplo completo de primeros pasos. Para obtener más patrones, consulte los ejemplos del entorno de prueba de Python.

Tip

La aptitud de agente de codificación agent-framework-builder-python puede guiarle en la composición del armazón y en la elección de los paquetes. Es independiente de las aptitudes de agente en tiempo de ejecución, que siguen siendo una capacidad opcional del armazón de Python.

Prerequisites

  • Go 1.26 o posterior.
  • Una copia local del repositorio de Agent Framework Go.
  • Un punto de conexión de proyecto de Foundry y una implementación del modelo, configurada a través de FOUNDRY_PROJECT_ENDPOINT y FOUNDRY_MODEL.
  • Una credencial de Azure compatible con DefaultAzureCredential, como un inicio de sesión de CLI de Azure con az login.

Configurar el harness de Go

El paquete agent/harness configura un agente estándar respaldado por proveedor. Pase el resultado del harness.AgentConfig al constructor del proveedor:

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.",
        },
    )

Los valores predeterminados incluyen tareas pendientes, modos de planificación y ejecución, memoria de archivos con aislamiento por sesión, aptitudes, búsqueda web hospedada, middleware de aprobación de herramientas e instrumentación de OpenTelemetry. La utilidad auxiliar también habilita la persistencia del historial por llamada de servicio y la inserción de mensajes.

Este ejemplo de Foundry establece DisableStoreOutput: true para que el historial local sea el propietario de la conversación. Establece DisableWebSearch en harness.Config si el proveedor o la implementación seleccionados no admiten la búsqueda web hospedada.

Ejecute el ejemplo completo desde la raíz del repositorio de Go:

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

El ejemplo reutiliza una sesión en dos turnos, controla las solicitudes de aprobación de herramientas y abre una sesión independiente para demostrar el aislamiento de memoria. La memoria de archivos persiste en agent-file-memory en el directorio de trabajo.

La compactación y la iteración son opcionales, en lugar de ser valores predeterminados de la herramienta de ejecución de Go. Para conocer los límites de configuración y componentes, consulte Agent Harness.

Pasos siguientes

Vaya más profundamente: