Обзор
Навык — это именованный каталог, содержащий файл SKILL.md — документ markdown, который предоставляет инструкции Copilot. При загрузке содержимое навыка вводится в контекст сессии.
Навыки позволяют вам:
- Экспертиза в области упаковки в повторно используемые модули
- Делитесь специализированными поведением между проектами
- Организовывать сложные конфигурации агентов
- Включать/отключать возможности за сессию
Навыки загрузки
При создании сессии указывайте каталоги, содержащие навыки:
Языки кода navigation
import { CopilotClient } from "@github/copilot-sdk";
const client = new CopilotClient();
const session = await client.createSession({
model: "gpt-5.4",
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-5.4",
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-5.4",
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-5.4",
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.CopilotClient;
import com.github.copilot.rpc.*;
import java.util.List;
try (var client = new CopilotClient()) {
client.start().get();
var session = client.createSession(
new SessionConfig()
.setModel("gpt-5.4")
.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();
}
Навыки отключения
Отключите определённые навыки, сохраняя активность других:
Языки кода navigation
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"],
)
session, _ := client.CreateSession(context.Background(), &copilot.SessionConfig{
SkillDirectories: []string{"./skills"},
DisabledSkills: []string{"experimental-feature", "deprecated-tool"},
})
var session = await client.CreateSessionAsync(new SessionConfig
{
SkillDirectories = new List<string> { "./skills" },
DisabledSkills = new List<string> { "experimental-feature", "deprecated-tool" },
});
import com.github.copilot.rpc.*;
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();
Структура каталога навыков
Каждый навык представляет собой именованный подкаталог, содержащий SKILL.md файл:
skills/
├── code-review/
│ └── SKILL.md
└── documentation/
└── SKILL.md
Опция указывает skillDirectories на родительский каталог (например, ./skills). CLI обнаруживает все SKILL.md файлы в немедленных подкаталогах.
формат SKILL.md
Файл SKILL.md — это документ markdown с опциональной YAML-фронтматерью:
---
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.
Фронтматтерные поля:
name: Идентификатор навыка (используется дляdisabledSkillsвыборочного отключения). Если оно опущено, используется имя каталога.description: Краткое описание того, что делает навык.
Тело markdown содержит инструкции, которые вводятся в контекст сессии при загрузке навыка.
Поставщики навыков (экспериментальные)
Примечание.
Поставщики навыков являются экспериментальными. API может измениться в будущих выпусках пакета SDK.
Поставщик навыков предоставляет навыки из собственного хранилища приложения, например базы данных в мультитенантной службе, а не SKILL.md файлов на диске. Навыки поставщика присоединяются к каталогу навыков сеанса вместе с навыками на основе файлов. Модель загружает их по запросу с помощью skill средства, и пользователи могут вызывать их как любой другой навык.
Поставщик реализует две операции:
- Навыки списка: возвращает метаданные каталога для каждого навыка: a
name, adescription, а также при необходимостиuserInvocable``disableModelInvocation, иargumentHint. Среда выполнения вызывает его при загрузке навыков сеанса. - Навык чтения: возвращает разметку для одного навыка или не найден результат, если навык больше не существует. Среда выполнения вызывает его только при загрузке навыка.
Передайте поставщик при создании или возобновлении сеанса:
import { approveAll, CopilotClient, type SkillProvider } from "@github/copilot-sdk";
const releaseSkills = new Map([
[
"release-notes",
{
description: "Writes release notes in the team's format.",
markdown: "Group changes by feature area and link each pull request.",
},
],
]);
const skillProvider: SkillProvider = {
listSkills: () =>
[...releaseSkills].map(([name, skill]) => ({ name, description: skill.description })),
readSkill: (name) => releaseSkills.get(name)?.markdown ?? null,
};
const client = new CopilotClient();
const session = await client.createSession({
onPermissionRequest: approveAll,
skillProvider,
});
from copilot import CopilotClient, SkillProviderDescriptor
from copilot.session import PermissionHandler
RELEASE_SKILLS = {
"release-notes": (
"Writes release notes in the team's format.",
"Group changes by feature area and link each pull request.",
),
}
class ReleaseSkills:
async def list_skills(self) -> list[SkillProviderDescriptor]:
return [
SkillProviderDescriptor(name=name, description=description)
for name, (description, _) in RELEASE_SKILLS.items()
]
async def read_skill(self, name: str) -> str | None:
skill = RELEASE_SKILLS.get(name)
return skill[1] if skill else None
async def main():
client = CopilotClient()
await client.start()
session = await client.create_session(
on_permission_request=PermissionHandler.approve_all,
skill_provider=ReleaseSkills(),
)
package main
import (
"context"
"fmt"
"log"
copilot "github.com/github/copilot-sdk/go"
"github.com/github/copilot-sdk/go/rpc"
)
type releaseSkill struct {
description string
markdown string
}
type releaseSkills map[string]releaseSkill
func (s releaseSkills) ListSkills(ctx context.Context) ([]rpc.SkillProviderDescriptor, error) {
descriptors := make([]rpc.SkillProviderDescriptor, 0, len(s))
for name, skill := range s {
descriptors = append(descriptors, rpc.SkillProviderDescriptor{Name: name, Description: skill.description})
}
return descriptors, nil
}
func (s releaseSkills) ReadSkill(ctx context.Context, name string) (string, error) {
skill, ok := s[name]
if !ok {
return "", fmt.Errorf("%w: %s", copilot.ErrSkillNotFound, name)
}
return skill.markdown, nil
}
func main() {
ctx := context.Background()
client := copilot.NewClient(nil)
session, err := client.CreateSession(ctx, &copilot.SessionConfig{
OnPermissionRequest: copilot.PermissionHandler.ApproveAll,
SkillProvider: releaseSkills{
"release-notes": {
description: "Writes release notes in the team's format.",
markdown: "Group changes by feature area and link each pull request.",
},
},
})
if err != nil {
log.Fatal(err)
}
_ = session
}
#pragma warning disable GHCP001 // Skill providers are experimental.
using GitHub.Copilot;
using GitHub.Copilot.Rpc;
public sealed class ReleaseSkills : ISkillProvider
{
private readonly Dictionary<string, (string Description, string Markdown)> _skills = new()
{
["release-notes"] = (
"Writes release notes in the team's format.",
"Group changes by feature area and link each pull request."),
};
public Task<IReadOnlyList<SkillProviderDescriptor>> ListSkillsAsync(CancellationToken cancellationToken) =>
Task.FromResult<IReadOnlyList<SkillProviderDescriptor>>(
_skills.Select(skill => new SkillProviderDescriptor
{
Name = skill.Key,
Description = skill.Value.Description,
}).ToList());
public Task<string?> ReadSkillAsync(string name, CancellationToken cancellationToken) =>
Task.FromResult(_skills.TryGetValue(name, out var skill) ? skill.Markdown : null);
}
public static class SkillProviderExample
{
public static async Task RunAsync(CopilotClient client)
{
await using var session = await client.CreateSessionAsync(new SessionConfig
{
OnPermissionRequest = PermissionHandler.ApproveAll,
SkillProvider = new ReleaseSkills(),
});
}
}
Типы поставщиков навыков .NET вызывают экспериментальную диагностикуGHCP001. Отключайте его с помощью #pragma warning disable GHCP001 или уровня <NoWarn>GHCP001</NoWarn>проекта.
import com.github.copilot.AllowCopilotExperimental;
import com.github.copilot.CopilotClient;
import com.github.copilot.CopilotSession;
import com.github.copilot.SkillProvider;
import com.github.copilot.SkillProviderDescriptor;
import com.github.copilot.rpc.PermissionHandler;
import com.github.copilot.rpc.SessionConfig;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
@AllowCopilotExperimental
class ReleaseSkills implements SkillProvider {
private final Map<String, String> markdown = Map.of(
"release-notes", "Group changes by feature area and link each pull request.");
@Override
public CompletableFuture<List<SkillProviderDescriptor>> listSkills() {
return CompletableFuture.completedFuture(List.of(new SkillProviderDescriptor(
"release-notes", "Writes release notes in the team's format.", null, null, null)));
}
@Override
public CompletableFuture<String> readSkill(String name) {
return CompletableFuture.completedFuture(markdown.get(name));
}
}
@AllowCopilotExperimental
class SkillProviderExample {
static CopilotSession createSession(CopilotClient client) throws Exception {
return client.createSession(new SessionConfig()
.setOnPermissionRequest(PermissionHandler.APPROVE_ALL)
.setSkillProvider(new ReleaseSkills()))
.get();
}
}
API поставщика навыков Java, @CopilotExperimentalпоэтому используемый класс или метод должен принять участие @AllowCopilotExperimental (или компилировать с-Acopilot.experimental.allowed=true). См. статью "Использование экспериментальных API".
use std::sync::Arc;
use async_trait::async_trait;
use github_copilot_sdk::{Error, SessionConfig, SkillProvider, SkillProviderDescriptor};
struct ReleaseSkills;
#[async_trait]
impl SkillProvider for ReleaseSkills {
async fn list_skills(&self) -> Result<Vec<SkillProviderDescriptor>, Error> {
Ok(vec![SkillProviderDescriptor {
name: "release-notes".into(),
description: "Writes release notes in the team's format.".into(),
..Default::default()
}])
}
async fn read_skill(&self, name: &str) -> Result<Option<String>, Error> {
Ok((name == "release-notes")
.then(|| "Group changes by feature area and link each pull request.".to_string()))
}
}
let session = client
.create_session(
SessionConfig::default()
.approve_all_permissions()
.with_skill_provider(Arc::new(ReleaseSkills)),
)
.await?;
Содержимое навыка поставщика
Навык чтения возвращает текст навыка SKILL.md . Frontmatter YAML необязателен:
- Без интерфейсного элемента весь текст является телом навыка, и все метаданные поступают из указанного навыка.
- При использовании frontmatter опущенное поле наследует указанное значение. Включаемое поле должно соответствовать указанному значению или навыку не удается загрузить.
allowed-toolsсчитывается только из frontmatter.- Если первая строка текста — это
---, среда выполнения анализирует его как frontmatter, поэтому не запускайте навык только для тела с тематическим разрывом Markdown.
По умолчанию навыки поставщика являются текстовыми: они не имеют базового каталога, поэтому они не могут ссылаться на упакованные скрипты, шаблоны или другие файлы. Сведения о том, как предоставить навык поставщика таких файлов, см. в разделе "Поддержка файлов".
skills.list навыки поставщика отчетов с источником sdk и пустым path, с поддержкой файлов или без нее.
Вспомогательные файлы (экспериментальные)
Навык поставщика может содержать вспомогательные файлы, такие как скрипты, ссылки, шаблоны и ресурсы, так же, как папка навыка на основе файлов. Приложение сохраняет файлы каждого навыка в папке, которую он управляет, и задает directory для указанного навыка абсолютный путь к этой папке.
Когда модель активирует навык, среда выполнения перечисляет папку так же, как она выводит папку навыка на основе файлов. Модель получает тот же список "Базовый каталог для этого навыка" и список связанных файлов, что навык на основе файлов получает вместо уведомления только для текста и считывает файлы с обычными инструментами файлов. Среда выполнения никогда не считывает, копирует или записывает сами файлы.
import { approveAll, CopilotClient, type SkillProvider } from "@github/copilot-sdk";
const skillProvider: SkillProvider = {
listSkills: () => [
{
name: "release-notes",
description: "Writes release notes in the team's format.",
directory: "/srv/skills/release-notes",
},
],
readSkill: (name) =>
name === "release-notes"
? "Run `python3 scripts/changelog.py` and fill in `templates/notes.md`."
: null,
};
const client = new CopilotClient();
const session = await client.createSession({
onPermissionRequest: approveAll,
skillProvider,
});
Каждый пакет SDK задает папку по указанному типу навыка:
| SDK | Поле |
|---|---|
| Node.js | directory: "/ |
| Python | directory="/ |
| Go | Directory: copilot.String("/ |
| .NET | Directory = "/ |
| Java | |
Skill Шестой аргумент конструктора | |
| Rust | directory: Some("/ |
Расположение папки
Поместите все файлы навыка в directoryодну папку на навык. Папка должна быть доступной, где выполняется среда выполнения:
- Локальный диск. Без файловой системы
directoryсеанса — это путь к компьютеру или контейнеру, который запускает среду выполнения. Модель может считывать файлы с помощью любого средства, и она может выполнять скрипты. - Файловая система сеанса (Мультиарендные и серверные развертывания). В обработчике
sessionFs``directoryиспользуются соглашения о пути обработчика, а обработчик обслуживает файлы. Среда выполнения перечисляет папку через нее.view, ,create``editиapply_patchдоступ к файлам.grep,globи команды оболочки не выполняются, поэтому скрипты не могут выполняться. Пакет SDK Java отсутствуетsessionFs, поэтому Java поставщики используют локальный диск.
Среда выполнения выводит папку после возврата навыка чтения, поэтому можно создать папку лениво в навыке чтения. Если папка отсутствует или пуста или не может быть указана в течение 15 секунд после вызова навыка чтения во время выполнения, модель по-прежнему получает базовую строку каталога без списка связанных файлов, как для навыка на основе файлов. Если обработчик sessionFs отключен при выполнении списков навыков среды выполнения, эти навыки доступны только для текста до следующего перечисления.
Доступ
- Локальный диск. После перечисления навыков среда выполнения обрабатывает все включенные навыки
directoryпоставщика как настроеннуюskillDirectoriesпапку: считывает под ним запрос пути к внешней рабочей области и изолированные процессы получают доступ только для чтения к нему. Операции чтения по-прежнему отправляются в обработчик разрешений, так как они выполняются для навыков на основе файлов. Не возвращайте широкий каталог, например домашнюю папку или папку, содержащую файлы каждого клиента. - Файловая система сеанса. Среда выполнения не добавляет доступа к папке. У обработчика разрешений есть утверждение считывания под ним, и когда песочница включена, добавьте папку в песочницу
readonlyPaths.
Ваше приложение владеет папкой: где она живет, как долго она существует, очищает ее и сохраняет модель от изменения. Доступ только для чтения охватывает только изолированные процессы. Вне песочницы или, когда папка находится в рабочей области, модель может записывать в нее, если обработчик разрешений или обработчик sessionFs разрешений не отказывается.
Написание навыка
- Обратитесь к вспомогательным файлам по их пути относительно папки навыка, например
references/guide.md. Модель говорит абсолютный путь папки. - Выполнение скриптов с помощью интерпретатора, например или
bash scripts/build.sh, какpython3 scripts/changelog.pyиспользование скриптов в навыков, описывается. Скрипты выполняются только в том случае, если папка находится на локальном диске.
Правила и ограничения
directoryдолжен быть абсолютным в соглашениях о путях сеанса; в файловой системе сеанса Windows требуется диск или префикс UNC. Это разрешено, как средства файлов разрешают пути, поэтому.``..сегменты и повторяющиеся или конечные разделители удаляются и не могут разрешаться в корневой каталог файловой системы. Он подсчитывается в сторону ограничения метаданных 1 MiB каталога, и он не отображается в каталогах навыков. Недопустимоdirectoryотклоняет весь каталог, как и любой другой недопустимый навык.- Список связанных файлов следует правилам на основе файлов: папки сборки и зависимостей, такие как
node_modules,binиobj``dist, скрыты; папка с более чем 50 записями суммируется; файлы, вложенные более 10 папок глубоко не перечислены; никогда не перечисляются;SKILL.mdи не отображаются не более 100 файлов. - После сжатия беседы модель сохраняет инструкции навыка, но не путь к папке. Вызов навыка снова показывает его. Навыки на основе файлов сохраняют свой путь.
- Для поддержки файлов требуется Copilot CLI по крайней мере как новый выпуск пакета SDK, добавляющий их. Старый интерфейс командной строки отклоняет весь каталог навыков при наличии любого указанного навыка
directory. Поставщики, которые не задаютdirectoryработу со старыми интерфейсами CLIs.
Обслуживание существующих файлов SKILL.md
Чтобы служить SKILL.md уже имеющимся файлам, таким как файлы, хранящиеся в базе данных, анализирует интерфейс YAML каждого файла один раз, чтобы создать запись каталога, а затем возвращает файл без изменений от навыка чтения:
- Сопоставлять и сопоставлять
nameуказанные навыкиnameиdescription.descriptionОба являются обязательными в каталоге; Среда выполнения не возвращается к имени папки или тексту навыка. - Сопоставление
user-invocable,disable-model-invocationа такжеargument-hintсопоставление необязательных полей при их установке. - Возвращает исходный текст, включенный frontmatter, из навыка чтения. Так как перечисленные значения пришли из того же frontmatter, они совпадают, и среда выполнения по-прежнему считывается
allowed-toolsиз него.
Доверие к содержимому поставщика
Относитесь к навыкам поставщика, таким как каталоги навыков: их содержимое является доверенным входным данным. Модель следует инструкциям навыка, и интерфейсный элемент управления вызовом навыка.
allowed-tools не предоставляет разрешения в сеансах SDK. Среда выполнения сообщает его в allowedTools поле skill.invoked события, и обработчик разрешений по-прежнему решает каждый запрос средства.
Не обслуживайте текст, который пользователи или другие клиенты могут редактировать, если только не позволить им создавать файл навыка. Если вы создаете навыки из входных данных пользователя, создайте интерфейсное приложение самостоятельно, а не передаете интерфейсное приложение, предоставленное пользователем.
Ограничения и ошибки поставщика
Среда выполнения проверяет каталог и содержимое поставщика:
-
Имена должны совпадать
^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$и быть уникальными, игнорируя регистр. -
Каталог может содержать не более 1024 навыков и 1 МиБ метаданных. Каждое описание и указание аргумента могут быть не более 1024 символов.
-
Разметка каждого навыка может быть не более 1 МиБ UTF-8.
-
Каждый вызов должен завершиться в течение 30 секунд. Когда среда выполнения перестает ожидать вызова, так как время ожидания истекло, сеанс закончился или резюме заменил поставщика, он отменяет запрос и игнорирует любой последующий результат. Каждый пакет SDK передает это отмену поставщику в обычном режиме:
SDK Сигнал отмены Node.js ( signal) в параметрах, переданныхlistSkillsиreadSkillпрерванных.AbortSignalPython Задача поставщика asyncioотменена.asyncio.CancelledСинхронные поставщики выполняются до завершения.Error Go Звонок context.Contextотменен..NET Звонок CancellationTokenотменен.Java Возвращенный объект CompletableFutureотменен сcancel(true)помощью которого не прерывается выполнение работы.Rust Будущее поставщика удаляется. Эти сигналы охватывают вызовы, которые среда выполнения отменяет. Когда подключение закрывается или клиент останавливается принудительно, .NET, Java и пакеты SDK Rust также отменяют вызовы, которые по-прежнему выполняются. Пакеты SDK Node.js, Python и Go не выполняются: выполняемый вызов продолжается до тех пор, пока он не возвращается, а пакет SDK удаляет его результат.
Если перечисление завершается ошибкой или возвращает недопустимый каталог, среда выполнения сообщает о проблеме в списке errors , возвращенном skills.reload. Сбой перезагрузки сохраняет навыки поставщика из последнего успешного списка. Если чтение навыка завершается сбоем, skill средство сообщает о универсальной загрузке модели. Пакет SDK никогда не пересылает текст ошибок, которые ваш поставщик выдает или возвращает, чтобы текст не смог утечки в беседу.
Жизненный цикл поставщика
Поставщик привязан к одному сеансу:
- Поставщик включает навыки, если не задано значение
enableSkills``false, которое сохраняет привязку поставщика, но никогда не вызывается. Вmode: "empty", навыки остаются отключенными, пока не задано значениеenableSkills``true. - Поставщик никогда не сохраняется. Передайте его снова при возобновлении сеанса. Возобновление без поставщика удаляет его из сеанса. Расширения, которые присоединяются к сеансу, не изменяют его.
- Навык поставщика с тем же именем, что и навык на основе файлов, заменяет навык на основе файлов и
skills.reloadсообщает предупреждение. - Дочерние агенты используют поставщика родительского сеанса.
- Среда выполнения может одновременно вызывать поставщика, например из
skillсредства, вызовов пользователей и пользовательских агентов, которые предварительно загружают навыки, поэтому обе операции должны быть безопасными для параллельного использования. - Облачные сеансы не поддерживают поставщиков навыков. Пакет SDK отклоняет конфигурацию перед созданием сеанса.
Варианты конфигурации
Поля навыков SessionConfig
| Язык | Поле | Тип | Description |
|---|---|---|---|
| Node.js | skillDirectories | string[] | Каталоги для загрузки навыков |
| Node.js | disabledSkills | string[] | Навыки для отключения |
| Node.js | skillProvider | SkillProvider | Экспериментальный поставщик навыков, предоставляемых пакетом SDK |
| Python | skill_directories | list[str] | Каталоги для загрузки навыков |
| Python | disabled_skills | list[str] | Навыки для отключения |
| Python | skill_provider | SkillProvider | Экспериментальный поставщик навыков, предоставляемых пакетом SDK |
| Go | SkillDirectories | []string | Каталоги для загрузки навыков |
| Go | DisabledSkills | []string | Навыки для отключения |
| Go | SkillProvider | SkillProvider | Экспериментальный поставщик навыков, предоставляемых пакетом SDK |
| .NET | SkillDirectories | List<string> | Каталоги для загрузки навыков |
| .NET | DisabledSkills | List<string> | Навыки для отключения |
| .NET | SkillProvider | ISkillProvider | Экспериментальный поставщик навыков, предоставляемых пакетом SDK |
| Java | setSkillProvider | SkillProvider | Экспериментальный поставщик навыков, предоставляемых пакетом SDK |
| Rust | with_skill_provider | Arc<dyn SkillProvider> | Экспериментальный поставщик навыков, предоставляемых пакетом SDK |
Встроенные навыки и mode: "empty"
Среда выполнения поставляется с набором встроенных навыков, доступных по умолчанию. При запуске клиента mode: "empty" (рекомендуемый базовый план для Мультиарендные и серверные развертывания) пакет SDK исключает все встроенные навыки среды выполнения: он отправляет пустой includedBuiltinSkills список в исправлении параметров после создания и после возобновления, а также пустой installedPlugins список.
Это исключение является стандартным, а не постоянным ограничением. Чтобы разрешить выбранные навыки, связанные со средой выполнения, задайте includedBuiltinSkills (или регистр на языке) их имена. Вы также можете выбрать собственные пользовательские навыки в разделе mode: "empty"—включить навыки и передать свои собственные skillDirectories, и они остаются полностью пригодными для использования, включая пользовательский навык, который предоставляет имя встроенному.
В mode: "copilot-cli" поле не указано, если этот параметр не задан.
Пользовательские каталоги навыков проверяются при первой загрузке навыков, включая каталоги, которые отсутствуют или пусты в этом моменте. Изменения файловой системы в этих каталогах не обновляются автоматически при последующих поворотах каталога. После добавления, редактирования или удаления навыков вызовите RPC сеанса skills.reload :
| SDK | Перезагрузить вызов |
|---|---|
| Node.js | await session.rpc.skills.reload() |
| Python | await session.rpc.skills.reload() |
| Go | session.RPC.Skills.Reload(ctx) |
| .NET | await session.Rpc.Skills.Reload |
| Java | session.get |
| Rust | session.rpc().skills().reload().await? |
Изменение настроенных каталогов навыков также обновляет каталог.
Лучшие практики
-
Организовать по домену — сгруппировать связанные навыки вместе (например,
skills/security/,skills/testing/) -
Используйте frontmatter — включите
name``descriptionи включите в YAML frontmatter для ясности -
Зависимости документов — обратите внимание на любые инструменты или MCP-серверы, требуемые для навыка
-
Проверяйте навыки по отдельности — проверяйте работу навыков перед их объединением
-
Используйте относительные пути — Сохраняйте навыки в разных условиях
Объединение с другими особенностями
Навыки + кастомные агенты
Навыки, skills указанные в поле агента, с энтузиазмом заранее загружаются — их полное содержание внедряется в контекст агента при запуске, так что агент получает доступ к инструкциям навыков без необходимости вызывать инструмент навыков. Названия навыков решаются на уровне skillDirectoriesсессии.
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" }),
});
Примечание.
Навыки — это опция по выбору — если skills их опускают, контент навыков не вводится. Субагенты не наследуют навыки от родителя; Вы должны указывать их явно для каждого агента.
Навыки + MCP-серверы
Навыки могут дополнять возможности 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" }),
});
Troubleshooting
Навыки не загружаются
- Существует путь проверки — убедитесь, что путь в каталоге навыков правильный и содержит подкаталоги с
SKILL.mdфайлами - Проверьте права — убедитесь, что SDK может читать каталог
- Проверьте SKILL.md формат — убедитесь, что markdown хорошо сформирован и любой YAML-фронтматтер использует корректный синтаксис
- Включить отладочный лог — настройте
logLevel: "debug"на просмотр логов загрузки навыков
Конфликты навыков
Если несколько навыков дают противоречивые инструкции:
- Используйте
disabledSkillsдля исключения конфликтующих навыков - Реорганизуйте каталоги навыков, чтобы избежать пересечений
См. также
- Создайте своё первое приложение на базе Copilot — определите специализированные ИИ-персоны
- Создайте своё первое приложение на базе Copilot — Создавайте свои собственные инструменты
- Использование MCP-серверов с SDK GitHub Copilot — Подключите внешних поставщиков инструментов