Partager via


Compétences de l’agent

Les compétences de l’agent sont des packages portables d’instructions, de scripts et de ressources qui donnent aux agents des fonctionnalités spécialisées et une expertise de domaine. Les compétences suivent une spécification ouverte et implémentent un modèle de divulgation progressif afin que les agents chargent uniquement le contexte dont ils ont besoin, quand ils en ont besoin.

Utilisez les compétences de l’agent lorsque vous souhaitez :

  • Expertise de package dans le domaine — Capturez des connaissances spécialisées (stratégies de dépenses; flux de travail juridiques; pipelines d'analyse des données) sous forme de paquets réutilisables et portables.
  • Étendre les fonctionnalités de l’agent : donnez aux agents de nouvelles capacités sans modifier leurs instructions principales.
  • Garantir la cohérence : transformez les tâches en plusieurs étapes en flux de travail reproductibles et auditables.
  • Activer l’interopérabilité : réutilisez la même compétence entre différents produits compatibles avec les compétences de l’agent.

Structure des compétences

Une compétence est un répertoire contenant un SKILL.md fichier avec des sous-répertoires facultatifs pour les ressources :

expense-report/
├── SKILL.md                          # Required — frontmatter + instructions
├── scripts/
│   └── validate.py                   # Executable code agents can run
├── references/
│   └── POLICY_FAQ.md                 # Reference documents loaded on demand
└── assets/
    └── expense-report-template.md    # Templates and static resources

format SKILL.md

Le SKILL.md fichier doit contenir un frontmatter YAML suivi du contenu markdown :

---
name: expense-report
description: File and validate employee expense reports according to company policy. Use when asked about expense submissions, reimbursement rules, or spending limits.
license: Apache-2.0
compatibility: Requires python3
metadata:
  author: contoso-finance
  version: "2.1"
---
Champ Obligatoire Descriptif
name Oui 64 caractères maximum. Lettres minuscules, chiffres et traits d’union uniquement. Ne doit pas commencer ou se terminer par un trait d’union ou contenir des traits d’union consécutifs. Doit correspondre au nom du répertoire parent.
description Oui Que fait la compétence et quand l’utiliser. Nombre maximal de 1024 caractères. Doit inclure des mots clés qui aident les agents à identifier les tâches pertinentes.
license Non Nom de la licence ou référence à un fichier de licence groupé.
compatibility Non 500 caractères maximum. Indique la configuration requise pour l’environnement (produit prévu, packages système, accès réseau, etc.).
metadata Non Mappage de clé-valeur arbitraire pour des métadonnées supplémentaires.
allowed-tools Non Liste séparée par des espaces des outils pré-approuvés que la capacité peut utiliser. Expérimental : la prise en charge peut varier entre les implémentations de l’agent.

Le corps markdown après le frontmatter contient les instructions pour la compétence : instructions pas à pas, exemples d’entrées et de sorties, cas limites courants ou tout contenu qui aide l’agent à effectuer la tâche. Conservez moins de 500 lignes et déplacez SKILL.md des documents de référence détaillés vers des fichiers distincts.

Divulgation progressive

Les compétences de l’agent utilisent un modèle de divulgation progressive en trois étapes pour réduire l’utilisation du contexte :

  1. Publier (~100 jetons par compétence) : les noms et descriptions des compétences sont injectés dans l’invite système au début de chaque exécution, de sorte que l’agent sait quelles compétences sont disponibles.
  2. Charger ( 5 000 jetons recommandés) :< lorsqu’une tâche correspond au domaine d’une compétence, l’agent appelle l’outil load_skill pour récupérer le corps complet SKILL.md avec des instructions détaillées.
  3. Lire les ressources (si nécessaire) : l’agent appelle l’outil read_skill_resource pour récupérer des fichiers supplémentaires (références, modèles, ressources) uniquement si nécessaire.

Ce schéma maintient la fenêtre de contexte de l'agent allégée tout en lui donnant accès à une connaissance approfondie du domaine à la demande.

Fournir des compétences à un agent

Agent Framework inclut un fournisseur de compétences qui découvre les compétences des répertoires du système de fichiers et les met à la disposition des agents en tant que fournisseur de contexte. Il recherche les chemins configurés de manière récursive (jusqu’à deux niveaux de profondeur) pour les SKILL.md fichiers, valide leur format et leurs ressources et expose les outils à l’agent : load_skill, read_skill_resourceet (quand des scripts sont présents). run_skill_script

Note

L’exécution de script n’est pas encore prise en charge en C# et sera ajoutée dans une prochaine version.

Configuration de base

Créez un FileAgentSkillsProvider pointant vers un répertoire contenant vos compétences et ajoutez-le aux fournisseurs de contexte de l’agent.

using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.Agents.AI;

// Discover skills from the 'skills' directory
var skillsProvider = new FileAgentSkillsProvider(
    skillPath: Path.Combine(AppContext.BaseDirectory, "skills"));

// Create an agent with the skills provider
AIAgent agent = new AzureOpenAIClient(
    new Uri(endpoint), new DefaultAzureCredential())
    .GetResponsesClient(deploymentName)
    .AsAIAgent(new ChatClientAgentOptions
    {
        Name = "SkillsAgent",
        ChatOptions = new()
        {
            Instructions = "You are a helpful assistant.",
        },
        AIContextProviders = [skillsProvider],
    });

Invocation de l’agent

Une fois configuré, l’agent découvre automatiquement les compétences disponibles et les utilise lorsqu’une tâche correspond :

// The agent loads the expense-report skill and reads the FAQ resource
AgentResponse response = await agent.RunAsync(
    "Are tips reimbursable? I left a 25% tip on a taxi ride.");
Console.WriteLine(response.Text);

Configuration de base

Créez un SkillsProvider pointant vers un répertoire contenant vos compétences et ajoutez-le aux fournisseurs de contexte de l’agent.

from pathlib import Path
from agent_framework import SkillsProvider
from agent_framework.azure import AzureOpenAIChatClient
from azure.identity.aio import AzureCliCredential

# Discover skills from the 'skills' directory
skills_provider = SkillsProvider(
    skill_paths=Path(__file__).parent / "skills"
)

# Create an agent with the skills provider
agent = AzureOpenAIChatClient(credential=AzureCliCredential()).as_agent(
    name="SkillsAgent",
    instructions="You are a helpful assistant.",
    context_providers=[skills_provider],
)

Invocation de l’agent

Une fois configuré, l’agent découvre automatiquement les compétences disponibles et les utilise lorsqu’une tâche correspond :

# The agent loads the expense-report skill and reads the FAQ resource
response = await agent.run(
    "Are tips reimbursable? I left a 25% tip on a taxi ride."
)
print(response.text)

Répertoires de compétences multiples

Vous pouvez rechercher plusieurs répertoires en passant une liste de chemins d’accès :

var skillsProvider = new FileAgentSkillsProvider(
    skillPaths: [
        Path.Combine(AppContext.BaseDirectory, "company-skills"),
        Path.Combine(AppContext.BaseDirectory, "team-skills"),
    ]);
skills_provider = SkillsProvider(
    skill_paths=[
        Path(__file__).parent / "company-skills",
        Path(__file__).parent / "team-skills",
    ]
)

Chaque chemin d’accès peut pointer vers un dossier de compétences individuel (contenant un SKILL.md) ou un dossier parent avec des sous-répertoires de compétence. Le fournisseur recherche jusqu’à deux niveaux de profondeur.

Invite système personnalisé

Par défaut, le fournisseur de compétences injecte une invite système qui répertorie les compétences disponibles et indique à l’agent d’utiliser load_skill et read_skill_resource. Vous pouvez personnaliser cette invite :

var skillsProvider = new FileAgentSkillsProvider(
    skillPath: Path.Combine(AppContext.BaseDirectory, "skills"),
    options: new FileAgentSkillsProviderOptions
    {
        SkillsInstructionPrompt = """
            You have skills available. Here they are:
            {0}
            Use the `load_skill` function to get skill instructions.
            Use the `read_skill_resource` function to read skill files.
            """
    });

Note

Le modèle personnalisé doit contenir un {0} espace réservé où la liste de compétences est insérée. Les accolades littérales doivent être échappées en utilisant {{ et }}.

skills_provider = SkillsProvider(
    skill_paths=Path(__file__).parent / "skills",
    instruction_template=(
        "You have skills available. Here they are:\n{skills}\n"
        "Use the `load_skill` function to get skill instructions.\n"
        "Use the `read_skill_resource` function to read skill files."
    ),
)

Note

Le modèle personnalisé doit contenir un {skills} espace réservé où la liste de compétences est insérée et un {runner_instructions} espace réservé où les instructions liées au script sont insérées.

Compétences définies par le code

En plus des compétences basées sur des fichiers découvertes à partir de fichiers SKILL.md, vous pouvez définir des compétences entièrement dans Python code. Les compétences définies par le code sont utiles quand :

  • Le contenu de compétence est généré dynamiquement (par exemple, lecture à partir d’une base de données ou d’un environnement).
  • Vous souhaitez conserver les définitions de compétences en même temps que le code d’application qui les utilise.
  • Vous avez besoin de ressources qui exécutent la logique au moment de la lecture plutôt que de servir des fichiers statiques.

Compétence de code de base

Créez une instance avec un Skill nom, une description et un contenu d’instruction. Attachez éventuellement des SkillResource instances avec du contenu statique :

from textwrap import dedent
from agent_framework import Skill, SkillResource, SkillsProvider

code_style_skill = Skill(
    name="code-style",
    description="Coding style guidelines and conventions for the team",
    content=dedent("""\
        Use this skill when answering questions about coding style,
        conventions, or best practices for the team.
    """),
    resources=[
        SkillResource(
            name="style-guide",
            content=dedent("""\
                # Team Coding Style Guide
                - Use 4-space indentation (no tabs)
                - Maximum line length: 120 characters
                - Use type annotations on all public functions
            """),
        ),
    ],
)

skills_provider = SkillsProvider(skills=[code_style_skill])

Ressources dynamiques

Utilisez le @skill.resource décorateur pour inscrire une fonction en tant que ressource. La fonction est appelée chaque fois que l’agent lit la ressource, afin qu’elle puisse retourner des données up-to-date. Les fonctions de synchronisation et asynchrone sont prises en charge :

import os
from agent_framework import Skill

project_info_skill = Skill(
    name="project-info",
    description="Project status and configuration information",
    content="Use this skill for questions about the current project.",
)

@project_info_skill.resource
def environment() -> Any:
    """Get current environment configuration."""
    env = os.environ.get("APP_ENV", "development")
    region = os.environ.get("APP_REGION", "us-east-1")
    return f"Environment: {env}, Region: {region}"

@project_info_skill.resource(name="team-roster", description="Current team members")
def get_team_roster() -> Any:
    """Return the team roster."""
    return "Alice Chen (Tech Lead), Bob Smith (Backend Engineer)"

Lorsque le décorateur est utilisé sans arguments (@skill.resource), le nom de la fonction devient le nom de la ressource et la documentation devient la description. Permet @skill.resource(name="...", description="...") de les définir explicitement.

Scripts définis par le code

Utilisez le décorateur @skill.script pour enregistrer une fonction en tant que script exécutable sur une fonctionnalité. Les scripts définis par le code s’exécutent en cours et ne nécessitent pas d’exécuteur de script. Les fonctions de synchronisation et asynchrone sont prises en charge :

from agent_framework import Skill

unit_converter_skill = Skill(
    name="unit-converter",
    description="Convert between common units using a conversion factor",
    content="Use the convert script to perform unit conversions.",
)

@unit_converter_skill.script(name="convert", description="Convert a value: result = value × factor")
def convert_units(value: float, factor: float) -> str:
    """Convert a value using a multiplication factor."""
    import json
    result = round(value * factor, 4)
    return json.dumps({"value": value, "factor": factor, "result": result})

Lorsque le décorateur est utilisé sans arguments (@skill.script), le nom de la fonction devient le nom du script et la documentation devient la description. Les paramètres typés de la fonction sont automatiquement convertis en schéma JSON que l’agent utilise pour passer des arguments.

Combinaison de compétences basées sur des fichiers et définies par le code

Passez les deux skill_paths et skills à un seul SkillsProvider. Les compétences basées sur des fichiers sont découvertes en premier ; si une compétence définie par le code porte le même nom qu’une compétence existante basée sur un fichier, la compétence définie par le code est ignorée :

from pathlib import Path
from agent_framework import Skill, SkillsProvider

my_skill = Skill(
    name="my-code-skill",
    description="A code-defined skill",
    content="Instructions for the skill.",
)

skills_provider = SkillsProvider(
    skill_paths=Path(__file__).parent / "skills",
    skills=[my_skill],
)

Exécution des scripts

Les compétences peuvent inclure des scripts exécutables exécutés par l’agent via l’outil run_skill_script . La façon dont un script s’exécute dépend de la façon dont il a été défini :

  • Les scripts définis par le code (inscrits via @skill.script) s’exécutent en processus sous forme d’appels de fonction directs. Aucun coureur n’est nécessaire.
  • Les scripts basés sur des fichiers (.py fichiers découverts dans les répertoires de compétences) nécessitent un SkillScriptRunner — tout appelable correspondant à (skill, script, args) -> Any — qui détermine comment le script est exécuté (par exemple, en tant que sous-processus local).

Exécution de script basé sur des fichiers

Pour activer l’exécution de scripts basés sur des fichiers, passez-à script_runner à SkillsProvider. Toute synchronisation ou appel asynchrone qui satisfait le SkillScriptRunner protocole peut être utilisé :

from pathlib import Path
from agent_framework import Skill, SkillScript, SkillsProvider

def my_runner(skill: Skill, script: SkillScript, args: dict | None = None) -> str:
    """Run a file-based script as a subprocess."""
    import subprocess, sys
    cmd = [sys.executable, str(Path(skill.path) / script.path)]
    if args:
        for key, value in args.items():
            if value is not None:
                cmd.extend([f"--{key}", str(value)])
    result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
    return result.stdout.strip()

skills_provider = SkillsProvider(
    skill_paths=Path(__file__).parent / "skills",
    script_runner=my_runner,
)

L’exécuteur reçoit Skill résolu, SkillScript, et un dictionnaire facultatif args. Les scripts basés sur des fichiers sont automatiquement détectés à partir de .py fichiers dans les répertoires de compétences.

Avertissement

L'outil d'exécution ci-dessus est fourni uniquement à des fins de démonstration. Pour une utilisation en production, envisagez d’ajouter :

  • Bac à sable (par exemple, conteneurs, seccomp, ou firejail)
  • Limites des ressources (processeur, mémoire, délai d’expiration de l’horloge murale)
  • Validation des entrées et liste d'autorisation des scripts exécutables
  • Pistes de journalisation et d’audit structurées

Note

Si les compétences basées sur des fichiers avec des scripts sont fournies, mais qu'aucun script_runner n'est défini, SkillsProvider lève un ValueError.

Approbation de script

Utilisez require_script_approval=True sur SkillsProvider pour contrôler l'exécution de tous les scripts après l'approbation humaine. Au lieu d’exécuter immédiatement, l’agent suspend et retourne des demandes d’approbation :

from agent_framework import Agent, Skill, SkillsProvider

# Create provider with approval enabled
skills_provider = SkillsProvider(
    skills=[my_skill],
    require_script_approval=True,
)

# Run the agent — script calls pause for approval
result = await agent.run("Deploy version 2.5.0 to production", session=session)

# Handle approval requests
while result.user_input_requests:
    for request in result.user_input_requests:
        print(f"Script: {request.function_call.name}")
        print(f"Args: {request.function_call.arguments}")

        approval = request.to_function_approval_response(approved=True)
        result = await agent.run(approval, session=session)

Lorsqu’un script est rejeté (approved=False), l’agent est informé que l’utilisateur a refusé et peut répondre en conséquence.

Bonnes pratiques de sécurité

Les compétences de l’agent doivent être traitées comme tout code tiers que vous apportez dans votre projet. Étant donné que les instructions de compétence sont injectées dans le contexte de l’agent , et que les compétences peuvent inclure des scripts, l’application du même niveau de révision et de gouvernance que vous feriez à une dépendance open source est essentielle.

  • Passez en revue avant l’utilisation : lisez tout le contenu des compétences (SKILL.md, les scripts et les ressources) avant de déployer. Vérifiez que le comportement réel d’un script correspond à son intention indiquée. Recherchez les instructions contradictoires qui tentent de contourner les instructions de sécurité, d’exfiltrer les données ou de modifier les fichiers de configuration de l’agent.
  • Approbation de la source : installez uniquement les compétences des auteurs approuvés ou des contributeurs internes approuvés. Préférez les compétences avec une provenance claire, un contrôle de version et une maintenance active. Surveillez les noms de compétences typosquatés qui imitent les packages populaires.
  • Sandboxing : exécutez des compétences qui incluent des scripts exécutables dans des environnements isolés. Limitez l’accès au système de fichiers, au réseau et au niveau du système uniquement à ce dont la compétence a besoin. Exiger une confirmation explicite de l’utilisateur avant d’exécuter des opérations potentiellement sensibles.
  • Audit et journalisation : enregistrez les compétences chargées, les ressources lues et les scripts exécutés. Cela vous donne une piste d’audit pour tracer le comportement de l’agent vers un contenu de compétence spécifique si quelque chose ne va pas.

Quand utiliser des compétences et des workflows

Les compétences de l'agent et les flux de travail du cadre de l'agent étendent tous deux les capacités des agents, mais ils fonctionnent de manière fondamentalement différente. Choisissez l’approche qui correspond le mieux à vos besoins :

  • Contrôle : avec une compétence, l’IA décide comment exécuter les instructions. C’est idéal lorsque vous souhaitez que l’agent soit créatif ou adaptatif. Avec un flux de travail, vous définissez explicitement le chemin d’exécution. Utilisez des flux de travail quand vous avez besoin d’un comportement déterministe et prévisible.
  • Résilience — Une compétence qui s'exécute au cours d'un seul tour d'un agent. En cas d’échec, l’opération entière doit être retentée. Les flux de travail prennent en charge les points de contrôle, afin qu’ils puissent reprendre à partir de la dernière étape réussie après un échec. Choisissez des flux de travail lorsque le coût de réexécution de l’ensemble du processus est élevé.
  • Effets secondaires : les compétences conviennent lorsque les opérations sont idempotentes ou à faible risque. Préférez les flux de travail lorsque les étapes produisent des effets secondaires (envoi d’e-mails, paiements de facturation) qui ne doivent pas être répétés lors de nouvelles tentatives.
  • Complexité : les compétences sont les meilleures pour les tâches prioritaires et à domaine unique qu’un agent peut gérer. Les flux de travail sont mieux adaptés aux processus métier en plusieurs étapes qui coordonnent plusieurs agents, approbations humaines ou intégrations de système externe.

Conseil / Astuce

En règle générale : si vous souhaitez que l’IA détermine comment accomplir une tâche, utilisez une compétence. Si vous devez garantir les étapes qui s’exécutent et dans quel ordre, utilisez un flux de travail.

Prochaines étapes