Visión general
Una habilidad es un directorio con nombre que contiene un archivo SKILL.md: un documento Markdown que proporciona instrucciones a Copilot. Cuando se carga, el contenido de la habilidad se inyecta en el contexto de la sesión.
Las aptitudes le permiten:
- Empaquetar la experiencia de dominio en módulos reutilizables
- Uso compartido de comportamientos especializados entre proyectos
- Organizar las configuraciones complejas del agente
- Habilitación o deshabilitación de funcionalidades por sesión
Aptitudes de carga
Especifique directorios que contengan aptitudes al crear una sesión:
import { CopilotClient } from "@github/copilot-sdk";
const client = new CopilotClient();
const session = await client.createSession({
model: "gpt-4.1",
skillDirectories: [
"./skills/code-review",
"./skills/documentation",
],
onPermissionRequest: async () => ({ kind: "approve-once" }),
});
// Copilot now has access to skills in those directories
await session.sendAndWait({ prompt: "Review this code for security issues" });
from copilot import CopilotClient, PermissionDecisionApproveOnce
async def main():
client = CopilotClient()
await client.start()
session = await client.create_session(
on_permission_request=lambda req, inv: PermissionDecisionApproveOnce(),
model="gpt-4.1",
skill_directories=[
"./skills/code-review",
"./skills/documentation",
],
)
# Copilot now has access to skills in those directories
await session.send_and_wait("Review this code for security issues")
await client.stop()
package main
import (
"context"
"log"
copilot "github.com/github/copilot-sdk/go"
"github.com/github/copilot-sdk/go/rpc"
)
func main() {
ctx := context.Background()
client := copilot.NewClient(nil)
if err := client.Start(ctx); err != nil {
log.Fatal(err)
}
defer client.Stop()
session, err := client.CreateSession(ctx, &copilot.SessionConfig{
Model: "gpt-4.1",
SkillDirectories: []string{
"./skills/code-review",
"./skills/documentation",
},
OnPermissionRequest: func(req copilot.PermissionRequest, inv copilot.PermissionInvocation) (rpc.PermissionDecision, error) {
return &rpc.PermissionDecisionApproveOnce{}, nil
},
})
if err != nil {
log.Fatal(err)
}
// Copilot now has access to skills in those directories
_, err = session.SendAndWait(ctx, copilot.MessageOptions{
Prompt: "Review this code for security issues",
})
if err != nil {
log.Fatal(err)
}
}
using GitHub.Copilot;
using GitHub.Copilot.Rpc;
await using var client = new CopilotClient();
await using var session = await client.CreateSessionAsync(new SessionConfig
{
Model = "gpt-4.1",
SkillDirectories = new List<string>
{
"./skills/code-review",
"./skills/documentation",
},
OnPermissionRequest = (req, inv) =>
Task.FromResult(PermissionDecision.ApproveOnce()),
});
// Copilot now has access to skills in those directories
await session.SendAndWaitAsync(new MessageOptions
{
Prompt = "Review this code for security issues"
});
import com.github.copilot.sdk.CopilotClient;
import com.github.copilot.sdk.events.*;
import com.github.copilot.sdk.json.*;
import java.util.List;
try (var client = new CopilotClient()) {
client.start().get();
var session = client.createSession(
new SessionConfig()
.setModel("gpt-4.1")
.setSkillDirectories(List.of(
"./skills/code-review",
"./skills/documentation"
))
.setOnPermissionRequest(PermissionHandler.APPROVE_ALL)
).get();
// Copilot now has access to skills in those directories
session.sendAndWait(new MessageOptions()
.setPrompt("Review this code for security issues")
).get();
}
Deshabilitación de aptitudes
Deshabilite aptitudes específicas mientras mantiene a otros usuarios activos:
const session = await client.createSession({
skillDirectories: ["./skills"],
disabledSkills: ["experimental-feature", "deprecated-tool"],
});
from copilot.session import PermissionHandler
session = await client.create_session(
on_permission_request=PermissionHandler.approve_all,
skill_directories=["./skills"],
disabled_skills=["experimental-feature", "deprecated-tool"],
)
package main
import (
"context"
copilot "github.com/github/copilot-sdk/go"
"github.com/github/copilot-sdk/go/rpc"
)
func main() {
ctx := context.Background()
client := copilot.NewClient(nil)
session, _ := client.CreateSession(ctx, &copilot.SessionConfig{
SkillDirectories: []string{"./skills"},
DisabledSkills: []string{"experimental-feature", "deprecated-tool"},
OnPermissionRequest: func(req copilot.PermissionRequest, inv copilot.PermissionInvocation) (rpc.PermissionDecision, error) {
return &rpc.PermissionDecisionApproveOnce{}, nil
},
})
_ = session
}
session, _ := client.CreateSession(context.Background(), &copilot.SessionConfig{
SkillDirectories: []string{"./skills"},
DisabledSkills: []string{"experimental-feature", "deprecated-tool"},
})
using GitHub.Copilot;
using GitHub.Copilot.Rpc;
public static class SkillsExample
{
public static async Task Main()
{
await using var client = new CopilotClient();
var session = await client.CreateSessionAsync(new SessionConfig
{
SkillDirectories = new List<string> { "./skills" },
DisabledSkills = new List<string> { "experimental-feature", "deprecated-tool" },
OnPermissionRequest = (req, inv) =>
Task.FromResult(PermissionDecision.ApproveOnce()),
});
}
}
var session = await client.CreateSessionAsync(new SessionConfig
{
SkillDirectories = new List<string> { "./skills" },
DisabledSkills = new List<string> { "experimental-feature", "deprecated-tool" },
});
import com.github.copilot.sdk.json.*;
import java.util.List;
var session = client.createSession(
new SessionConfig()
.setSkillDirectories(List.of("./skills"))
.setDisabledSkills(List.of("experimental-feature", "deprecated-tool"))
.setOnPermissionRequest(PermissionHandler.APPROVE_ALL)
).get();
Estructura del directorio de aptitudes
Cada aptitud es un subdirectorio con nombre que contiene un SKILL.md archivo:
skills/
├── code-review/
│ └── SKILL.md
└── documentation/
└── SKILL.md
La skillDirectories opción apunta al directorio primario (por ejemplo, ./skills). La CLI detecta todos los SKILL.md archivos en subdirectorios inmediatos.
formato SKILL.md
Un archivo SKILL.md es un documento Markdown con un frontmatter YAML opcional.
---
name: code-review
description: Specialized code review capabilities
---
# Code Review Guidelines
When reviewing code, always check for:
1. **Security vulnerabilities** - SQL injection, XSS, etc.
2. **Performance issues** - N+1 queries, memory leaks
3. **Code style** - Consistent formatting, naming conventions
4. **Test coverage** - Are critical paths tested?
Provide specific line-number references and suggested fixes.
Los campos de frontmatter:
name: identificador de la aptitud (que se usa condisabledSkillspara deshabilitarla de forma selectiva). Si se omite, se usa el nombre del directorio.description: Una breve descripción de lo que hace la habilidad.
El cuerpo de Markdown contiene las instrucciones que se insertan en el contexto de sesión cuando se carga la skill.
Opciones de configuración
Campos de habilidades de SessionConfig
| Language | Campo | Tipo | Description |
|---|---|---|---|
| Node.js | skillDirectories | string[] | Directorios desde los que cargar habilidades |
| Node.js | disabledSkills | string[] | Habilidades para desactivar |
| Python | skill_directories | list[str] | Directorios desde los que cargar habilidades |
| Python | disabled_skills | list[str] | Habilidades para desactivar |
| Ir | SkillDirectories | []string | Directorios desde los que cargar habilidades |
| Ir | DisabledSkills | []string | Habilidades para desactivar |
| .NET | SkillDirectories | List<string> | Directorios desde los que cargar habilidades |
| .NET | DisabledSkills | List<string> | Habilidades para desactivar |
procedimientos recomendados
-
Organizar por dominio : agrupar aptitudes relacionadas (por ejemplo,
skills/security/,skills/testing/) -
Usa metadatos preliminares - Incluye
nameydescriptionen los metadatos preliminares de YAML para mayor claridad -
Dependencias del documento: indica las herramientas o servidores MCP que requiere una habilidad.
-
Prueba de aptitudes de forma aislada : compruebe que las aptitudes funcionan antes de combinarlas
-
Utiliza rutas relativas - Mantén las habilidades portátiles en distintos entornos
Combinación con otras características
Habilidades + agentes personalizados
Las habilidades enumeradas en el campo skills de un agente se precargan de forma anticipada: su contenido completo se inserta en el contexto del agente al iniciarse, por lo que el agente tiene acceso inmediato a las instrucciones de la habilidad sin necesidad de invocar una herramienta de habilidades. Los nombres de habilidad se resuelven a partir de skillDirectories de nivel de sesión.
const session = await client.createSession({
skillDirectories: ["./skills/security"],
customAgents: [{
name: "security-auditor",
description: "Security-focused code reviewer",
prompt: "Focus on OWASP Top 10 vulnerabilities",
skills: ["security-scan", "dependency-check"],
}],
onPermissionRequest: async () => ({ kind: "approve-once" }),
});
Nota:
Las aptitudes son opcionales, cuando skills se omite, no se inserta ningún contenido de aptitudes. Los subagentes no heredan habilidades del agente principal; debe enumerarlas explícitamente para cada agente.
Habilidades y servidores MCP
Las aptitudes pueden complementar las funcionalidades del servidor MCP:
const session = await client.createSession({
skillDirectories: ["./skills/database"],
mcpServers: {
postgres: {
type: "local",
command: "npx",
args: ["-y", "@modelcontextprotocol/server-postgres"],
tools: ["*"],
},
},
onPermissionRequest: async () => ({ kind: "approve-once" }),
});
Solución de problemas
Aptitudes que no se cargan
- Compruebe que la ruta existe - Verifique que la ruta del directorio de habilidades es correcta y que contiene subdirectorios con archivos
SKILL.md - Comprobación de permisos : asegúrese de que el SDK puede leer el directorio.
- Comprobar el formato de SKILL.md - Verificar que el archivo Markdown esté bien formado y que cualquier encabezado YAML utilice una sintaxis válida.
- Activar el registro de depuración - Establece
logLevel: "debug"para ver los registros de carga de habilidades
Conflictos de aptitudes
Si varias aptitudes proporcionan instrucciones en conflicto:
- Use
disabledSkillspara excluir habilidades en conflicto - Reorganización de directorios de aptitudes para evitar superposiciones
Consulte también
- Crea tu primera aplicación con tecnología Copilot - Definir perfiles de IA especializados
- Crea tu primera aplicación con tecnología Copilot : crear sus propias herramientas
- Using MCP servers with the GitHub Copilot SDK : conexión de proveedores de herramientas externos