Delen via


Agentvaardigheden

Agentvaardigheden zijn draagbare pakketten met instructies, scripts en resources die agents gespecialiseerde mogelijkheden en domeinexpertise bieden. Vaardigheden volgen een open specificatie en implementeren een progressief openbaarmakingspatroon, zodat agents alleen de context laden die ze nodig hebben, wanneer ze het nodig hebben.

Gebruik agentvaardigheden als u het volgende wilt doen:

  • Expertise van pakketdomein - Leg gespecialiseerde kennis vast (onkostenbeleid, juridische werkstromen, pijplijnen voor gegevensanalyse) als herbruikbare, draagbare pakketten.
  • Mogelijkheden van agents uitbreiden : geef agents nieuwe mogelijkheden zonder de belangrijkste instructies te wijzigen.
  • Consistentie garanderen : verander taken met meerdere stappen in herhaalbare, controleerbare werkstromen.
  • Interoperabiliteit inschakelen : gebruik dezelfde vaardigheid voor verschillende producten die compatibel zijn met agentvaardigheden.

Vaardigheidsstructuur

Een vaardigheid is een directory met een SKILL.md bestand en optionele submappen voor resources.

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

SKILL.md-formaat

Het SKILL.md bestand moet YAML-frontmatter bevatten, gevolgd door Markdown-inhoud:

---
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"
---
Veld Verplicht Description
name Ja Maximaal 64 tekens. Alleen kleine letters, cijfers en koppeltekens. Mag niet beginnen of eindigen met een afbreekstreepje of opeenvolgende afbreekstreepjes bevatten. Moet overeenkomen met de naam van de bovenliggende map.
description Ja Wat de vaardigheid doet en wanneer u deze moet gebruiken. Maximaal 1024 tekens. Moet trefwoorden bevatten waarmee agents relevante taken kunnen identificeren.
license Nee. Licentienaam of verwijzing naar een gebundeld licentiebestand.
compatibility Nee. Maximaal 500 tekens. Geeft de omgevingsvereisten aan (bedoeld product, systeempakketten, netwerktoegang, enzovoort).
metadata Nee. Willekeurige sleutelwaardetoewijzing voor aanvullende metagegevens.
allowed-tools Nee. Door spaties gescheiden lijst met vooraf goedgekeurde hulpmiddelen die de vaardigheid kan gebruiken. Experimenteel: ondersteuning kan variëren tussen agent-implementaties.

De Markdown-hoofdtekst na de frontmatter bevat de vaardigheidsinstructies, stapsgewijze richtlijnen, voorbeelden van invoer en uitvoer, algemene randcases of inhoud waarmee de agent de taak kan uitvoeren. Houd SKILL.md onder de 500 regels en verplaats gedetailleerd referentiemateriaal naar aparte bestanden.

Progressieve openbaarmaking

Agentvaardigheden gebruiken een patroon voor progressieve openbaarmaking in drie fasen om het contextgebruik te minimaliseren:

  1. Adverteren (~100 tokens per vaardigheid): namen en beschrijvingen van vaardigheden worden aan het begin van elke uitvoering in de systeemprompt geïnjecteerd, zodat de agent weet welke vaardigheden beschikbaar zijn.
  2. Laden (< 5000 tokens aanbevolen): wanneer een taak overeenkomt met het domein van een vaardigheid, roept de agent het load_skill hulpprogramma aan om de volledige SKILL.md hoofdtekst op te halen met gedetailleerde instructies.
  3. Resources lezen (indien nodig): de agent roept het read_skill_resource hulpprogramma aan om aanvullende bestanden (verwijzingen, sjablonen, assets) op te halen wanneer dat nodig is.

Dit patroon houdt het contextvenster van de agent compact, terwijl de agent op aanvraag toegang krijgt tot diepgaande domeinkennis.

Vaardigheden bieden aan een agent

Het Agent Framework bevat een provider van vaardigheden die vaardigheden detecteert uit bestandssysteemmappen en deze beschikbaar maakt voor agents als contextprovider. Het doorzoekt geconfigureerde paden recursief (maximaal twee niveaus diep) voor SKILL.md bestanden, valideert de indeling en resources en maakt hulpprogramma's beschikbaar voor de agent: load_skill, read_skill_resourceen (wanneer er scripts aanwezig zijn) run_skill_script.

Opmerking

De uitvoering van scripts wordt nog niet ondersteund in C# en wordt toegevoegd in een toekomstige release.

Basisinstallatie

Maak een FileAgentSkillsProvider verwijzing naar een map met uw vaardigheden en voeg deze toe aan de contextproviders van de 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],
    });

De agent aanroepen

Zodra de agent is geconfigureerd, detecteert de agent automatisch beschikbare vaardigheden en gebruikt deze wanneer een taak overeenkomt:

// 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);

Basisinstallatie

Maak een SkillsProvider verwijzing naar een map met uw vaardigheden en voeg deze toe aan de contextproviders van de 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],
)

De agent aanroepen

Zodra de agent is geconfigureerd, detecteert de agent automatisch beschikbare vaardigheden en gebruikt deze wanneer een taak overeenkomt:

# 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)

Meerdere vaardighedencatalogi

U kunt meerdere mappen doorzoeken door een lijst met paden door te geven:

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",
    ]
)

Elk pad kan verwijzen naar een afzonderlijke vaardigheidsmap (met een SKILL.md) of een bovenliggende map met submappen voor vaardigheden. De provider doorzoekt maximaal twee niveaus diep.

Aangepaste systeemprompt

Standaard injecteert de provider van vaardigheden een systeemprompt waarin de beschikbare vaardigheden worden vermeld en wordt de agent geïnstrueerd om te gebruiken load_skill en read_skill_resource. U kunt deze prompt aanpassen:

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.
            """
    });

Opmerking

De aangepaste sjabloon moet een {0} tijdelijke aanduiding bevatten waarin de lijst met vaardigheden wordt ingevoegd. Letterlijke accolades moeten worden ontsnapt met {{ en }}.

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."
    ),
)

Opmerking

De aangepaste sjabloon moet een {skills} tijdelijke aanduiding bevatten waarin de lijst met vaardigheden wordt ingevoegd en een {runner_instructions} tijdelijke aanduiding waarin scriptgerelateerde instructies worden ingevoegd.

Door code gedefinieerde vaardigheden

Naast op bestanden gebaseerde vaardigheden die zijn gedetecteerd uit SKILL.md bestanden, kunt u vaardigheden volledig definiëren in Python code. Door code gedefinieerde vaardigheden zijn handig wanneer:

  • Inhoud van vaardigheden wordt dynamisch gegenereerd (bijvoorbeeld lezen uit een database of omgeving).
  • U wilt vaardigheidsdefinities naast de toepassingscode die deze gebruikt, behouden.
  • U hebt resources nodig die logica op leestijd uitvoeren in plaats van statische bestanden te leveren.

Basiscodevaardigheden

Maak een Skill exemplaar met een naam, beschrijving en instructie-inhoud. Optioneel SkillResource exemplaren toevoegen met statische inhoud:

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])

Dynamische middelen

Gebruik de @skill.resource decorator om een functie als resource te registreren. De functie wordt aangeroepen elke keer dat de agent de resource leest, zodat het kan zorgen voor actuele gegevens. Synchronisatie- en asynchrone functies worden ondersteund:

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)"

Wanneer de decorator zonder argumenten wordt gebruikt (@skill.resource), wordt de naam van de functie de resourcenaam en wordt de docstring de beschrijving. Gebruik @skill.resource(name="...", description="...") dit om ze expliciet in te stellen.

Met code gedefinieerde scripts

Gebruik de @skill.script decorator om een functie te registreren als een uitvoerbaar script voor een vaardigheid. Met code gedefinieerde scripts worden in het proces uitgevoerd en is geen scriptuitvoering vereist. Synchronisatie- en asynchrone functies worden ondersteund:

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})

Wanneer de decorator zonder argumenten wordt gebruikt (@skill.script), wordt de naam van de functie de scriptnaam en wordt de docstring de beschrijving. De getypte parameters van de functie worden automatisch geconverteerd naar een JSON-schema dat de agent gebruikt om argumenten door te geven.

Combinatie van vaardigheden op basis van bestanden en code

Geef zowel skill_paths als skills door aan één SkillsProvider. Vaardigheden op basis van bestanden worden eerst ontdekt; als een door code gedefinieerde vaardigheid dezelfde naam heeft als een bestaande op bestanden gebaseerde vaardigheid, wordt de door code gedefinieerde vaardigheid overgeslagen:

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],
)

Scriptuitvoering

Vaardigheden kunnen uitvoerbare scripts bevatten die door de agent worden uitgevoerd via het run_skill_script hulpprogramma. Hoe een script wordt uitgevoerd, is afhankelijk van hoe het is gedefinieerd:

  • Met code gedefinieerde scripts (geregistreerd via @skill.script) worden in het proces uitgevoerd als directe functie-aanroepen. Er is geen hardloper nodig.
  • Bestandsgebaseerde scripts (bestanden gedetecteerd in skill-mappen) vereisen een callable — elke aanroepbare functie die overeenkomt met — dat bepaalt hoe het script wordt uitgevoerd (bijvoorbeeld als een lokaal subproces).

Scriptuitvoering op basis van bestanden

Als u het uitvoeren van op bestanden gebaseerde scripts wilt inschakelen, geeft u een script_runner door aan SkillsProvider. Elke synchrone of asynchrone oproep die voldoet aan het SkillScriptRunner protocol kan worden gebruikt.

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,
)

De runner ontvangt de opgeloste Skill, SkillScripten een optionele args woordenlijst. Bestandsgebaseerde scripts worden automatisch gedetecteerd uit .py bestanden in vaardigheidsmappen.

Waarschuwing

De bovenstaande runner is alleen bedoeld voor demonstratiedoeleinden. Voor productiegebruik kunt u overwegen het volgende toe te voegen:

  • Sandboxing (bijvoorbeeld containers, seccomp, of firejail)
  • Resourcelimieten (CPU, geheugen, time-out voor wandklok)
  • Invoervalidatie en acceptatielijst met uitvoerbare scripts
  • Gestructureerde logboekregistratie en audittrails

Opmerking

Als er op bestanden gebaseerde vaardigheden met scripts worden opgegeven, maar er geen script_runner is ingesteld, veroorzaakt SkillsProvider een ValueError.

Goedkeuring van script

Gebruik require_script_approval=True op SkillsProvider om alle uitvoering van scripts achter menselijke goedkeuring te plaatsen. In plaats van onmiddellijk uit te voeren, onderbreekt en retourneert de agent goedkeuringsaanvragen:

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)

Wanneer een script wordt geweigerd (approved=False), wordt de agent geïnformeerd dat de gebruiker heeft geweigerd en dienovereenkomstig kan reageren.

Aanbevolen procedures voor beveiliging

Agent Skills dienen te worden behandeld als code van derden die u in uw project invoert. Omdat vaardigheidsinstructies worden geïnjecteerd in de context van de agent, en vaardigheden kunnen scripts bevatten, is het toepassen van hetzelfde beoordelingsniveau en governance essentieel voor een opensource-afhankelijkheid.

  • Controleer voor gebruik : lees alle vaardigheidsinhoud (SKILL.md, scripts en resources) voordat u implementeert. Controleer of het werkelijke gedrag van een script overeenkomt met de vermelde intentie. Controleer op instructies met kwade bedoelingen die proberen veiligheidsrichtlijnen te omzeilen, data te exfiltreren of agentconfiguratiebestanden te wijzigen.
  • Bronvertrouwen : installeer alleen vaardigheden van vertrouwde auteurs of gecontroleerde interne inzenders. Geef de voorkeur aan vaardigheden met duidelijke herkomst, versiebeheer en actief onderhoud. Kijk naar getypeerde vaardigheidsnamen die populaire pakketten nabootsen.
  • Sandboxing : voer vaardigheden uit die uitvoerbare scripts bevatten in geïsoleerde omgevingen. Beperk het bestandssysteem, het netwerk en het systeemniveau tot alleen wat de vaardigheid vereist. Expliciete gebruikersbevestiging vereisen voordat mogelijk gevoelige bewerkingen worden uitgevoerd.
  • Controle en logboekregistratie : noteer welke vaardigheden worden geladen, welke resources worden gelezen en welke scripts worden uitgevoerd. Dit geeft u een audit trail om het gedrag van agents te traceren naar specifieke vaardigheden als er iets misgaat.

Wanneer u vaardigheden versus werkstromen gebruikt

AgentVaardigheden en Agent Framework-werkstromen breiden beide uit wat agents kunnen doen, maar ze werken op fundamenteel verschillende manieren. Kies de methode die het beste overeenkomt met uw vereisten:

  • Controle : met een vaardigheid bepaalt de AI hoe de instructies moeten worden uitgevoerd. Dit is ideaal als u wilt dat de agent creatief of adaptief is. Met een werkstroom definieert u expliciet het uitvoeringspad. Gebruik werkstromen wanneer u deterministisch, voorspelbaar gedrag nodig hebt.
  • Veerkracht — Een vaardigheid wordt voltooid binnen één beurt van een agent. Als er iets mislukt, moet de hele bewerking opnieuw worden uitgevoerd. Werkstromen ondersteunen controlepunten, zodat ze kunnen hervatten vanaf de laatste geslaagde stap na een fout. Kies werkstromen wanneer de kosten voor het opnieuw uitvoeren van het hele proces hoog zijn.
  • Bijwerkingen — Vaardigheden zijn geschikt wanneer bewerkingen idempotent zijn of een laag risico vormen. Geef de voorkeur aan werkstromen wanneer stappen bijwerkingen opleveren (e-mailberichten verzenden, betalingen in rekening brengen) die niet moeten worden herhaald bij opnieuw proberen.
  • Complexiteit : vaardigheden zijn het beste voor gerichte taken met één domein die door één agent kunnen worden verwerkt. Werkstromen zijn beter geschikt voor bedrijfsprocessen met meerdere stappen die meerdere agents, menselijke goedkeuringen of externe systeemintegraties coördineren.

Aanbeveling

Als u wilt dat de AI erachter komt hoe een taak moet worden uitgevoerd, gebruikt u een vaardigheid. Als u wilt garanderen welke stappen worden uitgevoerd en in welke volgorde, gebruikt u een werkstroom.

Volgende stappen