Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Um arcabouço de agente, às vezes chamado de arcabouço de IA, é o arcabouço de execução que transforma um modelo de linguagem em um agente capaz de realizar tarefas. Ele coordena o modelo e as chamadas a ferramentas, gerencia o estado e o contexto da conversa, aplica políticas de aprovação e pode manter o agente avançando ao longo de uma tarefa de várias etapas.
O Agent Framework fornece uma estrutura dogmática incluída em baterias para pesquisa, codificação, análise de dados e outros trabalhos de longa execução. Você fornece um cliente de chat e personaliza apenas os recursos de que seu aplicativo precisa.
Architecture
O Harness compõe os blocos de construção existentes do Agent Framework em vez de definir um runtime de agente separado:
- Cliente de chat – conecta o agente a um modelo.
- Pipeline de chat – adiciona invocação de função, injeção de mensagem, persistência de histórico de chamadas por serviço e compactação opcional.
- Provedores de agente e contexto – adicione instruções, ferramentas, memória, estado todo, modos operacionais e recursos opcionais no escopo da sessão.
- Middleware e decoradores – adicione tratamento de aprovação, observabilidade e loops limitados opcionais.
- UX do aplicativo — transmite respostas, exibe progresso e coleta entradas, como aprovações de ferramentas.
O objeto resultante continua sendo um agente normal do Agent Framework: um HarnessAgent que deriva de AIAgent em .NET, um Agent retornado por create_harness_agent em Python ou um *agent.Agent com suporte de provedor configurado com harness.AgentConfig em Go. Suas sessões usam as mesmas abstrações de sessão e de provedor de contexto usadas por outros agentes.
Matriz de funcionalidade do Harness
| Capability | Comportamento do harness | Diretrizes canônicas |
|---|---|---|
| Invocação de função | Habilitado com um limite de iteração configurável por solicitação. Os construtores de provedor Go controlam o loop de invocação de ferramentas. | Ferramentas de função |
| Persistência do histórico de chamadas por serviço | Mantém o histórico de forma persistente após cada chamada ao modelo em uma execução com chamada de ferramentas. | Sessões |
| Compactação | Habilitado quando os limites de token ou uma estratégia personalizada são fornecidos em .NET e Python. Go requer composição explícita do provedor. | Compactação |
| Rastreamento todo | Habilitado por padrão. | Planejamento e tarefas |
| Modos de agente | Os modos de plano e execução são habilitados por padrão. | Planejamento e tarefas |
| Memória do arquivo e acesso a arquivos | A memória do arquivo de sessão está habilitada por padrão; O acesso a arquivos compartilhados é opt-in. | Provedores de contexto |
| Aprovação da ferramenta | As aprovações permanentes e as regras de aprovação automática são habilitadas por padrão. | Aprovação da ferramenta |
| OpenTelemetry | A observabilidade do agente é habilitada por padrão. | Observabilidade |
| Pesquisa na Web | Adicionado por padrão em que o cliente de chat selecionado dá suporte a ele. | Pesquisa na Web |
| Habilidades do Agente | Habilitado por padrão em .NET e Go; opt-in por meio de um provedor ou caminhos em Python. | Habilidades do agente |
| Agentes em segundo plano | Delegação paralela opcional para agentes filho nomeados em .NET e Python. Nenhum provedor de agente de plano de fundo Go empacotado. | Agentes em segundo plano |
| Execução do shell | Composto do pacote de shell; a fábrica de Python pode conectá-la automaticamente. | Ferramentas do Shell |
| Loop | Reinvocação limitada opcional orientada por avaliadores ou predicados. | Looping de agente |
A delegação de agente em segundo plano é separada das respostas em segundo plano gerenciadas pelo provedor. Os agentes em segundo plano executam agentes secundários para tarefas delegadas; as respostas em segundo plano sondam ou retomam uma solicitação a um provedor usando um token de continuação.
Dica
Para obter diretrizes do agente de codificação que ajudem a criar um aplicativo agente em Python, instale agent-framework-builder-python.
Essa skill de agente de codificação externo é separada da capacidade Agent Skills de runtime listada na matriz.
Criar um agente de teste
O pacote Microsoft.Agents.AI.Harness expõe HarnessAgent no namespace Microsoft.Agents.AI. Crie um a partir de qualquer IChatClient com AsHarnessAgent, ou construa HarnessAgent diretamente:
using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;
AIAgent agent = chatClient.AsHarnessAgent();
AgentResponse response = await agent.RunAsync("Plan a weekend trip to Seattle.");
Console.WriteLine(response.Text);
Use HarnessAgentOptions para definir orientações operacionais no nível da estrutura, instruções específicas do agente e opções de recurso:
AIAgent agent = chatClient.AsHarnessAgent(new HarnessAgentOptions
{
Name = "research-agent",
HarnessInstructions = "Use tools deliberately and report verified results.",
ChatOptions = new ChatOptions
{
Instructions = "You are a research assistant focused on academic sources.",
},
MaxContextWindowTokens = 128_000,
MaxOutputTokens = 16_384,
});
HarnessAgent.DefaultInstructions fornece as orientações da estrutura padrão.
HarnessInstructions aparece antes ChatOptions.Instructions.
Personalizar a composição
Os recursos padrão têm opções específicas, incluindo DisableTodoProvider, DisableAgentModeProvider, DisableFileMemory, DisableAgentSkillsProvider, DisableWebSearch, DisableToolAutoApproval, DisableOpenTelemetry e DisableCompaction.
Adicionar provedores de contexto personalizados com AIContextProviders. Ative o acesso a arquivos com FileAccessStore, a delegação em segundo plano com BackgroundAgents e o loop com LoopEvaluators.
Criar um agente de teste
A fábrica create_harness_agent retorna um(a) Agent totalmente configurado(a):
from agent_framework import create_harness_agent
from agent_framework.openai import OpenAIChatClient
agent = create_harness_agent(
client=OpenAIChatClient(model="gpt-4o"),
)
session = agent.create_session()
response = await agent.run("Plan a weekend trip to Seattle.", session=session)
print(response.text)
Defina separadamente instruções no nível da estrutura e instruções específicas do agente:
agent = create_harness_agent(
client=client,
name="research-agent",
harness_instructions="Use tools deliberately and report verified results.",
agent_instructions="You are a research assistant focused on academic sources.",
max_context_window_tokens=128_000,
max_output_tokens=16_384,
)
DEFAULT_HARNESS_INSTRUCTIONS fornece as orientações da estrutura padrão.
harness_instructions aparece antes agent_instructions.
Personalizar a composição
Desative os padrões com opções como disable_todo, disable_mode, disable_file_memory, disable_web_search, disable_tool_auto_approval e disable_compaction.
Substitua provedores internos por todo_provider ou mode_provider, e adicione provedores com context_providers. As habilidades dependem de adesão por meio de skills_provider ou skills_paths; o acesso a arquivos, agentes em segundo plano, ferramentas de shell e execução em loop também dependem de adesão.
O acesso a arquivos usa o repositório fornecido como um workspace compartilhado por padrão. Para isolar arquivos pela ID da sessão ativa, habilite o acesso a arquivos com escopo de sessão:
from agent_framework import FileSystemAgentFileStore, create_harness_agent
file_store = FileSystemAgentFileStore("agent-files")
agent = create_harness_agent(
client=client,
file_access_store=file_store,
file_access_session_scoped=True,
)
Para o compartilhamento deliberado em sessões selecionadas, construa FileAccessProvider(store=file_store, scope="tenant-1") diretamente e adicione-o por meio de context_providers. O escopo é uma chave opaca que mapeia para uma pasta gerenciada pelo provedor, e não um caminho. O acesso com escopo falha ao ser fechado em vez de usar a raiz do repositório compartilhado quando nem uma ID de sessão ativa nem um escopo explícito estiverem disponíveis.
Use tool_name_prefix quando um agente tiver vários provedores de acesso a arquivos. O prefixo produz nomes como workspace_file_access_read e impede colisões de nome de ferramenta. Para provedores prefixados, use as fábricas de regras de aprovação específicas do provedor para que cada regra corresponda aos nomes gerados pelo provedor:
from agent_framework import FileAccessProvider, create_harness_agent
workspace = FileAccessProvider(
store=file_store,
tool_name_prefix="workspace",
)
agent = create_harness_agent(
client=client,
context_providers=[workspace],
auto_approval_rules=[workspace.get_read_only_tools_auto_approval_rule()],
)
get_all_tools_auto_approval_rule() cria a regra equivalente para as ferramentas de leitura e de gravação. Mantenha a aprovação de gravação habilitada, a menos que o limite de armazenamento e as entradas da ferramenta sejam confiáveis.
Quando o acesso a arquivos estiver habilitado, use file_access_grep para localizar números de linha baseados em 1, file_access_read_lines inspecionar um intervalo inclusivo e file_access_replace_lines editar linhas inteiras.
file_access_read_lines prefixa cada linha com seu número e uma guia; omita esse prefixo ao passar o texto da linha como expected_line. O texto esperado impede que um número de linha obsoleto ou incompatível edite a linha errada.
file_access_grep usa expressões regulares que não diferenciam maiúsculas de minúsculas, aceita padrões de até 256 caracteres e aplica um orçamento de 10 segundos a toda a pesquisa. Padrões inválidos ou longos e pesquisas que excedem o orçamento retornam um erro. Restringir o diretório ou o padrão antes de tentar novamente.
Important
file_access_grep retorna o texto da linha correspondente com seu terminador de linha. Uma implementação personalizada de AgentFileStore.search() deve retornar números de linha numerados a partir de 1 que se refiram às mesmas linhas que AgentFileStore.split_lines() no texto retornado por read().
Note
create_harness_agent foi lançado. Os agentes em segundo plano, o acesso a arquivos e a execução em loop permanecem experimentais, e as ferramentas de shell vêm do pacote de pré-lançamento agent-framework-tools.
O pacote Go agent/harness reúne middleware, provedores de contexto e padrões de histórico para um agente normal com suporte de provedor. Chame harness.AgentConfig(harness.Config{}, agent.Config{...}), manipule seu erro e passe a configuração retornada para o construtor do provedor. Ele não introduz um tipo de agente separado ou um loop de execução de ferramentas.
Criar um agente de teste
O exemplo de composição configura um agente de harness com suporte do Foundry:
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.",
},
)
Personalizar a composição
O assistente permite os seguintes valores padrão:
| Componente | Padrão do harness do Go |
|---|---|
| Planning | Ferramentas de tarefas baseadas em sessão e modos de planejamento/execução, começando no modo de planejamento |
| Memória do arquivo | Arquivos persistentes em agent-file-memory, com uma pasta de trabalho isolada por sessão |
| Habilidades | Descoberta com suporte de arquivo do diretório de trabalho, excluindo a subárvore de memória |
| Pesquisa na Web | Uma declaração de pesquisa na Web hospedada, a menos que o chamador já tenha fornecido uma |
| Approval | Middleware de aprovação prévia e aprovação automática para ferramentas que exigem aprovação |
| History | Histórico na memória com persistência por chamada de serviço |
| Injeção de mensagem | Um agent.MessageInjector por agente |
| Rastreamento | Instrumentação com suporte para chamadas de modelo, ferramentas e agentes |
Use harness.Config para desabilitar componentes ou substituir a configuração. Desabilite a pesquisa na Web hospedada quando o serviço ou implantação selecionado não der suporte a ela. Os scripts de habilidade baseados em arquivo exigem um executor de script explicitamente configurado.
O auxiliar retém ferramentas de chamador, middleware, provedores de contexto e um provedor de histórico explicitamente configurado. Com uma implantação de modelo do Foundry, use DisableStoreOutput: true quando o histórico local controla a conversa.
As ferramentas de compactação, loop e shell não são adicionadas pelo auxiliar do Go. Configure-os explicitamente quando necessário. O provedor de delegação de agente em segundo plano empacotado descrito nos outros SDKs não está disponível no Go.
Consulte Criar um agente de harness do Go para configuração e o guia de configuração do harness do Go para padrões e substituições.
Experiência do usuário de terminal de exemplo
O Harness não prescreve uma interface de aplicativo. O repositório inclui aplicativos de terminal de exemplo que transmitem a saída em tempo real, exibem tarefas pendentes e o modo atual, apresentam prompts de aprovação de ferramentas e fornecem comandos como /todos, /mode e /exit.
Important
Esses projetos de console são exemplos, não componentes de estrutura fornecidos. Use-os como exemplos executáveis ou como ponto de partida para sua própria experiência de terminal.
O ponto de entrada de exemplo do .NET é HarnessConsole.RunAgentAsync:
using Harness.Shared.Console;
await HarnessConsole.RunAgentAsync(
agent,
userPrompt: "Ask me anything to get started.");
Personalize o exemplo com observadores, formatadores de ferramenta, manipuladores de comandos e HarnessConsoleOptions. Veja os exemplos do .NET Harness.
O exemplo em Python usa o pacote console baseado em Textual, junto com os exemplos do Harness:
from console import run_agent_async
await run_agent_async(agent)
Personalize o exemplo com observadores, formatadores, comandos e componentes da interface do usuário. Veja os exemplos do Python Harness.
O repositório Go inclui um exemplo de harness composto com tratamento de aprovação e uma demonstração da CLI de chat interativa separada. A CLI de chat usa um agente simples. Ele não é equivalente ao console do C# ou do harness do Python.