Retour

07. OpenClaw : développer votre premier Skill

Cet article vous guide pas à pas dans le développement de votre premier Skill OpenClaw. De l'analyse de la structure SKILL.md aux exemples complets, couvrant la définition des compétences, la conception des mots-clés déclencheurs, l'intégration d'outils, les tests et la publication.

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-sendsend
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 :

  1. Consulter la météo actuelle
  2. Consulter les prévisions des prochains jours
  3. Supporter les noms de villes en plusieurs langues
  4. 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

  1. Compléter la documentation : s’assurer que le README.md est complet
  2. Ajouter des exemples : fournir des exemples d’utilisation
  3. Tests approfondis : couvrir tous les cas limites
  4. 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 :