Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Keterampilan Agen adalah paket petunjuk, skrip, dan sumber daya portabel yang memberi agen kemampuan khusus dan keahlian domain. Keterampilan mengikuti spesifikasi terbuka dan menerapkan pola pengungkapan progresif sehingga agen hanya memuat konteks yang mereka butuhkan, ketika mereka membutuhkannya.
Gunakan Keterampilan Agen saat Anda ingin:
- Keahlian domain dalam bentuk paket — Memanfaatkan pengetahuan khusus (kebijakan pengeluaran, alur kerja hukum, alur analisis data) dalam paket portabel yang dapat digunakan kembali.
- Perluas kemampuan agen — Berikan agen kemampuan baru tanpa mengubah instruksi inti mereka.
- Pastikan konsistensi — Ubah tugas multi-langkah menjadi alur kerja yang dapat diaudit berulang.
- Aktifkan interoperabilitas — Gunakan kembali keterampilan yang sama di berbagai produk yang kompatibel dengan Keterampilan Agen.
Struktur keterampilan
Keterampilan adalah direktori yang SKILL.md berisi file dengan subdirektori opsional untuk sumber daya:
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
File SKILL.md harus berisi frontmatter YAML diikuti dengan konten 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"
---
| Bidang | Diperlukan | Deskripsi |
|---|---|---|
name |
Yes | Maksimal 64 karakter. Huruf kecil, angka, dan tanda hubung saja. Tidak boleh dimulai atau diakhir dengan tanda hubung atau berisi tanda hubung berturut-turut. Harus cocok dengan nama direktori induk. |
description |
Yes | Apa fungsi keterampilan ini dan kapan harus digunakan. Maksimal 1024 karakter. Harus menyertakan kata kunci yang membantu agen mengidentifikasi tugas yang relevan. |
license |
Tidak. | Nama lisensi atau referensi ke file lisensi yang dibundel. |
compatibility |
Tidak. | Maksimal 500 karakter. Menunjukkan persyaratan lingkungan (produk yang dimaksudkan, paket sistem, akses jaringan, dll.). |
metadata |
Tidak. | Pemetaan nilai kunci arbitrer untuk metadata tambahan. |
allowed-tools |
Tidak. | Daftar alat yang dipisahkan oleh spasi yang telah disetujui sebelumnya yang dapat digunakan kemampuan. Eksperimental — dukungan antar implementasi agen dapat bervariasi. |
Isi markdown setelah frontmatter berisi instruksi keterampilan — panduan langkah demi langkah, contoh input dan output, kasus tepi umum, atau konten apa pun yang membantu agen melakukan tugas. Simpan SKILL.md di bawah 500 baris dan pindahkan materi referensi terperinci ke file terpisah.
Pengungkapan progresif
Keterampilan Agen menggunakan pola pengungkapan progresif tiga tahap untuk meminimalkan penggunaan konteks:
- Iklankan (~100 token per keterampilan) — Nama dan deskripsi keterampilan disuntikkan ke dalam prompt sistem di awal setiap eksekusi, sehingga agen tahu keterampilan apa yang tersedia.
-
Muat (< 5000 token yang direkomendasikan) — Ketika suatu tugas cocok dengan domain keterampilan, agen memanggil
load_skillalat untuk mengambil isi SKILL.md lengkap dengan instruksi terperinci. -
Membaca sumber daya (sesuai kebutuhan) — Agen memanggil
read_skill_resourcealat untuk mengambil file tambahan (referensi, templat, aset) hanya jika diperlukan.
Pola ini membuat jendela konteks agen tetap ramping sambil memberinya akses ke pengetahuan domain yang mendalam sesuai permintaan.
Memberikan keterampilan kepada agen
Kerangka Kerja Agen mencakup penyedia keterampilan yang menemukan keterampilan dari direktori sistem file dan membuatnya tersedia untuk agen sebagai penyedia konteks. Ini mencari jalur yang dikonfigurasi secara rekursif (hingga dua tingkat dalam) untuk file SKILL.md, memvalidasi format dan sumber daya mereka, dan mengekspos alat ke agen: load_skill, read_skill_resource, dan (ketika skrip tersedia) run_skill_script.
Nota
Eksekusi skrip belum didukung di C# dan akan ditambahkan dalam rilis mendatang.
Penyiapan Awal
Buat FileAgentSkillsProvider penunjuk ke direktori yang berisi keterampilan Anda, dan tambahkan ke penyedia konteks agen:
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],
});
Memanggil agen
Setelah dikonfigurasi, agen secara otomatis menemukan keterampilan yang tersedia dan menggunakannya saat tugas cocok:
// 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);
Penyiapan Awal
Buat SkillsProvider penunjuk ke direktori yang berisi keterampilan Anda, dan tambahkan ke penyedia konteks agen:
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],
)
Memanggil agen
Setelah dikonfigurasi, agen secara otomatis menemukan keterampilan yang tersedia dan menggunakannya saat tugas cocok:
# 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)
Beberapa direktori keterampilan
Anda dapat mencari beberapa direktori dengan meneruskan daftar jalur:
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",
]
)
Setiap jalur dapat menunjuk ke folder keterampilan individual (berisi SKILL.md) atau folder induk dengan subdirektori keterampilan. Penyedia mencari hingga dua tingkat dalam.
Prompt sistem kustom
Secara default, penyedia keterampilan menyuntikkan permintaan sistem yang mencantumkan keterampilan yang tersedia dan menginstruksikan agen untuk menggunakan load_skill dan read_skill_resource. Anda dapat menyesuaikan perintah ini:
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.
"""
});
Nota
Templat kustom harus berisi {0} tempat penampung tempat daftar keterampilan disisipkan. Kurung kurawal literal harus di-escape sebagai {{ dan }}.
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."
),
)
Nota
Templat kustom harus berisi {skills} tempat penampung tempat daftar keterampilan dimasukkan dan {runner_instructions} tempat penampung tempat instruksi terkait skrip disisipkan.
Keterampilan berbasis kode
Selain keterampilan berbasis file yang ditemukan dari file SKILL.md, Anda dapat menentukan keterampilan sepenuhnya dalam kode Python. Keterampilan yang ditentukan kode berguna ketika:
- Konten keterampilan dihasilkan secara dinamis (misalnya, membaca dari database atau lingkungan).
- Anda ingin menyimpan definisi keterampilan bersama kode aplikasi yang menggunakannya.
- Anda memerlukan sumber daya yang menjalankan logika pada waktu baca daripada melayani file statis.
Keterampilan kode dasar
Buat Skill instans dengan nama, deskripsi, dan konten instruksi. Opsional, lampirkan instans SkillResource dengan konten statis.
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])
Sumber daya dinamis
Gunakan dekorator @skill.resource untuk mendaftarkan fungsi sebagai sumber daya. Fungsi ini dipanggil setiap kali agen membaca sumber daya, sehingga dapat mengembalikan data up-to-date. Fungsi sinkronisasi dan asinkron didukung:
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)"
Ketika dekorator digunakan tanpa argumen (@skill.resource), nama fungsi menjadi nama sumber daya dan docstring menjadi deskripsi. Gunakan @skill.resource(name="...", description="...") untuk mengaturnya secara eksplisit.
Skrip yang ditentukan oleh kode
Gunakan dekorator @skill.script untuk mendaftarkan fungsi sebagai skrip yang dapat dieksekusi pada fitur tersebut. Skrip yang didefinisikan oleh kode berjalan dalam proses dan tidak memerlukan eksekutor skrip. Fungsi sinkronisasi dan asinkron didukung:
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})
Ketika dekorator digunakan tanpa argumen (@skill.script), nama fungsi menjadi nama skrip dan docstring menjadi deskripsi. Parameter yang diketik fungsi secara otomatis dikonversi menjadi Skema JSON yang digunakan agen untuk meneruskan argumen.
Menggabungkan keterampilan berbasis file dan didefinisikan oleh kode
Teruskan baik skill_paths dan skills ke satu SkillsProvider. Keterampilan berbasis file ditemukan terlebih dahulu; jika keterampilan yang ditentukan kode memiliki nama yang sama dengan keterampilan berbasis file yang ada, keterampilan yang ditentukan kode dilewati:
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],
)
Pelaksanaan Skrip
Keterampilan dapat mencakup skrip yang dapat dieksekusi yang dijalankan agen melalui alat.run_skill_script Bagaimana skrip berjalan tergantung pada bagaimana skrip didefinisikan:
-
Skrip yang ditentukan oleh kode (terdaftar melalui
@skill.script) berjalan dalam proses sebagai panggilan fungsi secara langsung. Tidak memerlukan pelari. -
Skrip berbasis file (
.pyfile yang ditemukan di direktori keterampilan) memerlukanSkillScriptRunner— pencocokan(skill, script, args) -> Anyyang dapat dipanggil — yang menentukan bagaimana skrip dijalankan (misalnya, sebagai subprosces lokal).
Eksekusi skrip berbasis file
Untuk mengaktifkan eksekusi skrip berbasis file, teruskan script_runner ke SkillsProvider. Setiap pemanggilan sinkron atau asinkron yang memenuhi protokol SkillScriptRunner dapat digunakan.
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,
)
Pelari menerima Skill, SkillScript, dan args daftar istilah opsional yang telah diurai. Skrip-skrip berbasis file secara otomatis ditemukan dari .py file dalam direktori skill.
Peringatan
Pelari di atas disediakan hanya untuk tujuan demonstrasi. Untuk penggunaan produksi, pertimbangkan untuk menambahkan:
- Sandboxing (misalnya, kontainer,
seccomp, ataufirejail) - Batas sumber daya (CPU, memori, batas waktu jam dinding)
- Validasi input dan daftar izin skrip yang dapat dieksekusi
- Jejak pengelogan dan audit terstruktur
Nota
Jika keterampilan berbasis file dengan skrip disediakan tetapi script_runner tidak diatur, SkillsProvider menimbulkan ValueError.
Persetujuan skrip
Gunakan require_script_approval=True pada SkillsProvider untuk mengontrol semua eksekusi skrip di balik persetujuan manusia. Alih-alih segera dieksekusi, agen menjeda dan mengembalikan permintaan persetujuan:
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)
Ketika skrip ditolak (approved=False), agen diberi tahu bahwa pengguna menolak dan dapat merespons dengan sesuai.
Praktik terbaik keamanan
Keterampilan Agen harus diperlakukan seperti kode pihak ketiga yang Anda bawa ke dalam proyek Anda. Karena instruksi keterampilan disuntikkan ke dalam konteks agen — dan keterampilan dapat mencakup skrip — menerapkan tingkat peninjauan dan tata kelola yang sama dengan dependensi sumber terbuka sangat penting.
-
Tinjau sebelum digunakan — Baca semua konten keterampilan (
SKILL.md, skrip, dan sumber daya) sebelum menyebarkan. Verifikasi bahwa perilaku aktual skrip cocok dengan niat yang dinyatakan. Periksa instruksi adversarial yang mencoba melewati pedoman keselamatan, menyelundupkan data, atau memodifikasi file konfigurasi agen. - Kepercayaan sumber — Hanya pasang kemampuan dari penulis tepercaya atau kontributor internal yang ditinjau. Lebih suka kemampuan dengan sumber yang jelas, kontrol versi, dan pemeliharaan aktif. Waspadai nama kemampuan yang menyerupai nama paket populer.
- Sandboxing — Jalankan keterampilan yang menyertakan skrip yang dapat dieksekusi di lingkungan terisolasi. Batasi sistem file, jaringan, dan akses tingkat sistem hanya untuk apa yang dibutuhkan keterampilan. Memerlukan konfirmasi pengguna eksplisit sebelum menjalankan operasi yang berpotensi sensitif.
- Audit dan pengelogan — Catat keterampilan mana yang dimuat, sumber daya mana yang dibaca, dan skrip mana yang dijalankan. Ini memberi Anda jejak audit untuk menelusuri tingkah laku agen hingga ke konten keterampilan tertentu jika terjadi kesalahan.
Kapan menggunakan keterampilan vs. alur kerja
Keterampilan Agen dan Alur Kerja Kerangka Kerja Agen memperluas apa yang dapat dilakukan agen, tetapi mereka bekerja dengan cara yang pada dasarnya berbeda. Pilih pendekatan yang paling sesuai dengan kebutuhan Anda:
- Kontrol — Dengan keterampilan, AI memutuskan cara menjalankan instruksi. Ini sangat ideal ketika Anda ingin agen menjadi kreatif atau adaptif. Dengan alur kerja, Anda secara eksplisit menentukan jalur eksekusi. Gunakan alur kerja saat Anda memerlukan perilaku deterministik dan dapat diprediksi.
- Ketahanan — Keterampilan berjalan dalam satu giliran agen. Jika terjadi kegagalan, seluruh operasi harus dicoba kembali. Alur kerja mendukung checkpointing, sehingga dapat dilanjutkan dari langkah terakhir yang berhasil setelah kegagalan. Pilih alur kerja saat biaya eksekusi ulang seluruh proses tinggi.
- Efek samping — Keterampilan cocok ketika operasi idempotensi atau berisiko rendah. Lebih suka alur kerja ketika langkah-langkah menghasilkan efek samping (mengirim email, menagih pembayaran) yang tidak boleh diulang saat mencoba kembali.
- Kompleksitas — Keterampilan adalah yang terbaik untuk tugas domain tunggal terfokus yang dapat ditangani oleh satu agen. Alur kerja lebih cocok untuk proses bisnis multi-langkah yang mengoordinasikan beberapa agen, persetujuan manusia, atau integrasi sistem eksternal.
Tip
Sebagai aturan praktis: jika Anda ingin AI mencari tahu cara menyelesaikan tugas, gunakan keterampilan. Jika Anda perlu menjamin langkah-langkah apa yang dijalankan dan dalam urutan apa, gunakan alur kerja.