Dela via


Agentkunskaper

Agentkunskaper är portabla paket med instruktioner, skript och resurser som ger agenter specialiserade funktioner och domänexpertis. Färdigheter följer en öppen specifikation och implementerar ett progressivt avslöjandemönster så att agenter bara läser in den kontext de behöver, när de behöver den.

Använd agentkunskaper när du vill:

  • Expertkunskaper om paketdomäner – Samla in specialiserad kunskap (kostnadsprinciper, juridiska arbetsflöden, pipelines för dataanalys) som återanvändbara, portabla paket.
  • Utöka agentfunktionerna – Ge agenter nya förmågor utan att ändra sina grundläggande instruktioner.
  • Säkerställa konsekvens – Omvandla flerstegsaktiviteter till repeterbara, granskningsbara arbetsflöden.
  • Aktivera samverkan – Återanvänd samma kunskaper i olika Agent Skills-kompatibla produkter.

Kompetensstruktur

En färdighet är en katalog som innehåller en SKILL.md fil med valfria underkataloger för resurser:

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

Filen SKILL.md måste innehålla YAML-frontmatter följt av markdown-innehåll:

---
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"
---
Fält Krävs Description
name Ja Max 64 tecken. Endast gemener, siffror och bindestreck. Får inte starta eller sluta med ett bindestreck eller innehålla bindestreck i följd. Måste matcha det överordnade katalognamnet.
description Ja Vad skickligheten gör och när du ska använda den. Max 1 024 tecken. Bör innehålla nyckelord som hjälper agenter att identifiera relevanta uppgifter.
license Nej. Licensnamn eller referens till en paketerad licensfil.
compatibility Nej. Max 500 tecken. Anger miljökrav (avsedd produkt, systempaket, nätverksåtkomst osv.).
metadata Nej. Godtycklig nyckelvärdesmappning för ytterligare metadata.
allowed-tools Nej. Utrymmesavgränsad lista över förgodkända verktyg som färdigheten kan använda. Experimentell – stödet kan variera mellan agentimplementeringar.

Markdown-brödtexten efter frontmattern innehåller kunskapsinstruktionerna – stegvis vägledning, exempel på indata och utdata, vanliga gränsfall eller innehåll som hjälper agenten att utföra uppgiften. Behåll SKILL.md under 500 rader och flytta detaljerat referensmaterial till separata filer.

Progressivt avslöjande

Agentkunskaper använder ett progressivt avslöjandemönster i tre steg för att minimera kontextanvändningen:

  1. Annonsera (~100 token per färdighet) – Färdighetsnamn och beskrivningar injiceras i systemprompten i början av varje körning, så att agenten vet vilka färdigheter som är tillgängliga.
  2. Läs in (< 5 000 tokens rekommenderas) – När en uppgift matchar en färdighetsdomän kallar agenten load_skill verktyget för att hämta hela SKILL.md-innehållet med detaljerade instruktioner.
  3. Läs resurser (efter behov) – Agenten read_skill_resource anropar verktyget för att hämta tilläggsfiler (referenser, mallar, tillgångar) endast när det behövs.

Det här mönstret håller agentens kontextfönster snålt samtidigt som det får åtkomst till djup domänkunskap på begäran.

Tillhandahålla kunskaper till en agent

Agent Framework innehåller en kompetensprovider som identifierar färdigheter från filsystemkataloger och gör dem tillgängliga för agenter som en kontextprovider. Den söker rekursivt konfigurerade sökvägar (upp till två nivåer djupt) efter SKILL.md filer, validerar deras format och resurser och exponerar verktyg för agenten: load_skill, read_skill_resourceoch (när skript finns) run_skill_script.

Anmärkning

Skriptkörning stöds ännu inte i C# och kommer att läggas till i en framtida version.

Grundläggande konfiguration

Skapa en FileAgentSkillsProvider pekare till en katalog som innehåller dina färdigheter och lägg till den i agentens context providers.

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

Anropa agenten

När agenten har konfigurerats identifierar den automatiskt tillgängliga kunskaper och använder dem när en uppgift matchar:

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

Grundläggande konfiguration

Skapa en SkillsProvider pekare till en katalog som innehåller dina färdigheter och lägg till den i agentens context providers.

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

Anropa agenten

När agenten har konfigurerats identifierar den automatiskt tillgängliga kunskaper och använder dem när en uppgift matchar:

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

Flera kompetenskataloger

Du kan söka i flera kataloger genom att skicka en lista med sökvägar:

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

Varje sökväg kan peka på en enskild kunskapsmapp (som innehåller en SKILL.md) eller en överordnad mapp med kunskapsunderkataloger. Leverantören söker djupt upp till två nivåer.

Anpassad systemuppmaning

Som standard matar kompetensprovidern in en systemprompt som visar tillgängliga färdigheter och instruerar agenten att använda load_skill och read_skill_resource. Du kan anpassa den här uppmaningen:

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

Anmärkning

Den anpassade mallen måste innehålla en {0} platshållare där kunskapslistan infogas. Literala klammerparenteser måste vara undantagna som {{ och }}.

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

Anmärkning

Den anpassade mallen måste innehålla en {skills} platshållare där kunskapslistan infogas och en {runner_instructions} platshållare där skriptrelaterade instruktioner infogas.

Koddefinierade kunskaper

Förutom filbaserade kunskaper som identifieras från SKILL.md filer kan du definiera färdigheter helt i Python kod. Koddefinierade kunskaper är användbara när:

  • Kunskapsinnehåll genereras dynamiskt (till exempel läsning från en databas eller miljö).
  • Du vill behålla kunskapsdefinitioner tillsammans med programkoden som använder dem.
  • Du behöver resurser som kör logik vid lästid i stället för att hantera statiska filer.

Grundläggande kodfärdighet

Skapa en Skill instans med ett namn, en beskrivning och ett instruktionsinnehåll. Du kan också koppla SkillResource instanser med statiskt innehåll:

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

Dynamiska resurser

Använd dekoratören @skill.resource för att registrera en funktion som en resurs. Funktionen anropas varje gång agenten läser resursen, så att den kan returnera up-to-date-data. Funktioner för både synkronisering och asynkronisering stöds:

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

När dekoratören används utan argument (@skill.resource) blir funktionsnamnet resursnamnet och dokumentsträngen blir beskrivningen. Använd @skill.resource(name="...", description="...") för att ange dem explicit.

Koddefinierade skript

Använd dekoratören @skill.script för att registrera en funktion som ett körbart skript på en färdighet. Koddefinierade skript körs i processen och kräver ingen skriptexekutor. Funktioner för både synkronisering och asynkronisering stöds:

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

När dekoratören används utan argument (@skill.script) blir funktionsnamnet skriptnamnet och docstring blir beskrivningen. Funktionens inskrivna parametrar konverteras automatiskt till ett JSON-schema som agenten använder för att skicka argument.

Kombinera filbaserade och koddefinierade kunskaper

Skicka både skill_paths och skills till en enda SkillsProvider. Filbaserade färdigheter identifieras först; om en koddefinierad färdighet har samma namn som en befintlig filbaserad färdighet utesluts den koddefinierade färdigheten.

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

Skriptkörning

Kunskaper kan omfatta körbara skript som agenten kör via run_skill_script verktyget. Hur ett skript körs beror på hur det definierades:

  • Koddefinierade skript (registrerade via @skill.script) körs i processen som direktfunktionsanrop. Ingen löpare behövs.
  • Filbaserade skript (.py filer som identifieras i kunskapskataloger) kräver en SkillScriptRunner – alla anropsbara matchningar (skill, script, args) -> Any – som avgör hur skriptet körs (till exempel som en lokal underprocess).

Filbaserad skriptkörning

Om du vill aktivera körning av filbaserade skript skickar du ett script_runner till SkillsProvider. Alla synkrona eller asynkrona anropbara SkillScriptRunner som uppfyller protokollet kan användas:

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öparen får den lösta Skill, SkillScriptoch en valfri args ordlista. Filbaserade skript identifieras automatiskt från .py filer i kunskapskataloger.

Varning

Löparen ovan tillhandahålls endast i demonstrationssyfte. För produktionsanvändning bör du överväga att lägga till:

  • Sandbox-miljö (till exempel containrar, seccompeller firejail)
  • Resursgränser (CPU, minne, tidsgräns för väggklocka)
  • Indataverifiering och tillåten lista över körbara skript
  • Strukturerad loggning och revisionsspår

Anmärkning

Om filbaserade färdigheter med skript tillhandahålls, men inget script_runner har satts, så genererar SkillsProvider en ValueError.

Skriptgodkännande

Använd require_script_approval=TrueSkillsProvider för att begränsa alla skriptkörningar till att kräva mänskligt godkännande. I stället för att köra omedelbart pausar och returnerar agenten begäranden om godkännande:

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)

När ett skript avvisas (approved=False) informeras agenten om att användaren har avböjt och kan svara därefter.

Metodtips för säkerhet

Agentkunskaper bör behandlas som all kod från tredje part som du tar med dig till ditt projekt. Eftersom kunskapsinstruktioner matas in i agentens kontext – och färdigheter kan inkludera skript – är det viktigt att du tillämpar samma granskningsnivå och styrningsnivå på ett beroende med öppen källkod.

  • Granska före användning – Läs allt kunskapsinnehåll (SKILL.md, skript och resurser) innan du distribuerar. Kontrollera att ett skripts faktiska beteende matchar dess angivna avsikt. Sök efter instruktioner som försöker kringgå säkerhetsriktlinjer, exfiltera data eller ändra agentkonfigurationsfiler.
  • Källförtroende – Installera endast kunskaper från betrodda författare eller granskade interna deltagare. Föredrar färdigheter med tydlig härkomst, versionskontroll och aktivt underhåll. Håll utkik efter typokvatterade kunskapsnamn som efterliknar populära paket.
  • Sandboxing – Köra färdigheter som innehåller körbara skript i isolerade miljöer. Begränsa åtkomsten till filsystem, nätverk och systemnivå till endast det som krävs för kunskapen. Kräv explicit användarbekräftelse innan du kör potentiellt känsliga åtgärder.
  • Granskning och loggning – Registrera vilka kunskaper som läses in, vilka resurser som läses och vilka skript som körs. Detta ger dig en spårningslogg för att spåra agentbeteendet tillbaka till specifikt kunskapsinnehåll om något går fel.

När du ska använda kunskaper jämfört med arbetsflöden

Agentkunskaper och Agent Framework-arbetsflöden utökar båda vad agenter kan göra, men de fungerar på fundamentalt olika sätt. Välj den metod som bäst matchar dina krav:

  • Kontroll – Med en färdighet bestämmer AI:n hur instruktionerna ska köras. Detta är idealiskt när du vill att agenten ska vara kreativ eller anpassningsbar. Med ett arbetsflöde definierar du uttryckligen exekveringsvägen. Använd arbetsflöden när du behöver deterministiskt, förutsägbart beteende.
  • Resilience – En kompetens körs inom en enda agenttur. Om något misslyckas måste hela åtgärden utföras på nytt. Arbetsflöden stöder kontrollpunkter, så att de kan återupptas från det senaste lyckade steget efter ett fel. Välj arbetsflöden när kostnaden för att köra hela processen på nytt är hög.
  • Biverkningar – Kompetenser är lämpliga när åtgärder är idempotenta eller lågrisk. Föredra arbetsflöden när steg ger biverkningar (skicka e-post, debitera betalningar) som inte bör upprepas vid återförsök.
  • Komplexitet – Kunskaper är bäst för fokuserade uppgifter med en enda domän som en agent kan hantera. Arbetsflöden passar bättre för affärsprocesser i flera steg som samordnar flera agenter, mänskliga godkännanden eller externa systemintegreringar.

Tips/Råd

Som tumregel: Om du vill att AI:n ska ta reda på hur du utför en uppgift använder du en färdighet. Om du behöver garantera vilka steg som körs och i vilken ordning använder du ett arbetsflöde.

Nästa steg