Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
As Competências do Agente são pacotes portáteis de instruções, scripts e recursos que conferem aos agentes capacidades especializadas e conhecimento de domínio. As competências seguem uma especificação aberta e implementam um padrão progressivo de divulgação para que os agentes carreguem apenas o contexto de que precisam, quando precisam.
Use as Habilidades de Agente quando quiser:
- Especialização no domínio de pacotes — Capturar conhecimento especializado (políticas de despesas, fluxos de trabalho legais, pipelines de análise de dados) como pacotes reutilizáveis e portáteis.
- Estenda as capacidades dos agentes — Dê aos agentes novas capacidades sem alterar as suas instruções principais.
- Garanta consistência — Transforme tarefas em vários passos em fluxos de trabalho repetíveis e auditáveis.
- Permitir a interoperabilidade — Reutilizar a mesma competência em diferentes produtos compatíveis com Competências de Agente.
Estrutura de competências
Uma habilidade é um diretório que contém um SKILL.md ficheiro 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
SKILL.md formato
O SKILL.md ficheiro deve conter material inicial YAML seguido de conteúdo marcado:
---
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 | Description |
|---|---|---|
name |
Yes | No máximo 64 caracteres. Apenas letras minúsculas, números e hífens. Não deve começar nem terminar com um hífen, nem conter hífens consecutivos. Deve corresponder ao nome do diretório principal. |
description |
Yes | O que a habilidade faz e quando a usar. Máximo 1024 caracteres. Deve incluir palavras-chave que ajudem os agentes a identificar tarefas relevantes. |
license |
Não | Nome da licença ou referência a um ficheiro de licença agrupado. |
compatibility |
Não | No máximo 500 caracteres. Indica os requisitos do ambiente (produto pretendido, pacotes do sistema, acesso à rede, etc.). |
metadata |
Não | Mapeamento chave-valor arbitrário para metadados adicionais. |
allowed-tools |
Não | Lista delimitada por espaço de ferramentas pré-aprovadas que a competência pode usar. Experimental — o suporte pode variar entre implementações de agentes. |
O corpo de markdown após o frontmatter contém as instruções de habilidades — orientações passo a passo, exemplos de entradas e saídas, casos excecionais comuns ou qualquer conteúdo que ajude o agente a realizar a tarefa. Mantenha SKILL.md com menos de 500 linhas e transfira o material de referência detalhado para ficheiros separados.
Divulgação progressiva
As Competências do Agente utilizam um padrão progressivo de divulgação em três fases para minimizar o uso do contexto:
- Publicitar (~100 tokens por habilidade) — Nomes e descrições das habilidades são inseridos no prompt do sistema no início de cada jogada, para que o agente saiba que habilidades estão disponíveis.
-
Load (< 5000 tokens recomendados) — Quando uma tarefa está dentro do domínio de uma aptidão, o agente usa a ferramenta
load_skillpara recuperar o corpo completo do SKILL.md com instruções detalhadas. -
Leia recursos (conforme necessário) — O agente chama a
read_skill_resourceferramenta para obter ficheiros suplementares (referências, modelos, recursos) apenas quando necessário.
Este padrão mantém a janela de contexto do agente enxuta, ao mesmo tempo que lhe dá acesso a conhecimento profundo do domínio sob demanda.
Fornecer competências a um agente
O Agent Framework inclui um fornecedor de competências que descobre competências a partir de diretórios de sistemas de ficheiros e as disponibiliza aos agentes como fornecedor de contexto. Pesquisa caminhos configurados recursivamente (até dois níveis de profundidade) por SKILL.md ficheiros, valida o seu formato e recursos, e expõe ferramentas ao agente: load_skill, read_skill_resource, e (quando scripts estão presentes) run_skill_script.
Observação
A execução de scripts ainda não é suportada em C# e será adicionada numa versão futura.
Configuração básica
Crie um FileAgentSkillsProvider apontando para um diretório que contenha as suas competências 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],
});
Invocação do agente
Uma vez configurado, o agente descobre automaticamente as competências disponíveis e utiliza-as 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 as suas competências 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],
)
Invocação do agente
Uma vez configurado, o agente descobre automaticamente as competências disponíveis e utiliza-as 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)
Múltiplos diretórios de competências
Pode pesquisar em 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 individual de competências (contendo uma SKILL.md) ou para uma pasta pai com subdiretórios de competências. O prestador pesquisa até dois níveis de profundidade.
Indicação de sistema personalizada
Por defeito, o fornecedor de competências insere um prompt do sistema que lista as competências disponíveis e instrui o agente a usar load_skill e read_skill_resource. 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} marcador onde a lista de competências é inserida. Os parênteses literais devem ser escapados 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} marcador onde a lista de competências é inserida e um {runner_instructions} marcador onde são inseridas instruções relacionadas com o script.
Competências definidas por código
Para além das competências baseadas em ficheiros descobertas a partir de ficheiros SKILL.md, podes definir competências inteiramente em código Python. Competências definidas pelo código são úteis quando:
- O conteúdo de competências é gerado dinamicamente (por exemplo, leitura de uma base de dados ou ambiente).
- Deves manter as definições de competências juntamente com o código da aplicação que as utiliza.
- Precisas de recursos que executem lógica em tempo de leitura em vez de servirem ficheiros estáticos.
Competências básicas de programação
Crie uma Skill instância com um nome, descrição e conteúdo de instruções. 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 registar uma função como recurso. A função é chamada cada vez que o agente lê o recurso, para que possa devolver dados atualizados. São suportadas tanto funções de sincronização como 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 torna-se o nome do recurso e a docstring torna-se a descrição. Use @skill.resource(name="...", description="...") para os definir explicitamente.
Scripts definidos por código
Use o @skill.script decorador para registar uma função como um script executável numa capacidade. Scripts definidos por código correm em processo e não requerem um executor de script. São suportadas tanto funções de sincronização como 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 torna-se o nome do script e a docstring torna-se a descrição. Os parâmetros tipados da função são automaticamente convertidos num Esquema JSON que o agente usa para passar argumentos.
Combinação de competências baseadas em ficheiros e definidas por código
Passe ambos skill_paths e skills para um único SkillsProvider. As competências baseadas em ficheiros são descobertas primeiro; Se uma competência definida por código tiver o mesmo nome de uma competência baseada em ficheiros existente, a competência definida por código é 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 de scripts
As competências podem incluir scripts executáveis que o agente executa através da run_skill_script ferramenta. A forma como um script corre depende de como foi definido:
-
Scripts definidos por código (registados via
@skill.script) são executados no mesmo processo, como chamadas diretas de funções. Não é necessário corredor. -
Scripts baseados em ficheiros (
.pyficheiros descobertos em diretórios de competências) requerem umSkillScriptRunner— qualquer correspondência(skill, script, args) -> Anychamável — que determina como o script é executado (por exemplo, como um subprocesso local).
Execução de scripts baseados em ficheiros
Para permitir a execução de scripts baseados em ficheiros, passe a script_runner para SkillsProvider. Qualquer função síncrona ou assíncrona que satisfaça o protocolo SkillScriptRunner 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 executante recebe o Skill resolvido, SkillScript, e um dicionário opcional args. Os scripts baseados em ficheiros são automaticamente descobertos a partir de .py ficheiros em diretórios de competências.
Advertência
O corredor acima é fornecido apenas para fins de demonstração. Para uso em produção, considere adicionar:
- Sandboxing (por exemplo, contentores,
seccomp, oufirejail) - Limites de recursos (limites de CPU, limites de memória, tempo limite de execução)
- Validação de entrada e listagem de scripts executáveis
- Registos estruturados e trilhas de auditoria
Observação
Se forem fornecidas competências baseadas em ficheiros com scripts mas nenhuma script_runner estiver definida, SkillsProvider gera um ValueError.
Aprovação de script
Use require_script_approval=True em SkillsProvider para colocar toda execução de scripts atrás de aprovação humana. Em vez de executar imediatamente, o agente pausa e devolve os pedidos 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 utilizador recusou e pode responder em conformidade.
Práticas recomendadas de segurança
As Competências de Agente devem ser tratadas como qualquer código de terceiros que introduza no seu projeto. Como as instruções de competências são inseridas no contexto do agente — e as competências podem incluir scripts — aplicar o mesmo nível de revisão e governança que aplicaria a uma dependência de código aberto é essencial.
-
Revise antes de usar — Leia todo o conteúdo de competências (
SKILL.mdscripts e recursos) antes de implementar. Verifique se o comportamento real de um script corresponde à sua intenção declarada. Verifique instruções adversariais que tentem contornar as diretrizes de segurança, exfiltrar dados ou modificar ficheiros de configuração do agente. - Confiança na fonte — Só instale competências de autores de confiança ou colaboradores internos verificados. Prefiro competências com proveniência clara, controlo de versões e manutenção ativa. Fique atento a nomes de habilidades typosquatted que imitam pacotes populares.
- Sandboxing — Executar funcionalidades que incluam scripts executáveis em ambientes isolados. Limite o acesso ao sistema de ficheiros, rede e sistema apenas ao que a competência exige. Exija confirmação explícita do utilizador antes de executar operações potencialmente sensíveis.
- Auditoria e registo — Registar as competências carregadas, os recursos lidos e os scripts executados. Isto dá-te um registo de auditoria para rastrear o comportamento dos agentes até ao conteúdo específico de competências caso algo corra mal.
Quando usar competências vs. fluxos de trabalho
As Competências do Agente e os Fluxos de Trabalho do Framework do Agente estendem o que os agentes podem fazer, mas funcionam de formas fundamentalmente diferentes. Escolha a abordagem que melhor se adeque às suas necessidades:
- Controlo — Com uma habilidade, a IA decide como executar as instruções. Isto é ideal quando se quer que o agente seja criativo ou adaptativo. Com um fluxo de trabalho, defines explicitamente o caminho de execução. Use fluxos de trabalho quando precisar de comportamento determinístico e previsível.
- Resiliência — Uma habilidade é executada num único turno completo de um agente. Se algo falhar, toda a operação tem de ser tentada novamente. Os fluxos de trabalho suportam o armazenamento de pontos de verificação, para que possam retomar a partir do último passo bem-sucedido após uma falha. Escolha fluxos de trabalho quando o custo de reexecutar todo o processo for elevado.
- Efeitos secundários — As competências são adequadas quando as operações são idempotentes ou de baixo risco. Prefira fluxos de trabalho quando as etapas produzem efeitos secundários (envio de emails, cobrança de pagamentos) que não devam ser repetidos numa nova tentativa.
- Complexidade — As competências são melhores para tarefas focadas e de domínio único que um agente pode gerir. Os fluxos de trabalho são mais adequados para processos empresariais em múltiplas etapas que coordenam múltiplos agentes, aprovações humanas ou integrações de sistemas externos.
Sugestão
Como regra geral: se quiseres que a IA descubra como realizar uma tarefa, usa uma habilidade. Se precisares de garantir que passos são executados e em que ordem, usa um fluxo de trabalho.