Freigeben über


Agent-Fähigkeiten

Agent-Fähigkeiten sind tragbare Pakete von Anweisungen, Skripts und Ressourcen, die Agents spezielle Funktionen und Domänenkenntnisse bieten. Fähigkeiten folgen einer offenen Spezifikation und implementieren ein progressives Offenlegungsmuster, sodass Agents nur den benötigten Kontext laden, wenn sie es benötigen.

Verwenden Sie Agentenkenntnisse, wenn Sie folgendes möchten:

  • Paketdomänenkompetenz – Erfassen Sie spezielle Kenntnisse (Spesenrichtlinien, rechtliche Workflows, Datenanalysepipelinen) als wiederverwendbare, tragbare Pakete.
  • Erweitern der Agent-Funktionen – Geben Sie Agents neue Fähigkeiten, ohne ihre Kernanweisungen zu ändern.
  • Sicherstellen der Konsistenz – Umwandeln von mehrstufigen Aufgaben in wiederholbare, auditierbare Workflows.
  • Interoperabilität aktivieren – Verwenden Sie die gleichen Fähigkeiten in verschiedenen Agent-Skills-kompatiblen Produkten.

Qualifikationsstruktur

Ein Skill ist ein Verzeichnis, das eine SKILL.md-Datei mit optionalen Unterverzeichnissen für Ressourcen enthält.

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 Format

Die SKILL.md Datei muss YAML-Frontmatter enthalten, gefolgt von Markdowninhalten:

---
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"
---
Feld Erforderlich Description
name Ja Max. 64 Zeichen. Nur Kleinbuchstaben, Zahlen und Bindestriche. Darf nicht mit einem Bindestrich beginnen oder enden oder aufeinander folgende Bindestriche enthalten. Muss mit dem namen des übergeordneten Verzeichnisses übereinstimmen.
description Ja Was die Fähigkeit tut und wann sie zu verwenden. Max. 1024 Zeichen. Sollte Schlüsselwörter enthalten, mit denen Agents relevante Aufgaben identifizieren können.
license Nein Lizenzname oder Verweis auf eine gebündelte Lizenzdatei.
compatibility Nein Max. 500 Zeichen. Gibt Umgebungsanforderungen an (beabsichtigtes Produkt, Systempakete, Netzwerkzugriff usw.).
metadata Nein Beliebige Schlüsselwertzuordnung für zusätzliche Metadaten.
allowed-tools Nein Durch Leerzeichen getrennte Liste der vorab genehmigten Werkzeuge, die die Fähigkeit verwenden kann. Die experimentelle Unterstützung kann zwischen Implementierungen von Agenten variieren.

Der Markdown-Text nach dem Frontmatter enthält die Fähigkeitsanweisungen, schrittweise Anleitungen, Beispiele für Eingaben und Ausgaben, allgemeine Randfälle oder Inhalte, die dem Agenten bei der Ausführung der Aufgabe helfen. Halten Sie SKILL.md unter 500 Zeilen, und verschieben Sie detailliertes Referenzmaterial in separate Dateien.

Progressive Offenlegung

Agentenfähigkeiten verwenden ein dreistufiges progressives Enthüllungsmuster, um die Nutzung des Kontexts zu minimieren.

  1. Werben (~100 Token pro Qualifikation) – Qualifikationsnamen und Beschreibungen werden zu Beginn jeder Ausführung in die Systemaufforderung eingefügt, sodass der Agent weiß, welche Fähigkeiten verfügbar sind.
  2. Load (< 5000 Token empfohlen) – Wenn eine Aufgabe mit der Domäne einer Fähigkeit übereinstimmt, ruft der Agent das load_skill Tool auf, um den vollständigen SKILL.md Textkörper mit detaillierten Anweisungen abzurufen.
  3. Ressourcen lesen (nach Bedarf) – Der Agent ruft das read_skill_resource Tool auf, um ergänzende Dateien (Verweise, Vorlagen, Ressourcen) nur bei Bedarf abzurufen.

Dieses Muster sorgt dafür, dass das Kontextfenster des Agents schlanker bleibt, während er Zugriff auf umfassende Domänenkenntnisse bei Bedarf erhält.

Bereitstellen von Fähigkeiten für einen Agenten

Das Agent Framework enthält einen Kompetenzanbieter, der Fähigkeiten aus Dateisystemverzeichnissen erkennt und sie als Kontextanbieter für Agents zur Verfügung stellt. Es durchsucht konfigurierte Pfade rekursiv (bis zu zwei Ebenen tief) nach SKILL.md Dateien, überprüft das Format und die Ressourcen und macht Tools für den Agent verfügbar: load_skill, read_skill_resourceund (wenn Skripts vorhanden sind). run_skill_script

Hinweis

Die Skriptausführung wird in C# noch nicht unterstützt und wird in einer zukünftigen Version hinzugefügt.

Grundlegende Einrichtung

Erstellen Sie einen Zeiger auf ein FileAgentSkillsProvider Verzeichnis, das Ihre Skills enthält, und fügen Sie es den Kontextanbietern des Agents hinzu.

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

Aufrufen des Agenten

Nach der Konfiguration ermittelt der Agent automatisch verfügbare Fähigkeiten und verwendet diese, wenn eine Aufgabe übereinstimmt:

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

Grundlegende Einrichtung

Erstellen Sie einen Zeiger auf ein SkillsProvider Verzeichnis, das Ihre Skills enthält, und fügen Sie es den Kontextanbietern des Agents hinzu.

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

Aufrufen des Agenten

Nach der Konfiguration ermittelt der Agent automatisch verfügbare Fähigkeiten und verwendet diese, wenn eine Aufgabe übereinstimmt:

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

Mehrere Qualifikationsverzeichnisse

Sie können mehrere Verzeichnisse durchsuchen, indem Sie eine Liste von Pfaden übergeben:

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

Jeder Pfad kann auf einen einzelnen Skill-Ordner (mit SKILL.md) oder einen übergeordneten Ordner mit Skill-Unterverzeichnissen verweisen. Der Anbieter durchsucht bis zu zwei Ebenen tief.

Benutzerdefinierte Systemaufforderung

Standardmäßig fügt der Kompetenzanbieter eine Systemaufforderung ein, die verfügbare Fähigkeiten auflistet und den Agenten anweist, diese zu nutzen sowie load_skill und read_skill_resource zu verwenden. Sie können diese Eingabeaufforderung anpassen:

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

Hinweis

Die benutzerdefinierte Vorlage muss einen {0} Platzhalter enthalten, in den die Qualifikationsliste eingefügt wird. Literale geschweifte Klammern müssen als {{ und }} maskiert werden.

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

Hinweis

Die benutzerdefinierte Vorlage muss einen {skills} Platzhalter enthalten, in dem die Qualifikationsliste eingefügt wird, und einen {runner_instructions} Platzhalter, in den skriptbezogene Anweisungen eingefügt werden.

Codedefinierte Fähigkeiten

Zusätzlich zu dateibasierten Fähigkeiten, die von SKILL.md Dateien ermittelt werden, können Sie Fähigkeiten vollständig in Python Code definieren. Codedefinierte Fähigkeiten sind nützlich, wenn:

  • Qualifikationsinhalte werden dynamisch generiert (z. B. lesen aus einer Datenbank oder Umgebung).
  • Sie möchten Qualifikationsdefinitionen zusammen mit dem Anwendungscode beibehalten, der sie verwendet.
  • Sie benötigen Ressourcen, die Logik zum Lesezeitpunkt ausführen, anstatt statische Dateien zu verarbeiten.

Grundlegende Codekompetenz

Erstellen Sie eine Skill Instanz mit einem Namen, einer Beschreibung und einem Anweisungsinhalt. Optional fügen Sie Instanzen mit statischem Inhalt an SkillResource :

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 Ressourcen

Verwenden Sie den @skill.resource Dekorateur, um eine Funktion als Ressource zu registrieren. Die Funktion wird jedes Mal aufgerufen, wenn der Agent die Ressource liest, sodass sie aktuelle Daten zurückgeben kann. Sowohl Synchronisierungsfunktionen als auch asynchrone Funktionen werden unterstützt:

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

Wenn der Dekorateur ohne Argumente verwendet wird (@skill.resource), wird der Funktionsname zum Ressourcennamen, und die Docstring wird zur Beschreibung. Hiermit @skill.resource(name="...", description="...") legen Sie sie explizit fest.

Codedefinierte Skripts

Verwenden Sie den @skill.script Dekorateur, um eine Funktion als ausführbares Skript auf einer Fähigkeit zu registrieren. Codedefinierte Skripts werden im Prozess ausgeführt und erfordern keinen Skriptausführer. Sowohl Synchronisierungsfunktionen als auch asynchrone Funktionen werden unterstützt:

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

Wenn der Dekorateur ohne Argumente verwendet wird (@skill.script), wird der Funktionsname zum Skriptnamen, und die Docstring wird zur Beschreibung. Die eingegebenen Parameter der Funktion werden automatisch in ein JSON-Schema konvertiert, das der Agent zum Übergeben von Argumenten verwendet.

Kombinieren von dateibasierten und codedefinierten Fähigkeiten

Übergeben Sie sowohl skill_paths als auch skills an ein einzelnes SkillsProvider. Dateibasierte Fähigkeiten werden zuerst entdeckt; Wenn eine codedefinierte Qualifikation denselben Namen wie eine vorhandene dateibasierte Qualifikation hat, wird die codedefinierte Qualifikation übersprungen:

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

Skriptausführung

Fähigkeiten können ausführbare Skripts enthalten, die der Agent über das run_skill_script Tool ausführt. Wie ein Skript ausgeführt wird, hängt davon ab, wie es definiert wurde:

  • Codedefinierte Skripts (registriert über @skill.script) werden in Prozess als direkte Funktionsaufrufe ausgeführt. Es ist kein Läufer erforderlich.
  • Dateibasierte Skripts (.py Dateien, die in Qualifikationsverzeichnissen ermittelt werden) erfordern einen SkillScriptRunner — alle aufrufbaren Übereinstimmungen (skill, script, args) -> Any — die bestimmt, wie das Skript ausgeführt wird (z. B. als lokaler Unterprozess).

Dateibasierte Skriptausführung

Um die Ausführung von dateibasierten Skripts zu aktivieren, übergeben Sie eine script_runner an SkillsProvider. Alle Synchronisierungs- oder asynchronen Aufrufe, die das SkillScriptRunner Protokoll erfüllen, können verwendet werden:

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

Der Läufer empfängt das aufgelöste Skill, SkillScript und ein optionales args Wörterbuch. Dateibasierte Skripts werden automatisch aus .py Dateien in Qualifikationsverzeichnissen ermittelt.

Warnung

Der obige Läufer wird nur zu Demonstrationszwecken bereitgestellt. Für die Verwendung in der Produktion sollten Sie Folgendes hinzufügen:

  • Sandboxing (z. B. Container, seccomp, oder firejail)
  • Ressourcengrenzwerte (CPU, Arbeitsspeicher, Timeout der Wanduhr)
  • Eingabeüberprüfung und Zulassungsauflistung von ausführbaren Skripts
  • Strukturierte Protokollierungen und Prüfpfade

Hinweis

Wenn skriptbasierte, dateibasierte Fähigkeiten bereitgestellt werden, aber keine script_runner festgelegt ist, löst SkillsProvider ein ValueError aus.

Skriptgenehmigung

Verwenden Sie require_script_approval=True auf SkillsProvider, um alle Skriptausführungen mit menschlicher Genehmigung umzuleiten. Anstatt sofort auszuführen, hält der Agent an und gibt Genehmigungsanforderungen zurück:

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)

Wenn ein Skript abgelehnt wird (approved=False), wird der Agent darüber informiert, dass der Benutzer abgelehnt wurde und entsprechend reagieren kann.

Bewährte Methoden für die Sicherheit

Agent Skills sollten wie jeder Drittanbietercode behandelt werden, den Sie in Ihr Projekt einbringen. Da Qualifikationsanweisungen in den Kontext des Agenten eingefügt werden – und Fähigkeiten können Skripts enthalten – das gleiche Maß an Überprüfung und Governance anwenden, das Sie auf eine Open-Source-Abhängigkeit anwenden würden, ist unerlässlich.

  • Überprüfen Sie vor der Verwendung – Lesen Sie alle Skill-Inhalte (SKILL.md, Skripts und Ressourcen) vor dem Einsatz. Stellen Sie sicher, dass das tatsächliche Verhalten eines Skripts mit der angegebenen Absicht übereinstimmt. Suchen Sie nach adversarialen Anweisungen, die versuchen, Sicherheitsrichtlinien zu umgehen, Daten zu exfiltrieren oder Agentkonfigurationsdateien zu ändern.
  • Quellvertrauensstellung – Installieren Sie nur Fähigkeiten von vertrauenswürdigen Autoren oder überprüften internen Mitwirkenden. Bevorzugen Sie Fähigkeiten mit eindeutiger Provenienz, Versionssteuerung und aktiver Wartung. Achten Sie auf Typosquatting bei Paketnamen, die beliebte Pakete nachahmen.
  • Sandboxing – Ausführung von Skripten mit ausführbaren Anweisungen in isolierten Umgebungen. Beschränken Sie den Zugriff auf Dateisystem, Netzwerk und Systemebene nur auf das, was die Qualifikation erfordert. Fordern Sie eine explizite Benutzerbestätigung vor dem Ausführen potenziell vertraulicher Vorgänge an.
  • Überwachung und Protokollierung – Aufzeichnen, welche Fähigkeiten geladen werden, welche Ressourcen gelesen werden und welche Skripts ausgeführt werden. Dadurch erhalten Sie einen Überwachungspfad, um das Verhalten des Agent zurück auf bestimmte Qualifikationsinhalte zu verfolgen, wenn etwas schief geht.

Gründe für die Verwendung von Fähigkeiten im Vergleich zu Workflows

Agent Skills and Agent Framework Workflows erweitern beide, was Agents tun können, aber sie funktionieren grundsätzlich auf unterschiedliche Weise. Wählen Sie den Ansatz aus, der Ihren Anforderungen am besten entspricht:

  • Steuerung – Mit einer Fähigkeit entscheidet die KI, wie die Anweisungen ausgeführt werden. Dies ist ideal, wenn der Agent kreativ oder adaptiv sein soll. Mit einem Workflow definieren Sie explizit den Ausführungspfad. Verwenden Sie Workflows, wenn Sie deterministisches, vorhersagbares Verhalten benötigen.
  • Resilienz – Eine Fähigkeit wird innerhalb einer einzigen Agentenrunde ausgeführt. Wenn ein Fehler auftritt, muss der gesamte Vorgang erneut ausgeführt werden. Workflows unterstützen Checkpointing, sodass sie nach einem Fehler vom letzten erfolgreichen Schritt fortgesetzt werden können. Wählen Sie Workflows aus, wenn die Kosten für die erneute Ausführung des gesamten Prozesses hoch sind.
  • Nebenwirkungen – Fähigkeiten sind geeignet, wenn Operationen idempotent oder risikoarm sind. Bevorzugen Sie Workflows, wenn Schritte Nebenwirkungen erzeugen (Senden von E-Mails, Aufladen von Zahlungen), die beim Wiederholen nicht wiederholt werden sollten.
  • Komplexität – Fähigkeiten eignen sich am besten für fokussierte Einzeldomänenaufgaben, die ein Agent verarbeiten kann. Workflows eignen sich besser für mehrstufige Geschäftsprozesse, die mehrere Agents, menschliche Genehmigungen oder integrationen externer Systeme koordinieren.

Tipp

Faustregel: Wenn Sie möchten, dass die KI herausfinden soll , wie sie eine Aufgabe erledigen kann, verwenden Sie eine Fähigkeit. Wenn Sie garantieren müssen , welche Schritte ausgeführt werden und in welcher Reihenfolge, verwenden Sie einen Workflow.

Nächste Schritte