Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Le competenze dell'agente sono pacchetti portabili di istruzioni, script e risorse che offrono agli agenti funzionalità specializzate e competenze di dominio. Le competenze seguono una specifica aperta e implementano un modello di divulgazione progressiva in modo che gli agenti carichino solo il contesto di cui hanno bisogno, quando necessario.
Usare le competenze dell'agente quando si vuole:
- Competenze di dominio — Acquisire conoscenze specializzate (politiche di spesa, flussi di lavoro legali, pipeline di analisi dati) sotto forma di pacchetti riutilizzabili e portabili.
- Estendere le funzionalità degli agenti : offrire agli agenti nuove capacità senza modificare le istruzioni di base.
- Garantire la coerenza : trasformare le attività in più passaggi in flussi di lavoro ripetibili e controllabili.
- Abilitare l'interoperabilità: riutilizzare la stessa competenza in diversi prodotti compatibili con le competenze dell'agente.
Struttura delle competenze
Un'abilità è una directory contenente un file SKILL.md con sottodirectory facoltative per le risorse.
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
formato SKILL.md
Il SKILL.md file deve contenere il frontmatter YAML seguito dal contenuto 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"
---
| Campo | Obbligatorio | Descrzione |
|---|---|---|
name |
Sì | Massimo 64 caratteri. Solo lettere minuscole, numeri e trattini. Non deve iniziare o terminare con un trattino o contenere trattini consecutivi. Deve corrispondere al nome della directory principale. |
description |
Sì | Cosa fa la competenza e quando usarla. Massimo 1024 caratteri. Deve includere parole chiave che consentono agli agenti di identificare le attività pertinenti. |
license |
NO | Nome della licenza o riferimento a un file di licenza in bundle. |
compatibility |
NO | Massimo 500 caratteri. Indica i requisiti di ambiente (prodotto, pacchetti di sistema, accesso alla rete e così via). |
metadata |
NO | Mappatura chiave-valore arbitraria per metadati aggiuntivi. |
allowed-tools |
NO | Elenco delimitato da spazi di strumenti pre-approvati che l'abilità può utilizzare. Sperimentale: il supporto può variare tra le implementazioni dell'agente. |
Il corpo markdown dopo il frontmatter contiene le istruzioni delle competenze, indicazioni dettagliate, esempi di input e output, casi limite comuni o qualsiasi contenuto che aiuti l'agente a svolgere l'attività. Mantenere SKILL.md sotto 500 righe e spostare materiale di riferimento dettagliato in file separati.
Divulgazione progressiva
Le competenze dell'agente usano un modello di divulgazione progressiva a tre fasi per ridurre al minimo l'utilizzo del contesto:
- Annuncio (~100 token per competenza): i nomi e le descrizioni delle competenze vengono inseriti nella richiesta di sistema all'inizio di ogni esecuzione, quindi l'agente sa quali competenze sono disponibili.
-
Carica (< 5000 token consigliati): quando un'attività si allinea al dominio di una competenza, l'agente utilizza lo strumento
load_skillper recuperare il corpo completo di SKILL.md con istruzioni dettagliate. -
Leggere le risorse (in base alle esigenze): l'agente chiama lo
read_skill_resourcestrumento per recuperare file supplementari (riferimenti, modelli, asset) solo quando necessario.
Questo modello mantiene snella la finestra di contesto dell'agente, concedendole l'accesso a conoscenze di dominio approfondite su richiesta.
Fornire competenze a un agente
Agent Framework include un fornitore di competenze che scopre abilità dalle directory del filesystem e le rende disponibili agli agenti come fornitore di contesto. Cerca i percorsi configurati in modo ricorsivo (fino a due livelli profondi) per SKILL.md i file, convalida il formato e le risorse ed espone gli strumenti all'agente: load_skill, read_skill_resourcee (quando sono presenti gli script). run_skill_script
Annotazioni
L'esecuzione di script non è ancora supportata in C# e verrà aggiunta in una versione futura.
Configurazione di base
Crea un FileAgentSkillsProvider puntatore a una directory contenente le competenze e aggiungilo ai provider di contesto dell'agente:
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],
});
Richiamo dell'agente
Dopo la configurazione, l'agente individua automaticamente le competenze disponibili e le usa quando un'attività corrisponde:
// 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);
Configurazione di base
Crea un SkillsProvider puntatore a una directory contenente le competenze e aggiungilo ai provider di contesto dell'agente:
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],
)
Richiamo dell'agente
Dopo la configurazione, l'agente individua automaticamente le competenze disponibili e le usa quando un'attività corrisponde:
# 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)
Molteplici directory di competenze
È possibile cercare più directory passando un elenco di percorsi:
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",
]
)
Ogni percorso può puntare a una singola cartella della skill (contenente un SKILL.md) o a una cartella padre con sottodirectory della skill. Il provider cerca fino a due livelli di profondità.
Richiesta di sistema personalizzata
Per impostazione predefinita, il provider di competenze inserisce un prompt di sistema che elenca le competenze disponibili e indica all'agente di usare load_skill e read_skill_resource. È possibile personalizzare questa richiesta:
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.
"""
});
Annotazioni
Il modello personalizzato deve contenere un {0} segnaposto in cui viene inserito l'elenco di competenze. Le parentesi graffe letterali devono essere precedute da un carattere di escape come {{ e }}.
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."
),
)
Annotazioni
Il modello personalizzato deve contenere un {skills} segnaposto in cui viene inserito l'elenco delle competenze e un {runner_instructions} segnaposto in cui vengono inserite le istruzioni correlate allo script.
Competenze definite dal codice
Oltre alle competenze basate su file individuate dai file SKILL.md, è possibile definire le competenze interamente nel codice Python. Le competenze definite dal codice sono utili quando:
- Il contenuto della competenza viene generato in modo dinamico( ad esempio, la lettura da un database o un ambiente).
- Si vogliono mantenere le definizioni delle competenze insieme al codice dell'applicazione che le usa.
- Sono necessarie risorse che eseguono la logica in fase di lettura anziché gestire i file statici.
Competenza di codice di base
Creare un'istanza Skill con un nome, una descrizione e un contenuto dell'istruzione. Facoltativamente, allegare SkillResource istanze al contenuto statico:
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])
Risorse dinamiche
Usa il decoratore @skill.resource per registrare una funzione come risorsa. La funzione viene chiamata ogni volta che l'agente legge la risorsa, in modo che possa restituire dati aggiornati. Sono supportate sia le funzioni di sincronizzazione che asincrone:
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)"
Quando l'elemento Decorator viene usato senza argomenti (@skill.resource), il nome della funzione diventa il nome della risorsa e la docstring diventa la descrizione. Usare @skill.resource(name="...", description="...") per impostarli in modo esplicito.
Script definiti dal codice
Usare il decoratore @skill.script per registrare una funzione come script eseguibile in una skill. Gli script definiti dal codice vengono eseguiti in-process e non richiedono un executor di script. Sono supportate sia le funzioni di sincronizzazione che asincrone:
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})
Quando l'elemento Decorator viene usato senza argomenti (@skill.script), il nome della funzione diventa il nome dello script e la docstring diventa la descrizione. I parametri tipizzato della funzione vengono convertiti automaticamente in uno schema JSON usato dall'agente per passare argomenti.
Combinazione di competenze basate su file e definite dal codice
Passa sia skill_paths che skills a un singolo SkillsProvider. Le competenze basate su file vengono individuate per prime; se una competenza definita dal codice ha lo stesso nome di una competenza basata su file esistente, la competenza definita dal codice viene ignorata:
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],
)
Esecuzione degli script
Le competenze possono includere script eseguibili che l'agente esegue con il run_skill_script strumento. La modalità di esecuzione di uno script dipende dalla modalità di definizione:
-
Gli script definiti dal codice (registrati tramite
@skill.script) vengono eseguiti in-process come chiamate di funzione diretta. Non è necessario alcun runner. -
Gli script basati su file (
.pyfile individuati nelle directory delle competenze) richiedono un oggettoSkillScriptRunner, qualsiasi corrispondenza(skill, script, args) -> Anychiamabile, che determina la modalità di esecuzione dello script (ad esempio, come sottoprocesso locale).
Esecuzione di script basati su file
Per abilitare l'esecuzione di script basati su file, passare un script_runner a SkillsProvider. È possibile usare qualsiasi funzione o metodo sincrono o asincrono che soddisfi il protocollo SkillScriptRunner:
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'esecutore riceve l'oggetto Skill, SkillScript e un dizionario facoltativo args. Gli script basati su file vengono individuati automaticamente dai .py file nelle directory degli skill.
Avviso
Il runner precedente viene fornito solo a scopo dimostrativo. Per l'uso in produzione, è consigliabile aggiungere:
- Sandboxing (ad esempio, contenitori,
seccomp, ofirejail) - Limiti delle risorse (CPU, memoria, timeout di wall-clock)
- Convalida dell'input e elenco consentito di script eseguibili
- Log strutturati e audit trail
Annotazioni
Se vengono fornite competenze su file con script senza che script_runner sia impostato, SkillsProvider genera un ValueError.
Approvazione dello script
Usare require_script_approval=True su SkillsProvider per limitare tutte le esecuzioni di script soggette ad approvazione umana. Anziché eseguirlo immediatamente, l'agente sospende e restituisce le richieste di approvazione:
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)
Quando uno script viene rifiutato (approved=False), l'agente viene informato che l'utente ha rifiutato e può rispondere di conseguenza.
Procedure consigliate per la sicurezza
Le competenze dell'agente devono essere considerate come qualsiasi codice di terze parti inserito nel progetto. Poiché le istruzioni sulle competenze vengono inserite nel contesto dell'agente e le competenze possono includere script, l'applicazione dello stesso livello di revisione e governance a una dipendenza open source è essenziale.
-
Esaminare prima dell'uso: leggere tutto il contenuto delle competenze (
SKILL.md, script e risorse) prima della distribuzione. Verificare che il comportamento effettivo di uno script corrisponda alla finalità dichiarata. Controllare le istruzioni antagoniste che tentano di ignorare le linee guida per la sicurezza, esfiltrare i dati o modificare i file di configurazione dell'agente. - Attendibilità origine : installa solo le competenze di autori attendibili o collaboratori interni controllati. Preferisce competenze con chiara provenienza, controllo della versione e manutenzione attiva. Guarda i nomi delle competenze digitati che simulano i pacchetti più diffusi.
- Sandboxing — eseguire abilità che includono script eseguibili in ambienti isolati. Limitare l'accesso a livello di file system, rete e sistema solo a ciò che richiede la competenza. Richiedi conferma esplicita dell'utente prima di eseguire operazioni potenzialmente sensibili.
- Controllo e registrazione : registrare le competenze caricate, quali risorse vengono lette e quali script vengono eseguiti. Questo consente di eseguire un audit trail risalendo al comportamento dell'agente fino al contenuto di competenza specifico, in caso di problemi.
Quando usare competenze e flussi di lavoro
I flussi di lavoro di Agent Skills e Agent Framework estendono entrambe le operazioni che gli agenti possono eseguire, ma funzionano in modi fondamentalmente diversi. Scegliere l'approccio più adatto alle proprie esigenze:
- Controllo : con una competenza, l'intelligenza artificiale decide come eseguire le istruzioni. Questo è ideale quando vuoi che l'agente sia creativo o adattivo. Con un flusso di lavoro, si definisce in modo esplicito il percorso di esecuzione. Usare i flussi di lavoro quando è necessario un comportamento deterministico e prevedibile.
- Resilienza — una abilità si attiva durante un singolo turno di agente. Se si verifica un errore, è necessario ritentare l'intera operazione. I flussi di lavoro supportano il checkpointing, consentendo di riprendere dall'ultimo passaggio riuscito dopo un errore. Scegliere i flussi di lavoro quando il costo di riesezione dell'intero processo è elevato.
- Effetti collaterali : le competenze sono adatte quando le operazioni sono idempotenti o a basso rischio. Preferisce i flussi di lavoro quando i passaggi producono effetti collaterali (invio di messaggi di posta elettronica, pagamenti in addebito) che non devono essere ripetuti al nuovo tentativo.
- Complessità : le competenze sono ideali per attività incentrate e a dominio singolo che un agente può gestire. I flussi di lavoro sono più adatti per processi aziendali in più passaggi che coordinano più agenti, approvazioni umane o integrazioni di sistemi esterni.
Suggerimento
Come regola generale: se si vuole che l'intelligenza artificiale sia in grado di capire come eseguire un'attività, usare una competenza. Se è necessario garantire quali passaggi eseguire e in quale ordine, usare un flusso di lavoro.