Extension de scripts pour les compétences
En plus d’écrire des instructions dans SKILL.md, vous pouvez également ajouter du code exécutable à une compétence via le répertoire scripts.
Cette section vous apprendra à utiliser des scripts pour étendre les fonctionnalités d’une compétence.
Pourquoi utiliser des scripts
L’utilisation de scripts vous permet de :
- Encapsuler une logique complexe et éviter d’écrire de grandes quantités de code dans SKILL.md
- Fournir des implémentations testées et fiables
- Permettre aux agents de réutiliser les mêmes outils et fonctions
- Gérer des opérations d’entrée/sortie plus complexes
Astuce : lorsque vous remarquez que l’agent implémente de façon répétée la même logique au fil de multiples exécutions, c’est souvent un bon moment pour créer un script.
Structure du répertoire de scripts
Les scripts doivent être placés dans le sous-répertoire scripts/ du répertoire de la compétence :
Structure du répertoire
├── SKILL.md
└── scripts/
├── script1.py
├── script2.sh
└── helper.js
Lignes directrices pour l'écriture de scripts
1. Autonomie
Les scripts doivent être aussi autonomes que possible ou documenter clairement leurs dépendances.
Exemple de script autonome
"""
Script d'extraction de texte PDF
Dépendance : pip install pdfplumber
Exécuter : python scripts/extract_pdf.py input.pdf
"""
import sys
import pdfplumber
def extract_text_from_pdf(pdf_path):
"""Extraire le texte d'un fichier PDF"""
with pdfplumber.open(pdf_path) as pdf:
text = ""
for page in pdf.pages:
text += page.extract_text() or ""
return text
if __name__ == "__main__":
if len(sys.argv) < 2:
print("Utilisation : python extract_pdf.py <fichier pdf>")
sys.exit(1)
pdf_path = sys.argv[1]
text = extract_text_from_pdf(pdf_path)
print(text)
2. Gestion claire des erreurs
Les scripts doivent fournir des messages d'erreur utiles pour aider les agents à comprendre ce qui s'est mal passé.
Exemple de gestion des erreurs
def main():
if len(sys.argv) < 2:
print("Erreur : argument obligatoire manquant", file=sys.stderr)
print("Utilisation : python script.py <fichier d'entrée> [fichier de sortie]", file=sys.stderr)
sys.exit(1)
input_file = sys.argv[1]
try:
# Exécuter la logique principale
process_file(input_file)
except FileNotFoundError:
print(f"Erreur : fichier {input_file} introuvable", file=sys.stderr)
sys.exit(1)
except PermissionError:
print(f"Erreur : aucune permission pour lire le fichier {input_file}", file=sys.stderr)
sys.exit(1)
except Exception as e:
print(f"Erreur : une erreur inconnue s'est produite lors du traitement du fichier : {e}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()
3. Gestion des cas limites
Les scripts doivent gérer élégamment divers cas limites au lieu de planter.
Exemple de gestion des cas limites
"""Vérifier si l'entrée est valide"""
if not text:
return False, "L'entrée ne peut pas être vide"
if len(text) > 10000:
return False, "La longueur de l'entrée dépasse la limite (max 10000 caractères)"
return True, ""
# Utiliser la validation
is_valid, error_msg = validate_input(user_input)
if not is_valid:
print(f"Échec de la validation : {error_msg}")
sys.exit(1)
Référencement des scripts dans SKILL.md
Lorsqu'une compétence doit exécuter un script, décrivez dans SKILL.md comment l'appeler.
Référencement des scripts :
## PDF 文本提取 使用脚本提取 PDF 中的文本: ```bash python scripts/extract_pdf.py input.pdf ``` 脚本会从 input.pdf 提取所有文本并输出到标准输出。 如果需要将结果保存到文件: ```bash python scripts/extract_pdf.py input.pdf > output.txt ```
Remarque : utilisez des chemins relatifs au répertoire racine de la compétence lors du référencement des scripts.
Langages de script pris en charge
Les langages de script pris en charge dépendent de l'implémentation d'agent que vous utilisez. Les options courantes incluent :
| Langage | Description |
|---|---|
| Python | Le choix le plus couramment utilisé, puissant et facile à écrire |
| Bash | Adapté aux opérations système et aux outils en ligne de commande |
| JavaScript | Adapté aux tâches liées au Web |
Astuce : lors du choix d'un langage de script, tenez compte de l'environnement d'exécution de l'utilisateur cible. En cas de doute, Python est le choix le plus sûr.
Exemple complet : compétence de traitement PDF
Examinons un exemple complet montrant comment combiner SKILL.md et des scripts :
Structure de la compétence
├── SKILL.md
└── scripts/
├── extract.py
├── fill_form.py
└── merge.py
Contenu de SKILL.md :
---
name: pdf-tool
description: 处理 PDF 文件,包括提取文本、填写表单、合并文件。使用场景:处理 PDF、提取文本、填写表单、合并 PDF.
---
## 提取 PDF 文本
从 PDF 文件中提取文本内容:
```bash
python scripts/extract.py input.pdf
```
输出是提取的纯文本内容。
## 填写 PDF 表单
使用 JSON 数据填写 PDF 表单:
```bash
python scripts/fill_form.py input.pdf data.json output.pdf
```
data.json 格式:
```json
{
"field_name": "字段值",
"another_field": "另一个值"
}
```
## 合并 PDF
将多个 PDF 文件合并为一个:
```bash
python scripts/merge.py output.pdf input1.pdf input2.pdf input3.pdf
```
## 依赖安装
需要安装 pdfplumber 和 PyPDF2:
```bash
pip install pdfplumber PyPDF2
```
Deux modes d'utilisation
Il existe deux façons d'utiliser du code dans une Skill :
| Méthode | Scénario applicable | Nécessité d'un répertoire scripts/ |
|---|---|---|
| Commande ponctuelle | Il suffit d'appeler des outils existants, aucune logique personnalisée n'est requise | Non nécessaire |
| Script autonome | Logique complexe qui doit être réutilisée | Nécessaire |
Commandes ponctuelles
Lorsque les outils de gestion de paquets existants répondent déjà aux besoins, vous pouvez les référencer directement dans les instructions de SKILL.md sans créer de répertoire scripts/.
Voici les méthodes d'exécution courantes dans chaque écosystème de langage :
uvx(Python)
uvx est la commande d'exécution d'outils fournie avec uv. Elle exécute des paquets Python dans un environnement isolé et, grâce à une mise en cache agressive, les exécutions répétées sont quasiment instantanées.
Exemple
uvx ruff@0.8.0 check .
# Exécuter la version spécifiée de black pour formater le code
uvx black@24.10.0 .
pipx(Python)
pipx est une alternative mature à uvx et peut être installé via les gestionnaires de paquets système (p. ex.,brew install pipx)。
Exemple
pipx run 'black==24.10.0' .
# Exécuter la version spécifiée de ruff
pipx run '[email protected]' check .
npx(Node.js)
npx est fourni avec npm et télécharge et exécute des paquets npm à la demande.
Exemple
npx eslint@9 --fix .
# Créer un projet avec Vite
npx create-vite@6 my-app
go run(Go)
La commande intégrée de Go pour exécuter des outils compile et exécute directement des paquets distants.
Exemple
go run golang.org/x/tools/cmd/goimports@v0.28.0 .
# Exécuter la vérification golangci-lint
go run github.com/golangci/golangci-lint/cmd/golangci-lint@v1.62.0 run
Recommandations pour l'écriture de commandes à exécution unique : Fixez les numéros de version (par ex.,
npx [email protected]) afin de garantir un comportement cohérent ; déclarez les prérequis dans SKILL.md (par ex., "Node.js 18+ requis") ; lorsque les commandes deviennent complexes, extrayez-les dans le répertoire scripts/.
Référencement des scripts dans SKILL.md
Utilisez des chemins partant de la racine du répertoire Skillchemins relatifspour référencer les fichiers empaquetés.
L'agent résoudra automatiquement ces chemins ; il n'est pas nécessaire d'utiliser des chemins absolus.
Tout d'abord, listez les scripts disponibles dans SKILL.md :
Exemple
- **`scripts/validate.sh`** — Valider les fichiers de configuration
- **`scripts/process.py`** — Traiter les données d'entrée
- **`scripts/report.py`** — Générer des rapports d'analyse
Ensuite, référencez-les dans les étapes d'opération :
Exemple
1. Exécutez le script de validation :
```bash
bash scripts/validate.sh "$INPUT_FILE"
```
2. Traiter les données :
```bash
python3 scripts/process.py --input results.json
```
Les chemins d'exécution des scripts sont relatifs à la racine du répertoire Skill, car l'Agent exécute les commandes depuis le répertoire Skill. Cela s'applique également aux fichiers auxiliaires tels que references/*.md.
Scripts autonomes
Lorsque vous avez besoin d'une logique réutilisable, vous pouvez empaqueter des scripts dans lescripts/répertoire et déclarer les dépendances dans le script.
L'Agent peut l'exécuter avec une seule commande, sans étapes d'installation supplémentaires.
Script Python autonome (PEP 723)
PEP 723 définit un format standard pour déclarer les dépendances à l'intérieur des scripts Python.
Utiliser# ///marqueurs pour encadrer la déclaration de dépendances au format TOML :
Exemple : Script Python autonome
# dependencies = [
# "beautifulsoup4",
# ]
# ///
from bs4 import BeautifulSoup
# Exemple de contenu HTML
html = '<html><body><h1>Welcome</h1><p class="info">EXAMPLE Test</p></body></html>'
# Analyser le HTML avec BeautifulSoup
soup = BeautifulSoup(html, "html.parser")
# Extraire le texte du paragraphe avec class="info"
info_text = soup.select_one("p.info").get_text()
print(info_text)
Comment exécuter :
Exemple
uv run scripts/extract.py
# Exécuter avec pipx
pipx run scripts/extract.py
EXAMPLE 测试
Script Deno autonome
Deno utilisenpm:etjsr:spécificateurs d'import pour atteindre l'autonomie :
Exemple : Script Deno autonome
import * as cheerio from "npm:[email protected]";
const html = `<html><body><h1>Bienvenue</h1><p class="info">EXEMPLE Test</p></body></html>`;
const $ = cheerio.load(html);
console.log($("p.info").text());
Exemple
Script autonome Bun
Lorsque Bun n'a pas denode_modulesrépertoire, il installe automatiquement les paquets manquants :
Exemple : script autonome Bun
import * as cheerio from "[email protected]";
const html = `<html><body><h1>Bienvenue</h1><p class="info">EXEMPLE Test</p></body></html>`;
const $ = cheerio.load(html);
console.log($("p.info").text());
Exemple
Script autonome Ruby
Ruby utilisebundler/inlinepour déclarer les dépendances de gems dans le script :
Exemple : script autonome Ruby
gemfile do
source 'https://rubygems.org'
gem 'nokogiri'
end
html = '<html><body><h1>Bienvenue</h1><p class="info">EXEMPLE Test</p></body></html>'
doc = Nokogiri::HTML(html)
puts doc.at_css('p.info').text
Exemple
Points clés pour la conception de scripts pour agents
L'Agent détermine ses prochaines actions en lisant stdout et stderr, donc la conception des scripts doit prendre en compte les caractéristiques d'utilisation de l'Agent.
Éviter les invites interactives
Il s'agit d'une exigence absolue. L'Agent s'exécute dans un shell non interactif et ne peut pas répondre aux invites TTY, aux boîtes de dialogue de mot de passe ou aux menus de confirmation.
Toutes les entrées doivent être passées via des arguments de ligne de commande, des variables d'environnement ou stdin.
Exemple : Approche incorrecte vs Approche correcte
$ python scripts/deploy.py
Environnement cible : _
# Correct : message d'erreur clair et conseils
$ python scripts/deploy.py
Erreur : --env est requis. Options : development, staging, production.
Utilisation : python scripts/deploy.py --env staging --tag v1.2.3
Fournissez une documentation --help
--helpLa sortie est le principal moyen pour l'Agent de comprendre l'interface du script.
Incluez une brève description, les paramètres disponibles et des exemples d'utilisation :
Exemple : bonne sortie --help
Traiter les données d'entrée et générer un rapport de synthèse.
Options :
--formatFORMAT Format de sortie : json, csv, table(Par défaut : json)
--outputFILE Écrire la sortie dans un fichier au lieu de stdout
--verboseAfficher les informations de progression sur stderr
Exemples :
scripts/process.py data.csv
scripts/process.py --format csv --output report.csv data.csv
Écrire des messages d'erreur utiles
Lorsque l'Agent voit un message d'erreur, il ajuste sa stratégie en conséquence ; plus le message est spécifique, plus il est facile pour l'Agent de se corriger.
Exemple
Erreur : entrée non valide
# Bon message d'erreur
Erreur : --format doit être l'un des éléments suivants : json, csv, table.
Reçu : "xml"
Utiliser une sortie structurée
Préférez les formats structurés tels que JSON, CSV et TSV pour la sortie, plutôt que du texte libre.
Les formats structurés peuvent être consommés à la fois par l'Agent et par les outils standard (jq, cut, awk), ce qui les rend faciles à combiner.
Exemple
NAME STATUS CREATED
my-service running 2025-01-15
# Recommandé : format JSON avec des limites de champs claires
{"name": "my-service", "status": "running", "created": "2025-01-15"}
Envoyez les données structurées vers stdout, et les messages de progression et les informations de diagnostic vers stderr. Ainsi, l'Agent obtient une sortie propre et analysable tout en pouvant consulter les informations de diagnostic si nécessaire.
Autres suggestions de conception de script
| Suggestion | Description |
|---|---|
| Idempotence | L'Agent peut réessayer les commandes. "Créer s'il n'existe pas" est plus sûr que "créer et échouer en cas de doublons" |
| Contraintes d'entrée | Rejeter les entrées ambiguës avec une erreur claire, plutôt que de deviner l'intention de l'utilisateur |
| Prise en charge du dry-run | Pour les opérations destructives ou avec état, fournir un--dry-rundrapeau pour permettre à l'Agent de prévisualiser l'opération |
| Codes de sortie explicites | Utiliser des codes de sortie différents pour différents types d'échec (introuvable, argument invalide, échec d'authentification, etc.) |
| Taille de sortie prévisible | Afficher un résumé par défaut et fournir--offsetd'autres paramètres afin que l'Agent puisse obtenir plus d'informations selon ses besoins. |
| Valeurs par défaut sûres | Les opérations destructives doivent exiger un drapeau de confirmation explicite (--confirm、--force) |
Exemple complet de script Skill
Voici une structure de répertoire Skill complète contenant des scripts :
Exemple
├── SKILL.md # Fichier d'instructions principal
├── scripts/
│ ├── overview.py # Script d'aperçu des données
│ ├── summary.py # Script de résumé statistique
│ └── validate.py # Script de validation des données
├── references/
│ └── api-errors.md # Référence des erreurs API
└── assets/
└── report-template.md # Modèle de rapport
Le contenu correspondant de SKILL.md :
Exemple
name: csv-analyzer
description: >
Analyser des fichiers de données CSV et tabulaires. Lorsque l'utilisateur a des fichiers CSV, TSV ou Excel
et souhaite explorer, transformer ou visualiser des données, utilisez ceci.
---
# Analyse de données CSV
## Scripts disponibles
- **`scripts/overview.py`** — Affiche l'aperçu des données (nombre de lignes, noms des colonnes, types)
- **`scripts/summary.py`** — Génère un résumé statistique
- **`scripts/validate.py`** — Valide la qualité des données
## Flux de travail
1. Commencez par exécuter le script overview pour comprendre la structure des données :
```bash
uv run scripts/overview.py input.csv
```
2. Générez le résumé statistique :
```bash
uv run scripts/summary.py input.csv --output summary.json
```
3. Valider la qualité des données :
```bash
uv run scripts/validate.py input.csv
```
## Remarques
- Pour les fichiers volumineux, utilisez le paramètre `--chunk-size` pour traiter par blocs
- Pour les fichiers CSV chinois, essayez le paramètre `--encoding gbk`
Distribution des scripts et dépendances
Si vos scripts nécessitent des dépendances externes, vous disposez de plusieurs options :
1. Documenter les dépendances dans SKILL.md
La façon la plus simple est de consigner les dépendances requises dans SKILL.md.
2. Utiliser des environnements virtuels
Pour les projets complexes, vous pouvez créer un environnement virtuel.
3. Utiliser Docker
Si un environnement d'exécution complet est nécessaire, vous pouvez utiliser un conteneur Docker.
Remarque : Assurez-vous que les scripts peuvent s'exécuter dans l'environnement cible. Avant d'écrire des scripts, comprenez l'environnement d'exécution de l'utilisateur cible.
Résumé
Dans cette section, nous avons appris à utiliser des scripts pour étendre les fonctionnalités de Skill :
- Placez les scripts dans le répertoire scripts/
- Les scripts doivent être autonomes et avoir une gestion claire des erreurs
- Utilisez des chemins relatifs lorsque vous référencez des scripts dans SKILL.md
- Assurez-vous que les scripts peuvent s'exécuter dans l'environnement cible