Compatible avec OpenClaw v2026.2 | Cet article suppose que vous maîtrisez les bases de Markdown et de la ligne de commande, et que vous souhaitez créer des compétences personnalisées.
TL;DR : Créer un Skill ne nécessite qu’un seul fichier SKILL.md. Champs essentiels : name, version, triggers (mots déclencheurs), tools (liste d’outils). Placez-le dans ~/.openclaw/workspace/skills/<name>/SKILL.md. Les mots déclencheurs doivent être spécifiques pour éviter les conflits. Publication sur ClawHub : openclaw skill publish <name>. Inclut l’analyse de sécurité et le contrôle des permissions.
Préparation de l’environnement de développement
Prérequis
| Requis | Description |
|---|---|
| OpenClaw | Installé et en cours d’exécution |
| Éditeur de texte | VS Code ou tout autre éditeur |
| Markdown de base | SKILL.md utilise le format Markdown |
| Documentation API | Si vous intégrez un service externe, préparez la documentation API |
Créer le répertoire de la compétence
# Créer le répertoire de la compétence
mkdir -p ~/.openclaw/workspace/skills/weather-api
# Accéder au répertoire
cd ~/.openclaw/workspace/skills/weather-api
# Créer les fichiers de base
touch SKILL.md
touch README.md
touch config.json.example
Structure du répertoire
weather-api/
├── SKILL.md # Définition de la compétence (obligatoire)
├── README.md # Documentation (recommandé)
├── config.json.example # Exemple de configuration (optionnel)
├── src/ # Code source (optionnel)
│ └── index.js
└── package.json # Déclaration des dépendances (optionnel)
Structure détaillée du SKILL.md
Structure de base
---
# Frontmatter : métadonnées
name: skill-name
version: 1.0.0
author: your-name
description: Brief description
triggers:
- trigger-1
- trigger-2
dependencies: []
tools: []
---
# Skill Title
Detailed description...
## Features
## Setup
## Usage Examples
## Configuration
## Notes
Champs du Frontmatter
| Champ | Obligatoire | Description |
|---|---|---|
name |
✅ | Identifiant unique de la compétence, lettres minuscules et tirets |
version |
✅ | Numéro de version sémantique |
author |
✅ | Nom de l’auteur ou de l’organisation |
description |
✅ | Description courte (une phrase) |
triggers |
✅ | Liste des mots déclencheurs |
dependencies |
⚠️ | Dépendances vers d’autres compétences |
tools |
⚠️ | Liste des outils fournis |
Conception des mots déclencheurs
Les mots déclencheurs sont la clé permettant à l’Agent d’identifier la compétence :
triggers:
- weather
- météo
- forecast
- prévisions
- temperature
- température
- rain
- pluie
- umbrella
- parapluie
Principes de conception :
| Principe | Description | Exemple |
|---|---|---|
| Spécificité | Éviter les termes trop génériques | ✅ gmail-send ❌ send |
| Multilingue | Supporter plusieurs langues | weather météo |
| Contextuel | Inclure les scénarios d’utilisation | check-weather weather-tomorrow |
| Sans conflit | Vérifier les conflits avec les compétences existantes | openclaw skill search weather |
Pratique : développer une compétence de requête météo
Analyse des besoins
Nous allons développer une compétence de requête météo avec les fonctionnalités suivantes :
- Consulter la météo actuelle
- Consulter les prévisions des prochains jours
- Supporter les noms de villes en plusieurs langues
- Fournir des conseils vestimentaires
SKILL.md complet
---
name: weather-api
version: 1.0.0
author: your-name
description: Query weather information from OpenWeatherMap API
triggers:
- weather
- météo
- forecast
- prévisions
- temperature
- température
- rain
- pluie
- umbrella
- parapluie
dependencies: []
tools:
- weather_current
- weather_forecast
---
# Weather API Skill
Query weather information for any city worldwide. Provides current weather and forecasts with practical suggestions.
## Features
- **Current Weather**: Get real-time weather conditions
- **Forecast**: 5-day weather forecast
- **Multi-language**: Support for city names in multiple languages
- **Smart Suggestions**: Clothing and activity recommendations
## Setup
### 1. Get API Key
1. Visit [OpenWeatherMap](https://openweathermap.org/api)
2. Sign up for a free account
3. Generate an API key
### 2. Configure the Skill
Set the environment variable:
\`\`\`bash
export OPENWEATHER_API_KEY="your-api-key-here"
\`\`\`
Or add to your OpenClaw config:
\`\`\`json
{
"skills": {
"weather-api": {
"apiKey": "your-api-key-here",
"units": "metric",
"lang": "fr"
}
}
}
\`\`\`
## Usage Examples
### Current Weather
User: "Quel temps fait-il à Paris aujourd'hui"
User: "What's the weather in Tokyo"
User: "Check weather for Shanghai"
Action:
1. Parse city name from user message
2. Call weather_current tool with city parameter
3. Format and return weather information
### Weather Forecast
User: "Est-ce qu'il va pleuvoir demain"
User: "Prévisions météo pour 3 jours à New York"
User: "Quel temps ce week-end"
Action:
1. Parse city name and days from user message
2. Call weather_forecast tool
3. Format forecast data into readable summary
### Smart Suggestions
User: "Dois-je prendre un parapluie aujourd'hui"
User: "Comment s'habiller aujourd'hui"
User: "C'est bon pour une activité en extérieur"
Action:
1. Get current weather
2. Analyze conditions (rain, temperature, UV)
3. Provide practical suggestions
## Tools
### weather_current
Get current weather for a city.
**Parameters:**
- `city` (string, required): City name, can be in any language
- `units` (string, optional): "metric", "imperial", or "kelvin". Default: "metric"
- `lang` (string, optional): Language code. Default: "fr"
**Returns:**
\`\`\`json
{
"city": "Paris",
"country": "FR",
"temperature": 18,
"feels_like": 16,
"humidity": 72,
"wind_speed": 15,
"condition": "Partiellement nuageux",
"icon": "02d",
"suggestion": "Veste légère recommandée, pas de pluie prévue"
}
\`\`\`
### weather_forecast
Get weather forecast for up to 5 days.
**Parameters:**
- `city` (string, required): City name
- `days` (number, optional): Number of days (1-5). Default: 3
- `units` (string, optional): Temperature units
**Returns:**
\`\`\`json
{
"city": "Paris",
"forecast": [
{
"date": "2026-02-27",
"temp_high": 20,
"temp_low": 12,
"condition": "Ensoleillé",
"rain_chance": 0
},
...
]
}
\`\`\`
## Configuration Options
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| `apiKey` | string | - | OpenWeatherMap API key |
| `units` | string | "metric" | Temperature units |
| `lang` | string | "fr" | Language for descriptions |
| `cache_ttl` | number | 600 | Cache duration in seconds |
## Error Handling
The skill handles common errors:
- **City not found**: Suggests similar city names
- **API key invalid**: Prompts user to check configuration
- **Rate limit**: Queues request and retries
- **Network error**: Falls back to cached data if available
## Notes
- Free tier allows 1000 requests/day
- City names support French: "Paris", "Lyon", "Marseille"
- Results are cached for 10 minutes by default
- Consider upgrading to paid tier for more frequent updates
Implémentation des outils (optionnel)
Si votre compétence doit effectuer des opérations concrètes, vous pouvez ajouter une implémentation d’outils.
Méthode simple : utiliser les outils intégrés
OpenClaw intègre les outils web_search et read, que vous pouvez utiliser directement en décrivant la méthode dans SKILL.md :
## Implementation Notes
To get weather data:
1. Use `web_search` tool to find weather API
2. Use `read` tool to fetch JSON response
3. Parse and format the data
Example search query: "weather API Paris current temperature"
Méthode avancée : script d’outil personnalisé
Créez src/index.js :
// src/index.js
const axios = require('axios');
const OPENWEATHER_BASE_URL = 'https://api.openweathermap.org/data/2.5';
async function weather_current({ city, units = 'metric', lang = 'fr' }, config) {
const apiKey = config.apiKey || process.env.OPENWEATHER_API_KEY;
if (!apiKey) {
throw new Error('OpenWeatherMap API key not configured');
}
try {
const response = await axios.get(`${OPENWEATHER_BASE_URL}/weather`, {
params: {
q: city,
appid: apiKey,
units,
lang
}
});
const data = response.data;
// Générer une suggestion basée sur les conditions
let suggestion = '';
if (data.rain || data.weather[0].main === 'Rain') {
suggestion = 'Prenez un parapluie, de la pluie est prévue';
} else if (data.main.temp < 15) {
suggestion = 'Habillez-vous chaudement, la température est basse';
} else if (data.main.temp > 30) {
suggestion = 'Restez hydraté, la température est élevée';
} else {
suggestion = 'Temps agréable, profitez de votre journée';
}
return {
city: data.name,
country: data.sys.country,
temperature: data.main.temp,
feels_like: data.main.feels_like,
humidity: data.main.humidity,
wind_speed: data.wind.speed,
condition: data.weather[0].description,
icon: data.weather[0].icon,
suggestion
};
} catch (error) {
if (error.response?.status === 404) {
throw new Error(`City "${city}" not found. Please check the spelling.`);
}
throw error;
}
}
async function weather_forecast({ city, days = 3, units = 'metric' }, config) {
const apiKey = config.apiKey || process.env.OPENWEATHER_API_KEY;
if (!apiKey) {
throw new Error('OpenWeatherMap API key not configured');
}
try {
const response = await axios.get(`${OPENWEATHER_BASE_URL}/forecast`, {
params: {
q: city,
appid: apiKey,
units,
cnt: days * 8 // 8 forecasts per day (every 3 hours)
}
});
const data = response.data;
// Regrouper par jour et obtenir un résumé quotidien
const dailyForecasts = {};
data.list.forEach(item => {
const date = item.dt_txt.split(' ')[0];
if (!dailyForecasts[date]) {
dailyForecasts[date] = {
temp_high: item.main.temp_max,
temp_low: item.main.temp_min,
conditions: [item.weather[0].main],
rain_chance: item.pop * 100
};
} else {
dailyForecasts[date].temp_high = Math.max(dailyForecasts[date].temp_high, item.main.temp_max);
dailyForecasts[date].temp_low = Math.min(dailyForecasts[date].temp_low, item.main.temp_min);
if (!dailyForecasts[date].conditions.includes(item.weather[0].main)) {
dailyForecasts[date].conditions.push(item.weather[0].main);
}
dailyForecasts[date].rain_chance = Math.max(dailyForecasts[date].rain_chance, item.pop * 100);
}
});
return {
city: data.city.name,
forecast: Object.entries(dailyForecasts)
.slice(0, days)
.map(([date, info]) => ({
date,
temp_high: Math.round(info.temp_high),
temp_low: Math.round(info.temp_low),
condition: info.conditions.join('/'),
rain_chance: Math.round(info.rain_chance)
}))
};
} catch (error) {
if (error.response?.status === 404) {
throw new Error(`City "${city}" not found. Please check the spelling.`);
}
throw error;
}
}
module.exports = {
weather_current,
weather_forecast
};
package.json
{
"name": "weather-api",
"version": "1.0.0",
"description": "Weather API skill for OpenClaw",
"main": "src/index.js",
"dependencies": {
"axios": "^1.6.0"
},
"openclaw": {
"skill": "weather-api",
"tools": ["weather_current", "weather_forecast"]
}
}
Tester la compétence
Test local
# Valider la syntaxe du SKILL.md
openclaw skill validate weather-api
# Exemple de sortie :
# ✅ Frontmatter valid
# ✅ Triggers defined
# ✅ Description present
# ✅ Tools documented
# Charger la compétence
openclaw skill load weather-api
# Tester la compétence
openclaw agent --message "Quel temps fait-il à Paris aujourd'hui"
# Vous devriez voir les informations météo
Mode débogage
# Activer les logs de débogage
openclaw gateway --verbose --filter skill:weather-api
# Voir les logs de chargement de la compétence
openclaw logs --skill weather-api
Scénarios de test
| Scénario de test | Entrée | Sortie attendue |
|---|---|---|
| Ville en français | “Météo à Paris” | Informations météo de Paris |
| Ville en anglais | “Weather in Tokyo” | Informations météo de Tokyo |
| Requête de prévision | “Va-t-il pleuvoir demain” | Prévisions météo du lendemain |
| Conseil vestimentaire | “Comment s’habiller aujourd’hui” | Suggestion basée sur la météo |
| Gestion d’erreur | “Météo xxx” | Message ville introuvable |
Publier la compétence
Préparation de la publication
- Compléter la documentation : s’assurer que le README.md est complet
- Ajouter des exemples : fournir des exemples d’utilisation
- Tests approfondis : couvrir tous les cas limites
- Nettoyer les données sensibles : supprimer les API Key, etc.
Publication sur GitHub
# Initialiser Git
git init
git add .
git commit -m "Initial release of weather-api skill"
# Pousser vers GitHub
git remote add origin https://github.com/your-username/weather-api.git
git push -u origin main
# Créer un tag de release
git tag v1.0.0
git push origin v1.0.0
Soumettre sur ClawHub
# Publier sur ClawHub
openclaw skill publish weather-api
# Exemple de sortie :
# Validating skill...
# ✅ Validation passed
# Publishing to ClawHub...
# ✅ Published successfully!
#
# Your skill is now available at:
# https://clawhub.com/skills/weather-api
Modèle de README.md
# Weather API Skill for OpenClaw
Query weather information from OpenWeatherMap API.
## Features
- Current weather conditions
- 5-day weather forecast
- Multi-language city support
- Smart clothing suggestions
## Installation
\`\`\`bash
openclaw skill install weather-api
\`\`\`
## Configuration
Set your OpenWeatherMap API key:
\`\`\`bash
export OPENWEATHER_API_KEY="your-api-key"
\`\`\`
Or in OpenClaw config:
\`\`\`json
{
"skills": {
"weather-api": {
"apiKey": "your-api-key"
}
}
}
\`\`\`
## Usage
Just ask about the weather:
- "Quel temps fait-il à Paris"
- "What's the weather in Tokyo"
- "Va-t-il pleuvoir demain"
- "Dois-je prendre un parapluie"
## Requirements
- OpenWeatherMap API key (free tier: 1000 requests/day)
- Internet connection
## License
MIT
Techniques avancées
Déclenchement conditionnel
Décider du déclenchement en fonction du contexte :
## Advanced Triggers
This skill is triggered when:
1. User mentions weather-related keywords
2. User asks about temperature or conditions
3. User needs outdoor activity suggestions
Not triggered when:
- Weather is mentioned metaphorically ("I'm under the weather")
- User is asking about CPU temperature or other technical metrics
Mémoire du contexte
Ajouter la gestion du contexte dans SKILL.md :
## Context Handling
When user asks "What about tomorrow?" after a weather query:
1. Check previous context for city name
2. Use the same city for forecast query
When user asks "And in Lyon?" after querying another city:
1. Parse the new city name
2. Compare weather between both cities
Chaînage de compétences
Collaboration avec d’autres compétences :
## Skill Integration
This skill works well with:
- **calendar**: Suggest events based on weather
- **travel**: Provide weather for travel destinations
- **clothing**: Recommend outfits based on temperature
Example workflow:
User: "Planning a trip to Tokyo next week"
1. Travel skill: Parse destination and dates
2. Weather skill: Get Tokyo forecast
3. Calendar skill: Check existing events
4. Combined response: Trip summary with weather
Récupération après erreur
Gestion élégante des erreurs :
## Error Recovery
When API fails:
1. Check cache for recent data
2. Inform user about the issue
3. Offer alternatives:
- "I couldn't get live weather data. Want me to try again?"
- "The weather service is temporarily unavailable. Would you like a general forecast?"
When city not found:
1. Suggest similar city names
2. Ask for clarification
3. Use geolocation if available
Bonnes pratiques
Normes de documentation
| Exigence | Description |
|---|---|
| Description claire | Expliquer la fonction de la compétence en une phrase |
| Exemples suffisants | Couvrir les principaux scénarios d’utilisation |
| Guide de configuration | Décrire en détail les étapes de configuration |
| Gestion des erreurs | Lister les erreurs courantes et leurs solutions |
| Journal des versions | Maintenir un CHANGELOG |
Considérations de sécurité
## Security Notes
- Never hardcode API keys in SKILL.md
- Use environment variables or config files
- Validate and sanitize user input
- Rate limit API calls
- Log errors without exposing sensitive data
Optimisation des performances
## Performance Tips
- Cache API responses (10-minute default)
- Use async operations for multiple requests
- Minimize tool calls by batching
- Use compressed responses when available
Résumé
L’essentiel du développement de Skills :
- SKILL.md est l’âme : définition claire, description précise, exemples suffisants
- Les mots déclencheurs sont la clé : conception réfléchie, sans conflits, couverture des scénarios
- Les outils sont la capacité : implémentation complète, gestion des erreurs, optimisation des performances
- La documentation est le pont : aider les utilisateurs à comprendre et utiliser votre compétence
Grâce à cet article, vous maîtrisez désormais les bases du développement de Skills et pouvez commencer à créer des compétences personnalisées pour OpenClaw.
Résumé de cet article :
- Compréhension de la structure et des champs du SKILL.md
- Apprentissage des principes de conception des mots déclencheurs
- Maîtrise des méthodes d’implémentation d’outils
- Connaissance du processus de test et de publication
- Apprentissage des techniques avancées et des bonnes pratiques
Historique des mises à jour :
- 2026-02-26 : publication initiale, basée sur OpenClaw v2026.2
Navigation de la série :
- ← Précédent : Le système de Skills en détail
- → Suivant : Personnalisation de l’Agent : AGENTS.md et SOUL.md