Habilidades e Capacidades
Domine design de habilidades, padroes de uso de ferramentas, chamada de funcoes e registro de capacidades para agentes de IA.
Habilidades e Capacidades
O Que Sao Habilidades de Agente?
Habilidades (skills) sao unidades reutilizaveis e composiveis de capacidade que ensinam um agente de IA a executar tarefas especificas. Diferente de prompts monoliticos, habilidades sao modulares, testaveis e podem ser compartilhadas entre diferentes agentes.
Uma habilidade nao e o mesmo que um plugin. Habilidades sao pacotes de instrucao; plugins (servidores MCP) sao processos externos que fornecem ferramentas.
Definicao do Manifesto
# skills/code-reviewer/skill.yaml
name: code-reviewer
version: "1.2.0"
description: |
Realiza revisoes de codigo focando em seguranca,
desempenho, manutencao e melhores praticas.
author: "NUniversity"
license: "MIT"
instructions:
- path: instructions/processo-revisao.md
- path: instructions/checklist-seguranca.md
tools:
required:
- read
- grep
- glob
optional:
- bash
- websearch
resources:
- path: resources/owasp-top10.yaml
description: Referencia OWASP Top 10
autoload:
enabled: true
matchPattern: "revisar|auditar|inspecionar|verificar codigo"
constraints:
maxTokens: 4096
temperature: 0.3
allowedTools:
- read
- grep
- globUse matchPattern para carregamento automatico. Quando o usuario diz "revisar modulo auth", a habilidade ativa automaticamente.
Instrucoes de Habilidade
class HabilidadeRevisaoCodigo:
def __init__(self, agente):
self.agente = agente
self.descobertas = []
async def executar(self, caminho_alvo):
codigo = await self.agente.ler(caminho_alvo)
problemas_seguranca = self._verificar_seguranca(codigo)
problemas_perf = self._verificar_desempenho(codigo)
problemas_qualidade = self._verificar_qualidade(codigo)
relatorio = self._gerar_relatorio(
caminho_alvo,
problemas_seguranca + problemas_perf + problemas_qualidade
)
return relatorio
def _verificar_seguranca(self, codigo):
problemas = []
if "execute(" in codigo or "eval(" in codigo:
problemas.append({
"severidade": "critico",
"tipo": "injecao_codigo",
"descricao": "Uso de funcoes perigosas"
})
if "SELECT" in codigo and "WHERE" not in codigo:
problemas.append({
"severidade": "critico",
"tipo": "sql_injection",
"descricao": "Query SQL sem parametrizacao"
})
return problemas
def _verificar_desempenho(self, codigo):
problemas = []
linhas = codigo.split("\n")
for i, linha in enumerate(linhas, 1):
if "for" in linha and i < len(linhas) and "for" in linhas[i]:
problemas.append({
"severidade": "grave",
"tipo": "loop_aninhado",
"linha": i
})
return problemas
def _verificar_qualidade(self, codigo):
problemas = []
if len(codigo.split("\n")) > 500:
problemas.append({
"severidade": "leve",
"tipo": "arquivo_longo",
"descricao": "Arquivo excede 500 linhas"
})
return problemas
def _gerar_relatorio(self, caminho, todos_problemas):
return {
"arquivo": caminho,
"total_problemas": len(todos_problemas),
"por_severidade": {
"critico": len([p for p in todos_problemas if p["severidade"] == "critico"]),
"grave": len([p for p in todos_problemas if p["severidade"] == "grave"]),
"leve": len([p for p in todos_problemas if p["severidade"] == "leve"])
},
"problemas": todos_problemas
}Padroes de Uso de Ferramentas
1. Invocacao Direta
{
"chamada_ferramenta": {
"nome": "read",
"argumentos": {"filePath": "src/config.py"}
}
}2. Chamadas Encadeadas
async def analise_encadeada(agente, diretorio):
arquivos = await agente.glob(f"{diretorio}/**/*.py")
resultados = []
for arquivo in arquivos[:5]:
conteudo = await agente.ler(arquivo)
correspondencias = await agente.grep("TODO|FIXME", path=arquivo)
resultados.append({
"arquivo": arquivo,
"linhas": len(conteudo.split("\n")),
"todos": len(correspondencias)
})
return resultados3. Execucao Paralela
import asyncio
async def analise_paralela(agente, caminho):
tarefas = [
agente.grep("security|vulnerability", path=caminho),
agente.grep("TODO|FIXME", path=caminho),
agente.bash(f"wc -l {caminho}"),
agente.bash(f"ruff check {caminho}")
]
resultados = await asyncio.gather(*tarefas)
return {
"mencoes_seguranca": resultados[0],
"todos": resultados[1],
"linhas": resultados[2].strip(),
"erros_lint": resultados[3]
}Registro de Capacidades
class RegistroCapacidades:
def __init__(self):
self.capacidades = {}
def registrar(self, agente_id, capacidade):
if agente_id not in self.capacidades:
self.capacidades[agente_id] = []
self.capacidades[agente_id].append(capacidade)
def encontrar_agentes_com_capacidade(self, capacidade_necessaria):
correspondentes = []
for agente_id, caps in self.capacidades.items():
for cap in caps:
if cap.corresponde(capacidade_necessaria):
correspondentes.append((agente_id, cap))
return correspondentes
class Capacidade:
def __init__(self, nome, descricao, schema_entrada, schema_saida):
self.nome = nome
self.descricao = descricao
self.schema_entrada = schema_entrada
self.schema_saida = schema_saida
def corresponde(self, consulta):
palavras = consulta.lower().split()
desc = self.descricao.lower().split()
nome = self.nome.lower().split()
todas = set(desc + nome)
return any(p in todas for p in palavras)
def to_dict(self):
return {
"nome": self.nome,
"descricao": self.descricao,
"schema_entrada": self.schema_entrada,
"schema_saida": self.schema_saida
}
registro = RegistroCapacidades()
registro.registrar("agente-codigo", Capacidade(
nome="revisao_codigo",
descricao="Revisar codigo fonte para bugs e vulnerabilidades",
schema_entrada={"caminho": "string"},
schema_saida={"problemas": "array", "pontuacao": "number"}
))
registro.registrar("agente-devops", Capacidade(
nome="deploy",
descricao="Fazer deploy de aplicacoes em ambientes",
schema_entrada={"ambiente": "string", "versao": "string"},
schema_saida={"status": "string", "url": "string"}
))
correspondencias = registro.encontrar_agentes_com_capacidade("revisar codigo")
print(f"Agentes que podem revisar: {[c[0] for c in correspondencias]}")Pratica
Quais sao os quatro componentes principais de um pacote de habilidade?
Como funciona o carregamento automatico de habilidades no OpenCode?
Qual a diferenca entre uma habilidade e um plugin (servidor MCP)?
- Habilidades sao pacotes modulares com manifesto, instrucoes, ferramentas e recursos
- Auto-load com matchPattern permite ativacao sensivel ao contexto
- Padroes de uso incluem invocacao direta, encadeada, condicional e paralela
- Registros de capacidade permitem descoberta dinâmica de agentes
- Habilidades devem ser testadas independentemente com agentes mock
- Versionamento semantico permite gerenciamento de dependencias
Fluxo de Trabalho Detalhado
Este diagrama ilustra o fluxo de trabalho basico do agente. Adapte-o ao seu caso de uso especifico.
Exemplos Adicionais de Codigo
# Exemplo adicional de implementacao
class ExemploAdicional:
"""Classe de exemplo para ilustrar conceitos adicionais."""
def __init__(self, nome):
self.nome = nome
self.dados = {}
def processar(self, entrada):
"""Processa a entrada e armazena o resultado."""
resultado = self._transformar(entrada)
self.dados[entrada] = resultado
return resultado
def _transformar(self, valor):
return valor * 2 if isinstance(valor, (int, float)) else valor.upper()
def obter_estatisticas(self):
"""Retorna estatisticas sobre os dados processados."""
if not self.dados:
return {"status": "vazio", "total": 0}
return {
"status": "processado",
"total": len(self.dados),
"ultimo": list(self.dados.keys())[-1]
}
exemplo = ExemploAdicional('teste')
print(exemplo.processar(21)) # 42
print(exemplo.obter_estatisticas()){
"configuracao_exemplo": {
"versao": "1.0",
"parametros": {
"timeout": 30,
"max_tentativas": 3,
"modo": "automatico"
},
"seguranca": {
"requer_aprovacao": true,
"nivel_autonomia": 2
}
}
}# configuracao-adicional.yaml
ambiente:
nome: producao
variaveis:
LOG_LEVEL: "debug"
MAX_TOKENS: 128000
agentes:
- nome: agente-principal
modelo: gpt-4o
temperatura: 0.3
- nome: agente-revisor
modelo: claude-sonnet-4-20250514
ferramentas_permitidas:
- read
- grep
- glob
ferramentas_negadas:
- write
- edit
- bash
monitoramento:
metrics: true
tracing: true
alertas:
- tipo: erro_critico
canal: slack
- tipo: timeout
canal: emailNotas Importantes
Este conceito e fundamental para o entendimento do modulo. Certifique-se de compreende-lo antes de prosseguir.
Preste atencao a este detalhe: configuracoes incorretas podem levar a comportamentos inesperados do agente.
Uma dica pratica: sempre valide suas configuracoes em ambiente de staging antes de promover para producao.
Ao dominar este conceito, voce estara apto a construir agentes mais robustos e confiaveis.
Tabela Comparativa
| Caracteristica | Abordagem A | Abordagem B | Abordagem C |
|---|---|---|---|
| Complexidade | Baixa | Media | Alta |
| Flexibilidade | Limitada | Moderada | Total |
| Manutencao | Facil | Media | Dificil |
| Performance | Otima | Boa | Variavel |
| Seguranca | Basica | Avancada | Maxima |
| Caso de uso | Prototipos | Producao | Sistemas criticos |
Escolha a abordagem com base nos requisitos especificos do seu projeto. Nao existe solucao unica para todos os casos.
Pergunta adicional 1 sobre o conteudo desta aula?
Pergunta adicional 2 sobre o conteudo desta aula?
Pergunta adicional 3 sobre o conteudo desta aula?
- Reforce seu entendimento praticando com exemplos reais
- Consulte a documentacao oficial para casos avancados
- Compartilhe seu conhecimento com a comunidade
- Sempre teste suas implementacoes em ambientes controlados
- Mantenha-se atualizado com as melhores praticas da industria
- A pratica consistente e a chave para a maestria
- Agentes de IA bem projetados combinam tecnologia com boas praticas de engenharia