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.
As Habilidades do Agente são pacotes portáteis de instruções, scripts e recursos que fornecem aos agentes recursos especializados e experiência de domínio. As habilidades seguem uma especificação aberta e implementam um padrão de divulgação progressiva para que os agentes carreguem apenas o contexto necessário, quando precisarem.
Use as habilidades do agente quando quiser:
- Empacotar expertise em domínio – Capturar conhecimento especializado (políticas de despesas, fluxos de trabalho legais, pipelines de análise de dados) como pacotes reutilizáveis e portáteis.
- Estender as funcionalidades do agente – dê aos agentes novas habilidades sem alterar suas instruções principais.
- Garantir a consistência – transforme tarefas de várias etapas em fluxos de trabalho repetíveis e auditáveis.
- Habilitar a interoperabilidade — reutilize a mesma habilidade em diferentes produtos compatíveis com habilidades do agente.
Estrutura de habilidades
Uma habilidade é um diretório que contém um SKILL.md arquivo com subdiretórios opcionais para recursos:
expense-report/
├── SKILL.md # Required — frontmatter + instructions
├── scripts/
│ └── validate.py # Executable code agents can run
├── references/
│ └── POLICY_FAQ.md # Reference documents loaded on demand
└── assets/
└── expense-report-template.md # Templates and static resources
formato SKILL.md
O SKILL.md arquivo deve conter o frontmatter YAML seguido pelo conteúdo de markdown:
---
name: expense-report
description: File and validate employee expense reports according to company policy. Use when asked about expense submissions, reimbursement rules, or spending limits.
license: Apache-2.0
compatibility: Requires python3
metadata:
author: contoso-finance
version: "2.1"
---
| Campo | Obrigatório | DESCRIÇÃO |
|---|---|---|
name |
Yes | Máximo de 64 caracteres. Letras minúsculas, números e hifens somente. Não deve iniciar ou terminar com um hífen ou conter hifens consecutivos. Deve corresponder ao nome do diretório pai. |
description |
Yes | O que a habilidade faz e quando usá-la. Máximo de 1024 caracteres. Deve incluir palavras-chave que ajudam os agentes a identificar tarefas relevantes. |
license |
Não | Nome da licença ou referência a um arquivo de licença empacotado. |
compatibility |
Não | Máximo de 500 caracteres. Indica os requisitos de ambiente (produto pretendido, pacotes do sistema, acesso à rede etc.). |
metadata |
Não | Mapeamento arbitrário de chave-valor para metadados adicionais. |
allowed-tools |
Não | Lista delimitada por espaço de ferramentas pré-aprovadas que a habilidade pode usar. Experimental – o suporte pode variar entre implementações de agente. |
O corpo em linguagem de marcação (markdown) após o frontmatter contém instruções sobre como usar a habilidade – orientação passo a passo, exemplos de entradas e saídas, casos extremos comuns ou qualquer conteúdo que ajude o agente a executar a tarefa. Mantenha SKILL.md com menos de 500 linhas e transfira o material detalhado de referência para arquivos separados.
Divulgação progressiva
As Habilidades do Agente usam um padrão de divulgação progressiva de três estágios para minimizar o uso de contexto:
- Anuncie (aproximadamente 100 tokens por habilidade) — nomes de habilidade e descrições são injetados no prompt do sistema no início de cada execução, para que o agente saiba quais habilidades estão disponíveis.
-
Carregar (< 5000 tokens recomendados) — Quando uma tarefa corresponde ao domínio de uma habilidade, o agente chama a ferramenta
load_skillpara recuperar o conteúdo completo do documento SKILL.md com instruções detalhadas. -
Ler recursos (conforme necessário) — O agente chama a
read_skill_resourceferramenta para buscar arquivos suplementares (referências, modelos, ativos) somente quando necessário.
Esse padrão mantém a janela de contexto do agente enxuta, dando-lhe acesso ao conhecimento profundo do domínio sob demanda.
Fornecendo habilidades a um agente
A Estrutura do Agente inclui um provedor de habilidades que descobre habilidades de diretórios de sistema de arquivos e as disponibiliza aos agentes como um provedor de contexto. Ele pesquisa caminhos configurados recursivamente (até dois níveis de profundidade) para SKILL.md arquivos, valida seu formato e recursos e expõe ferramentas para o agente: load_skill, read_skill_resourcee (quando os scripts estão presentes) run_skill_script.
Observação
A execução de script ainda não tem suporte em C# e será adicionada em uma versão futura.
Configuração básica
Crie um FileAgentSkillsProvider apontando para um diretório que contenha suas habilidades e adicione-o aos provedores de contexto do agente.
using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.Agents.AI;
// Discover skills from the 'skills' directory
var skillsProvider = new FileAgentSkillsProvider(
skillPath: Path.Combine(AppContext.BaseDirectory, "skills"));
// Create an agent with the skills provider
AIAgent agent = new AzureOpenAIClient(
new Uri(endpoint), new DefaultAzureCredential())
.GetResponsesClient(deploymentName)
.AsAIAgent(new ChatClientAgentOptions
{
Name = "SkillsAgent",
ChatOptions = new()
{
Instructions = "You are a helpful assistant.",
},
AIContextProviders = [skillsProvider],
});
Invocando o agente
Depois de configurado, o agente descobre automaticamente as habilidades disponíveis e as usa quando uma tarefa corresponde:
// The agent loads the expense-report skill and reads the FAQ resource
AgentResponse response = await agent.RunAsync(
"Are tips reimbursable? I left a 25% tip on a taxi ride.");
Console.WriteLine(response.Text);
Configuração básica
Crie um SkillsProvider apontando para um diretório que contenha suas habilidades e adicione-o aos provedores de contexto do agente.
from pathlib import Path
from agent_framework import SkillsProvider
from agent_framework.azure import AzureOpenAIChatClient
from azure.identity.aio import AzureCliCredential
# Discover skills from the 'skills' directory
skills_provider = SkillsProvider(
skill_paths=Path(__file__).parent / "skills"
)
# Create an agent with the skills provider
agent = AzureOpenAIChatClient(credential=AzureCliCredential()).as_agent(
name="SkillsAgent",
instructions="You are a helpful assistant.",
context_providers=[skills_provider],
)
Invocando o agente
Depois de configurado, o agente descobre automaticamente as habilidades disponíveis e as usa quando uma tarefa corresponde:
# The agent loads the expense-report skill and reads the FAQ resource
response = await agent.run(
"Are tips reimbursable? I left a 25% tip on a taxi ride."
)
print(response.text)
Vários diretórios de habilidades
Você pode pesquisar vários diretórios passando uma lista de caminhos:
var skillsProvider = new FileAgentSkillsProvider(
skillPaths: [
Path.Combine(AppContext.BaseDirectory, "company-skills"),
Path.Combine(AppContext.BaseDirectory, "team-skills"),
]);
skills_provider = SkillsProvider(
skill_paths=[
Path(__file__).parent / "company-skills",
Path(__file__).parent / "team-skills",
]
)
Cada caminho pode apontar para uma pasta de habilidade individual (contendo um SKILL.md) ou uma pasta pai com subdiretórios de habilidades. O provedor pesquisa em até dois níveis de profundidade.
Prompt personalizado do sistema
Por padrão, o provedor de habilidades injeta um prompt do sistema que lista as habilidades disponíveis e instrui o agente a usar load_skill e read_skill_resource. Você pode personalizar este prompt:
var skillsProvider = new FileAgentSkillsProvider(
skillPath: Path.Combine(AppContext.BaseDirectory, "skills"),
options: new FileAgentSkillsProviderOptions
{
SkillsInstructionPrompt = """
You have skills available. Here they are:
{0}
Use the `load_skill` function to get skill instructions.
Use the `read_skill_resource` function to read skill files.
"""
});
Observação
O modelo personalizado deve conter um {0} espaço reservado no qual a lista de habilidades é inserida. Chaves literais devem ser escapadas como {{ e }}.
skills_provider = SkillsProvider(
skill_paths=Path(__file__).parent / "skills",
instruction_template=(
"You have skills available. Here they are:\n{skills}\n"
"Use the `load_skill` function to get skill instructions.\n"
"Use the `read_skill_resource` function to read skill files."
),
)
Observação
O modelo personalizado deve conter um {skills} espaço reservado onde a lista de habilidades é inserida e um {runner_instructions} espaço reservado em que as instruções relacionadas ao script são inseridas.
Habilidades definidas por código
Além das habilidades baseadas em arquivo descobertas de arquivos SKILL.md, você pode definir habilidades inteiramente em código Python. As habilidades definidas por código são úteis quando:
- O conteúdo da habilidade é gerado dinamicamente (por exemplo, leitura de um banco de dados ou ambiente).
- Você deseja manter definições de habilidade junto com o código do aplicativo que as usa.
- Você precisa de recursos que executem a lógica em tempo de leitura em vez de servir arquivos estáticos.
Habilidade básica de código
Crie uma Skill instância com um nome, uma descrição e um conteúdo de instrução. Opcionalmente, anexe SkillResource instâncias com conteúdo estático:
from textwrap import dedent
from agent_framework import Skill, SkillResource, SkillsProvider
code_style_skill = Skill(
name="code-style",
description="Coding style guidelines and conventions for the team",
content=dedent("""\
Use this skill when answering questions about coding style,
conventions, or best practices for the team.
"""),
resources=[
SkillResource(
name="style-guide",
content=dedent("""\
# Team Coding Style Guide
- Use 4-space indentation (no tabs)
- Maximum line length: 120 characters
- Use type annotations on all public functions
"""),
),
],
)
skills_provider = SkillsProvider(skills=[code_style_skill])
Recursos dinâmicos
Use o @skill.resource decorador para registrar uma função como um recurso. A função é chamada cada vez que o agente lê o recurso, para que possa retornar dados atualizados. Há suporte para funções de sincronização e assíncronas:
import os
from agent_framework import Skill
project_info_skill = Skill(
name="project-info",
description="Project status and configuration information",
content="Use this skill for questions about the current project.",
)
@project_info_skill.resource
def environment() -> Any:
"""Get current environment configuration."""
env = os.environ.get("APP_ENV", "development")
region = os.environ.get("APP_REGION", "us-east-1")
return f"Environment: {env}, Region: {region}"
@project_info_skill.resource(name="team-roster", description="Current team members")
def get_team_roster() -> Any:
"""Return the team roster."""
return "Alice Chen (Tech Lead), Bob Smith (Backend Engineer)"
Quando o decorador é usado sem argumentos (@skill.resource), o nome da função se torna o nome do recurso e o docstring se torna a descrição. Use @skill.resource(name="...", description="...") para defini-los explicitamente.
Scripts definidos por código
Use o @skill.script decorador para registrar uma função como um script executável em uma habilidade. Scripts definidos por código são executados em processo e não exigem um executor de script. Há suporte para funções de sincronização e assíncronas:
from agent_framework import Skill
unit_converter_skill = Skill(
name="unit-converter",
description="Convert between common units using a conversion factor",
content="Use the convert script to perform unit conversions.",
)
@unit_converter_skill.script(name="convert", description="Convert a value: result = value × factor")
def convert_units(value: float, factor: float) -> str:
"""Convert a value using a multiplication factor."""
import json
result = round(value * factor, 4)
return json.dumps({"value": value, "factor": factor, "result": result})
Quando o decorador é usado sem argumentos (@skill.script), o nome da função se torna o nome do script e o docstring se torna a descrição. Os parâmetros tipados da função são convertidos automaticamente num esquema JSON que o agente usa para passar argumentos.
Combinando habilidades baseadas em arquivo e definidas por código
Passe ambos skill_paths e skills para um único SkillsProvider. As habilidades baseadas em arquivo são descobertas primeiro; se uma habilidade definida por código tiver o mesmo nome de uma habilidade baseada em arquivo existente, a habilidade definida por código será ignorada:
from pathlib import Path
from agent_framework import Skill, SkillsProvider
my_skill = Skill(
name="my-code-skill",
description="A code-defined skill",
content="Instructions for the skill.",
)
skills_provider = SkillsProvider(
skill_paths=Path(__file__).parent / "skills",
skills=[my_skill],
)
Execução do script
As habilidades podem incluir scripts executáveis executados pelo agente por meio da run_skill_script ferramenta. Como um script é executado depende de como ele foi definido:
-
Scripts definidos por código (registrados por
@skill.script) são executados em processo como chamadas de função direta. Nenhum corredor é necessário. -
Scripts baseados em arquivo (
.pyarquivos descobertos em diretórios de habilidades) exigem qualquer entidadeSkillScriptRunnercallable que determine como o script é executado (por exemplo, como um subprocesso local).
Execução de script baseado em arquivo
Para habilitar a execução de scripts baseados em arquivo, passe um script_runner para SkillsProvider. Qualquer sincronização ou chamada assíncrona que atenda ao SkillScriptRunner protocolo pode ser usada:
from pathlib import Path
from agent_framework import Skill, SkillScript, SkillsProvider
def my_runner(skill: Skill, script: SkillScript, args: dict | None = None) -> str:
"""Run a file-based script as a subprocess."""
import subprocess, sys
cmd = [sys.executable, str(Path(skill.path) / script.path)]
if args:
for key, value in args.items():
if value is not None:
cmd.extend([f"--{key}", str(value)])
result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
return result.stdout.strip()
skills_provider = SkillsProvider(
skill_paths=Path(__file__).parent / "skills",
script_runner=my_runner,
)
O corredor recebe o resolvido Skill, SkillScript, e um dicionário opcional args. Scripts baseados em arquivo são automaticamente descobertos a partir de arquivos .py em diretórios de skills.
Aviso
O executor acima é fornecido somente para fins de demonstração. Para uso em produção, considere adicionar:
- Sandboxing (por exemplo, contêineres
seccompoufirejail) - Limites de recursos (CPU, memória, tempo limite do relógio de parede)
- Validação de entrada e lista de permissões de scripts executáveis
- Registros e trilhas de auditoria estruturadas
Observação
Se as habilidades baseadas em arquivos com scripts forem fornecidas, mas não estiver script_runner definido, SkillsProvider gerará um ValueError.
Aprovação de script
Use require_script_approval=True no SkillsProvider para condicionar toda a execução de script à aprovação humana. Em vez de executar imediatamente, o agente pausa e retorna solicitações de aprovação:
from agent_framework import Agent, Skill, SkillsProvider
# Create provider with approval enabled
skills_provider = SkillsProvider(
skills=[my_skill],
require_script_approval=True,
)
# Run the agent — script calls pause for approval
result = await agent.run("Deploy version 2.5.0 to production", session=session)
# Handle approval requests
while result.user_input_requests:
for request in result.user_input_requests:
print(f"Script: {request.function_call.name}")
print(f"Args: {request.function_call.arguments}")
approval = request.to_function_approval_response(approved=True)
result = await agent.run(approval, session=session)
Quando um script é rejeitado (approved=False), o agente é informado de que o usuário recusou e pode responder adequadamente.
Melhores práticas de segurança
As habilidades do agente devem ser tratadas como qualquer código de terceiros que você colocar em seu projeto. Como as instruções de habilidade são injetadas no contexto do agente – e as habilidades podem incluir scripts – aplicar o mesmo nível de revisão e governança que você faria a uma dependência de software livre é essencial.
-
Revisão antes do uso – leia todo o conteúdo de habilidade (
SKILL.md, scripts e recursos) antes da implantação. Verifique se o comportamento real de um script corresponde à sua intenção declarada. Verifique se há instruções adversárias que tentam ignorar diretrizes de segurança, exfiltrar dados ou modificar arquivos de configuração do agente. - Confiança de origem – instale apenas habilidades de autores confiáveis ou colaboradores internos examinados. Prefira habilidades com procedência clara, controle de versão e manutenção ativa. Fique atento aos nomes de funcionalidades com erros de digitação que imitam pacotes populares.
- Sandboxing – Executar habilidades que incluem scripts executáveis em ambientes isolados. Limite o sistema de arquivos, a rede e o acesso no nível do sistema apenas ao que a habilidade exige. Exigir confirmação explícita do usuário antes de executar operações potencialmente confidenciais.
- Auditoria e registro de logs – registre quais funcionalidades são carregadas, quais recursos são lidos e quais scripts são executados. Isso oferece uma trilha de auditoria para rastrear o comportamento do agente de volta ao conteúdo de habilidade específico se algo der errado.
Quando usar habilidades versus fluxos de trabalho
As habilidades do agente e os fluxos de trabalho do Agent Framework estendem o que os agentes podem fazer, mas funcionam de maneiras fundamentalmente diferentes. Escolha a abordagem que melhor corresponda aos seus requisitos:
- Controle – Com uma habilidade, a IA decide como executar as instruções. Isso é ideal quando você deseja que o agente seja criativo ou adaptável. Com um fluxo de trabalho, você define explicitamente o caminho de execução. Use fluxos de trabalho quando precisar de um comportamento determinístico e previsível.
- Resiliência – uma habilidade ocorre em uma única rodada de agente. Se algo falhar, toda a operação deverá ser repetida. Os fluxos de trabalho dão suporte ao ponto de verificação, para que possam ser retomados da última etapa bem-sucedida após uma falha. Escolha fluxos de trabalho quando o custo de executar novamente todo o processo for alto.
- Efeitos colaterais – as habilidades são adequadas quando as operações são idempotentes ou de baixo risco. Prefira fluxos de trabalho quando as etapas produzem efeitos colaterais (enviar emails, cobrar pagamentos) que não devem ser repetidos na repetição.
- Complexidade – as habilidades são melhores para tarefas de domínio único e focadas que um agente pode lidar. Os fluxos de trabalho são mais adequados para processos de negócios de várias etapas que coordenam vários agentes, aprovações humanas ou integrações externas do sistema.
Tip
Como regra geral: se você quiser que a IA descubra como realizar uma tarefa, use uma habilidade. Se você precisar garantir quais etapas são executadas e em que ordem, use um fluxo de trabalho.