{"meta":{"title":"Compétences personnalisées","intro":"Les compétences sont des modules d’instructions réutilisables qui augmentent les capacités de Copilot. Chargez des compétences depuis des répertoires pour doter Copilot de capacités spécialisées pour des domaines ou des flux de travail spécifiques.","product":"GitHub Copilot","breadcrumbs":[{"href":"/fr/copilot","title":"GitHub Copilot"},{"href":"/fr/copilot/how-tos","title":"Procédures"},{"href":"/fr/copilot/how-tos/copilot-sdk","title":"Kit de développement logiciel (SDK) Copilot"},{"href":"/fr/copilot/how-tos/copilot-sdk/features","title":"Fonctionnalités"},{"href":"/fr/copilot/how-tos/copilot-sdk/features/skills","title":"Compétences"}],"documentType":"article"},"body":"# Compétences personnalisées\n\nLes compétences sont des modules d’instructions réutilisables qui augmentent les capacités de Copilot. Chargez des compétences depuis des répertoires pour doter Copilot de capacités spécialisées pour des domaines ou des flux de travail spécifiques.\n\n<!-- markdownlint-disable GHD046 GHD005 -->\n\n<!-- Suppressed: GHD046 (outdated release terminology), GHD005 (hardcoded data variable) -->\n\n## Overview\n\nUne compétence est un répertoire nommé contenant un fichier `SKILL.md`, un document markdown qui fournit des instructions pour Copilot. Lors du chargement, le contenu de la compétence est injecté dans le contexte de session.\n\nLes compétences vous permettent de :\n\n* Emballer l'expertise du domaine en modules réutilisables\n* Partager des comportements spécialisés entre les projets\n* Organiser des configurations d’agent complexes\n* Activer/désactiver des fonctionnalités par session\n\n## Compétences de chargement\n\nSpécifiez des répertoires contenant des compétences lors de la création d’une session :\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## Désactivation des fonctionnalités\n\nDésactivez des compétences spécifiques tout en gardant les autres actifs :\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## Structure du répertoire de compétences\n\nChaque compétence est un sous-répertoire nommé contenant un `SKILL.md` fichier :\n\n```text\nskills/\n├── code-review/\n│   └── SKILL.md\n└── documentation/\n    └── SKILL.md\n```\n\nL’option `skillDirectories` pointe vers le répertoire parent (par exemple). `./skills` L’interface CLI découvre tous les `SKILL.md` fichiers dans les sous-répertoires immédiats.\n\n### format SKILL.md\n\nUn `SKILL.md` fichier est un document Markdown avec un frontmatter YAML facultatif :\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\nChamps frontmatter :\n\n* **`name`** : L’identificateur de la compétence (utilisé avec `disabledSkills` pour la désactiver sélectivement). S’il est omis, le nom du répertoire est utilisé.\n* **`description`**: brève description de ce que fait la compétence.\n\nLe corps du markdown contient les instructions qui sont injectées dans le contexte de session lorsque la fonctionnalité est chargée.\n\n## Options de configuration\n\n### Champs de compétence SessionConfig\n\n| Language | Champ               | Catégorie      | Description                                         |\n| -------- | ------------------- | -------------- | --------------------------------------------------- |\n| Node.js  | `skillDirectories`  | `string[]`     | Répertoires à partir duquel charger des compétences |\n| Node.js  | `disabledSkills`    | `string[]`     | Compétences à désactiver                            |\n| Python   | `skill_directories` | `list[str]`    | Répertoires à partir duquel charger des compétences |\n| Python   | `disabled_skills`   | `list[str]`    | Compétences à désactiver                            |\n| Allez    | `SkillDirectories`  | `[]string`     | Répertoires à partir duquel charger des compétences |\n| Allez    | `DisabledSkills`    | `[]string`     | Compétences à désactiver                            |\n| .NET     | `SkillDirectories`  | `List<string>` | Répertoires à partir duquel charger des compétences |\n| .NET     | `DisabledSkills`    | `List<string>` | Compétences à désactiver                            |\n\n## Bonnes pratiques\n\n1. **Organiser par domaine - Regrouper** les compétences associées (par exemple, `skills/security/`, `skills/testing/`)\n\n2. **Utiliser les métadonnées d’en-tête** - Inclure `name` et `description` dans les métadonnées d’en-tête YAML pour plus de clarté\n\n3. **Dépendances de document** - Notez tous les outils ou serveurs MCP dont une compétence nécessite\n\n4. **Tester les compétences séparément** - Vérifier que les compétences fonctionnent avant de les combiner\n\n5. **Utiliser des chemins relatifs** - Gardez les compétences portables d’un environnement à l’autre\n\n## Combinaison avec d’autres fonctionnalités\n\n### Compétences + agents personnalisés\n\nLes compétences répertoriées dans le champ d’un `skills` agent sont **préchargées avec impatience** : leur contenu complet est injecté dans le contexte de l’agent au démarrage, de sorte que l’agent a accès aux instructions de compétence immédiatement sans avoir besoin d’appeler un outil de compétence. Les noms de compétence sont résolus à partir du niveau `skillDirectories`de la session.\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> Les compétences sont facultatives : lorsque `skills` est omis, aucun contenu des compétences n’est injecté. Les sous-agents n’héritent pas des compétences du parent ; vous devez les répertorier explicitement par agent.\n\n### Compétences + serveurs MCP\n\nLes compétences peuvent compléter les fonctionnalités du serveur MCP :\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### Compétences non chargées\n\n1. **Vérifier que le chemin d’accès existe** - Vérifiez que le chemin du répertoire de compétences est correct et qu’il contient des sous-répertoires avec des fichiers `SKILL.md`\n2. **Vérifier les autorisations - Vérifier** que le Kit de développement logiciel (SDK) peut lire le répertoire\n3. **Vérifier SKILL.md format** : vérifiez que markdown est bien formé et que tout frontmatter YAML utilise une syntaxe valide\n4. **Activer la journalisation du débogage** : définissez `logLevel: \"debug\"` pour afficher les journaux de chargement des compétences\n\n### Conflits de compétences\n\nSi plusieurs compétences fournissent des instructions contradictoires :\n\n* Utiliser `disabledSkills` pour exclure les compétences en conflit\n* Réorganiser les répertoires de compétences pour éviter les chevauchements\n\n## Voir aussi\n\n* [Créez votre première application avec Copilot](/fr/copilot/how-tos/copilot-sdk/getting-started#create-custom-agents) - Définir des personnages d’IA spécialisés\n* [Créez votre première application avec Copilot](/fr/copilot/how-tos/copilot-sdk/getting-started#step-4-add-a-custom-tool) - Créer vos propres outils\n* [Utilisation de serveurs MCP avec le SDK GitHub Copilot](/fr/copilot/how-tos/copilot-sdk/features/mcp) - Connecter des fournisseurs d’outils externes"}