{"meta":{"title":"Benutzerdefinierte Fähigkeiten","intro":"Skills sind wiederverwendbare Promptmodule, die die Fähigkeiten von Copilot erweitern. Laden Sie Fähigkeiten aus Verzeichnissen, um Copilot mit spezialisierten Fähigkeiten für bestimmte Domänen oder Workflows auszustatten.","product":"GitHub Copilot","breadcrumbs":[{"href":"/de/copilot","title":"GitHub Copilot"},{"href":"/de/copilot/how-tos","title":"Vorgehensweisen"},{"href":"/de/copilot/how-tos/copilot-sdk","title":"Copilot SDK"},{"href":"/de/copilot/how-tos/copilot-sdk/features","title":"Funktionen"},{"href":"/de/copilot/how-tos/copilot-sdk/features/skills","title":"Fähigkeiten"}],"documentType":"article"},"body":"# Benutzerdefinierte Fähigkeiten\n\nSkills sind wiederverwendbare Promptmodule, die die Fähigkeiten von Copilot erweitern. Laden Sie Fähigkeiten aus Verzeichnissen, um Copilot mit spezialisierten Fähigkeiten für bestimmte Domänen oder Workflows auszustatten.\n\n<!-- markdownlint-disable GHD046 GHD005 -->\n\n<!-- Suppressed: GHD046 (outdated release terminology), GHD005 (hardcoded data variable) -->\n\n## Übersicht\n\nEine Fähigkeit ist ein benanntes Verzeichnis, das eine `SKILL.md`-Datei enthält – ein Markdown-Dokument, das Anweisungen für Copilot bereitstellt. Beim Laden wird der Inhalt der Fähigkeit in den Sitzungskontext eingefügt.\n\nFähigkeiten ermöglichen Folgendes:\n\n* Packen von Domänenkenntnissen in wiederverwendbare Module\n* Spezialisierte Verhaltensweisen über Projekte hinweg teilen\n* Organisieren komplexer Agentkonfigurationen\n* Aktivieren/Deaktivieren von Funktionen pro Sitzung\n\n## Ladefähigkeiten\n\nGeben Sie Verzeichnisse an, die Fähigkeiten enthalten, wenn Sie eine Sitzung erstellen:\n\n<div class=\"ghd-codetabs\">\n<div class=\"ghd-codetab\" data-lang=\"typescript\" data-label=\"TypeScript\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">TypeScript</div>\n\n```typescript\nimport { CopilotClient } from \"@github/copilot-sdk\";\n\nconst client = new CopilotClient();\nconst session = await client.createSession({\n    model: \"gpt-5.4\",\n    skillDirectories: [\n        \"./skills/code-review\",\n        \"./skills/documentation\",\n    ],\n    onPermissionRequest: async () => ({ kind: \"approve-once\" }),\n});\n\n// Copilot now has access to skills in those directories\nawait session.sendAndWait({ prompt: \"Review this code for security issues\" });\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"python\" data-label=\"Python\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Python</div>\n\n```python\nfrom copilot import CopilotClient, PermissionDecisionApproveOnce\n\nasync def main():\n    client = CopilotClient()\n    await client.start()\n\n    session = await client.create_session(\n        on_permission_request=lambda req, inv: PermissionDecisionApproveOnce(),\n        model=\"gpt-5.4\",\n        skill_directories=[\n            \"./skills/code-review\",\n            \"./skills/documentation\",\n        ],\n    )\n\n    # Copilot now has access to skills in those directories\n    await session.send_and_wait(\"Review this code for security issues\")\n\n    await client.stop()\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"go\" data-label=\"Go\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Go</div>\n\n```golang\npackage main\n\nimport (\n    \"context\"\n    \"log\"\n    copilot \"github.com/github/copilot-sdk/go\"\n    \"github.com/github/copilot-sdk/go/rpc\"\n)\n\nfunc main() {\n    ctx := context.Background()\n    client := copilot.NewClient(nil)\n    if err := client.Start(ctx); err != nil {\n        log.Fatal(err)\n    }\n    defer client.Stop()\n\n    session, err := client.CreateSession(ctx, &copilot.SessionConfig{\n        Model: \"gpt-5.4\",\n        SkillDirectories: []string{\n            \"./skills/code-review\",\n            \"./skills/documentation\",\n        },\n        OnPermissionRequest: func(req copilot.PermissionRequest, inv copilot.PermissionInvocation) (rpc.PermissionDecision, error) {\n            return &rpc.PermissionDecisionApproveOnce{}, nil\n        },\n    })\n    if err != nil {\n        log.Fatal(err)\n    }\n\n    // Copilot now has access to skills in those directories\n    _, err = session.SendAndWait(ctx, copilot.MessageOptions{\n        Prompt: \"Review this code for security issues\",\n    })\n    if err != nil {\n        log.Fatal(err)\n    }\n}\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"dotnet\" data-label=\".NET\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">.NET</div>\n\n```csharp\nusing GitHub.Copilot;\nusing GitHub.Copilot.Rpc;\n\nawait using var client = new CopilotClient();\nawait using var session = await client.CreateSessionAsync(new SessionConfig\n{\n    Model = \"gpt-5.4\",\n    SkillDirectories = new List<string>\n    {\n        \"./skills/code-review\",\n        \"./skills/documentation\",\n    },\n    OnPermissionRequest = (req, inv) =>\n        Task.FromResult(PermissionDecision.ApproveOnce()),\n});\n\n// Copilot now has access to skills in those directories\nawait session.SendAndWaitAsync(new MessageOptions\n{\n    Prompt = \"Review this code for security issues\"\n});\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"java\" data-label=\"Java\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Java</div>\n\n```java\nimport com.github.copilot.CopilotClient;\nimport com.github.copilot.rpc.*;\nimport java.util.List;\n\ntry (var client = new CopilotClient()) {\n    client.start().get();\n\n    var session = client.createSession(\n        new SessionConfig()\n            .setModel(\"gpt-5.4\")\n            .setSkillDirectories(List.of(\n                \"./skills/code-review\",\n                \"./skills/documentation\"\n            ))\n            .setOnPermissionRequest(PermissionHandler.APPROVE_ALL)\n    ).get();\n\n    // Copilot now has access to skills in those directories\n    session.sendAndWait(new MessageOptions()\n        .setPrompt(\"Review this code for security issues\")\n    ).get();\n}\n```\n\n</div>\n\n</div>\n\n## Deaktivieren von Fähigkeiten\n\nDeaktivieren Sie bestimmte Fähigkeiten, während andere aktiv bleiben:\n\n<div class=\"ghd-codetabs\">\n<div class=\"ghd-codetab\" data-lang=\"typescript\" data-label=\"TypeScript\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">TypeScript</div>\n\n```typescript\nconst session = await client.createSession({\n    skillDirectories: [\"./skills\"],\n    disabledSkills: [\"experimental-feature\", \"deprecated-tool\"],\n});\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"python\" data-label=\"Python\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Python</div>\n\n```python\nfrom copilot.session import PermissionHandler\n\nsession = await client.create_session(\n    on_permission_request=PermissionHandler.approve_all,\n    skill_directories=[\"./skills\"],\n    disabled_skills=[\"experimental-feature\", \"deprecated-tool\"],\n)\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"go\" data-label=\"Go\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Go</div>\n\n```golang\nsession, _ := client.CreateSession(context.Background(), &copilot.SessionConfig{\n    SkillDirectories: []string{\"./skills\"},\n    DisabledSkills:   []string{\"experimental-feature\", \"deprecated-tool\"},\n})\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"dotnet\" data-label=\".NET\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">.NET</div>\n\n```csharp\nvar session = await client.CreateSessionAsync(new SessionConfig\n{\n    SkillDirectories = new List<string> { \"./skills\" },\n    DisabledSkills = new List<string> { \"experimental-feature\", \"deprecated-tool\" },\n});\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"java\" data-label=\"Java\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Java</div>\n\n<!-- docs-validate: skip -->\n\n```java\nimport com.github.copilot.rpc.*;\nimport java.util.List;\n\nvar session = client.createSession(\n    new SessionConfig()\n        .setSkillDirectories(List.of(\"./skills\"))\n        .setDisabledSkills(List.of(\"experimental-feature\", \"deprecated-tool\"))\n        .setOnPermissionRequest(PermissionHandler.APPROVE_ALL)\n).get();\n```\n\n</div>\n\n</div>\n\n## Kompetenzverzeichnisstruktur\n\nJede Fähigkeit ist ein benanntes Unterverzeichnis, das eine `SKILL.md` Datei enthält:\n\n```text\nskills/\n├── code-review/\n│   └── SKILL.md\n└── documentation/\n    └── SKILL.md\n```\n\nDie `skillDirectories` Option verweist auf das übergeordnete Verzeichnis (z. B. `./skills`). Die CLI ermittelt alle `SKILL.md` Dateien in unmittelbaren Unterverzeichnissen.\n\n### SKILL.md Format\n\nEine `SKILL.md` Datei ist ein Markdowndokument mit optionalem YAML-Frontmatter:\n\n```markdown\n---\nname: code-review\ndescription: Specialized code review capabilities\n---\n\n# Code Review Guidelines\n\nWhen reviewing code, always check for:\n\n1. **Security vulnerabilities** - SQL injection, XSS, etc.\n2. **Performance issues** - N+1 queries, memory leaks\n3. **Code style** - Consistent formatting, naming conventions\n4. **Test coverage** - Are critical paths tested?\n\nProvide specific line-number references and suggested fixes.\n```\n\nDie Frontmatterfelder:\n\n* **`name`**: Die Kennung der Fähigkeit (wird zusammen mit `disabledSkills` verwendet, um sie gezielt zu deaktivieren). Wenn nicht angegeben, wird der Verzeichnisname verwendet.\n* **`description`**: Eine kurze Beschreibung, was die Fähigkeit tut.\n\nDer Markdown Body enthält die Anweisungen, die in den Sitzungskontext injiziert werden, wenn die Fertigkeit geladen wird.\n\n## Konfigurationsoptionen\n\n### SessionConfig-Qualifikationsfelder\n\n| Sprache | Feld                | Typ            | Description                                         |\n| ------- | ------------------- | -------------- | --------------------------------------------------- |\n| Node.js | `skillDirectories`  | `string[]`     | Verzeichnisse, aus denen Fähigkeiten geladen werden |\n| Node.js | `disabledSkills`    | `string[]`     | Zu deaktivierende Fähigkeiten                       |\n| Python  | `skill_directories` | `list[str]`    | Verzeichnisse, aus denen Fähigkeiten geladen werden |\n| Python  | `disabled_skills`   | `list[str]`    | Zu deaktivierende Fähigkeiten                       |\n| Go      | `SkillDirectories`  | `[]string`     | Verzeichnisse, aus denen Fähigkeiten geladen werden |\n| Go      | `DisabledSkills`    | `[]string`     | Zu deaktivierende Fähigkeiten                       |\n| .NET    | `SkillDirectories`  | `List<string>` | Verzeichnisse, aus denen Fähigkeiten geladen werden |\n| .NET    | `DisabledSkills`    | `List<string>` | Zu deaktivierende Fähigkeiten                       |\n\n## Bewährte Methoden\n\n1. **Nach Domäne organisieren** - Gruppieren verwandter Fähigkeiten (z. B. `skills/security/`, ) `skills/testing/`\n\n2. **Frontmatter verwenden** – `name` und `description` zur besseren Übersicht in das YAML-Frontmatter aufnehmen\n\n3. **Dokumentabhängigkeiten** – Beachten Sie alle Tools oder MCP-Server, die eine Fähigkeit erfordern\n\n4. **Fähigkeiten isoliert testen** – Überprüfen Sie, ob die Fähigkeiten funktionieren, bevor Sie sie kombinieren\n\n5. **Verwenden von relativen Pfaden** – Portieren von Fähigkeiten über Umgebungen hinweg\n\n## Kombinieren mit anderen Features\n\n### Fähigkeiten + benutzerdefinierte Agents\n\nDie im Feld eines Agenten `skills` aufgeführten Fähigkeiten werden **eifrig vorab geladen** – ihr vollständiger Inhalt wird beim Start in den Kontext des Agents eingefügt, sodass der Agent sofort Zugriff auf die Qualifikationsanweisungen hat, ohne ein Qualifikationstool aufrufen zu müssen. Qualifikationsnamen werden auf Sitzungsebene `skillDirectories`aufgelöst.\n\n```typescript\nconst session = await client.createSession({\n    skillDirectories: [\"./skills/security\"],\n    customAgents: [{\n        name: \"security-auditor\",\n        description: \"Security-focused code reviewer\",\n        prompt: \"Focus on OWASP Top 10 vulnerabilities\",\n        skills: [\"security-scan\", \"dependency-check\"],\n    }],\n    onPermissionRequest: async () => ({ kind: \"approve-once\" }),\n});\n```\n\n> \\[!NOTE]\n> Fähigkeiten sind opt-in – wenn `skills` nicht angegeben wird, wird kein Qualifikationsinhalt eingefügt. Sub-Agents erben keine Fähigkeiten vom Elternteil; Sie müssen sie pro Agent explizit auflisten.\n\n### Fähigkeiten + MCP-Server\n\nFähigkeiten können MCP-Serverfunktionen ergänzen:\n\n```typescript\nconst session = await client.createSession({\n    skillDirectories: [\"./skills/database\"],\n    mcpServers: {\n        postgres: {\n            type: \"local\",\n            command: \"npx\",\n            args: [\"-y\", \"@modelcontextprotocol/server-postgres\"],\n            tools: [\"*\"],\n        },\n    },\n    onPermissionRequest: async () => ({ kind: \"approve-once\" }),\n});\n```\n\n## Troubleshooting\n\n### Skills, die nicht geladen werden\n\n1. **Check path exists** – Überprüfen Sie, ob der Pfad zum Skillverzeichnis korrekt ist und Unterverzeichnisse mit `SKILL.md`-Dateien enthält.\n2. **Überprüfen von Berechtigungen** – Stellen Sie sicher, dass das SDK das Verzeichnis lesen kann\n3. **Überprüfen sie SKILL.md Format** : Überprüfen, ob der Markdown wohlgeformt ist und alle YAML-Frontmatter gültige Syntax verwenden\n4. **Debug-Protokollierung aktivieren** – Legen Sie `logLevel: \"debug\"` fest, um Protokolle zum Laden von Skills anzuzeigen\n\n### Qualifikationskonflikte\n\nWenn mehrere Fähigkeiten widersprüchliche Anweisungen bereitstellen:\n\n* Verwenden Sie `disabledSkills`, um widersprüchliche Fähigkeiten auszuschließen\n* Neuorganisieren von Kompetenzverzeichnissen, um Überlappungen zu vermeiden\n\n## Siehe auch\n\n* [Erstellen Sie Ihre erste Copilot-gestützte App](/de/copilot/how-tos/copilot-sdk/getting-started#create-custom-agents) - Definieren von speziellen KI-Personas\n* [Erstellen Sie Ihre erste Copilot-gestützte App](/de/copilot/how-tos/copilot-sdk/getting-started#step-4-add-a-custom-tool) – Erstellen Eigener Tools\n* [Verwenden von MCP-Servern mit dem GitHub Copilot SDK](/de/copilot/how-tos/copilot-sdk/features/mcp) – Verbinden externer Toolanbieter"}