FrameworksAgents.com Logo

10 exemples de skills OpenClaw concrets

Guidecalendar_todayPublié le 7 mars 2026schedule8 min de lectureskills openclaw examplescréer skill openclaw

Découvrez 10 exemples de skills OpenClaw prêts à l'emploi : scraping, recherche, notifications Slack, Gmail, SQL, PDF et bien plus. Code Python inclus.

10 exemples de skills OpenClaw concrets

Les skills sont le mécanisme par lequel un agent OpenClaw agit sur le monde extérieur : interroger une API, lire une boîte mail, écrire dans une base de données. Sans skills, un agent ne fait que raisonner sans pouvoir produire d'effet. Ce guide présente 10 skills concrets, chacun avec son code Python minimal et ses cas d'usage, pour vous donner une base de travail immédiatement opérationnelle.

Pourquoi les skills sont au cœur d'OpenClaw

Dans l'architecture d'OpenClaw, un agent reçoit une tâche, raisonne sur les étapes à suivre, puis délègue chaque action à un skill. Le skill est une classe Python qui hérite de BaseSkill et implémente une méthode execute(). Ce découplage permet trois choses :

  • Réutilisabilité : un WebScraperSkill peut être partagé entre dix agents différents.
  • Testabilité : chaque skill peut être testé unitairement, indépendamment du LLM.
  • Composabilité : un agent combine plusieurs skills pour accomplir des tâches complexes sans que le code de l'agent lui-même ne grossisse.

La structure minimale d'un skill OpenClaw :

from openclaw.skills import BaseSkill, SkillResult

class MonSkill(BaseSkill):
    name = "mon_skill"
    description = "Description utilisée par le LLM pour choisir ce skill."

    def execute(self, **kwargs) -> SkillResult:
        # logique ici
        return SkillResult(success=True, data={})

Pour la documentation complète de l'API, consultez Skills OpenClaw.

Les 10 exemples

1. WebScraperSkill

Description : extrait le contenu textuel d'une page web en filtrant le bruit (navigation, publicités, pied de page).

import httpx
from bs4 import BeautifulSoup
from openclaw.skills import BaseSkill, SkillResult

class WebScraperSkill(BaseSkill):
    name = "web_scraper"
    description = "Extrait le texte principal d'une URL donnée."

    def execute(self, url: str) -> SkillResult:
        response = httpx.get(url, timeout=15, follow_redirects=True)
        soup = BeautifulSoup(response.text, "html.parser")
        for tag in soup(["script", "style", "nav", "footer"]):
            tag.decompose()
        text = soup.get_text(separator="\n", strip=True)
        return SkillResult(success=True, data={"text": text[:8000], "url": url})

Cas d'usage : veille concurrentielle, extraction de contenu pour résumé, analyse de pages SERP.


2. BraveSearchSkill

Description : interroge l'API Brave Search pour obtenir les 10 premiers résultats organiques sur une requête.

import httpx
from openclaw.skills import BaseSkill, SkillResult

class BraveSearchSkill(BaseSkill):
    name = "brave_search"
    description = "Recherche sur le web via Brave Search API."

    def execute(self, query: str, count: int = 10) -> SkillResult:
        headers = {"X-Subscription-Token": self.config["BRAVE_API_KEY"]}
        params = {"q": query, "count": count, "lang": "fr"}
        r = httpx.get("https://api.search.brave.com/res/v1/web/search",
                       headers=headers, params=params, timeout=10)
        results = [{"title": h["title"], "url": h["url"]}
                   for h in r.json().get("web", {}).get("results", [])]
        return SkillResult(success=True, data={"results": results, "query": query})

Cas d'usage : analyse SERP, recherche d'informations factuelles, collecte de sources pour un article.


3. SlackNotifierSkill

Description : envoie un message dans un canal Slack via l'API Webhooks.

import httpx
from openclaw.skills import BaseSkill, SkillResult

class SlackNotifierSkill(BaseSkill):
    name = "slack_notifier"
    description = "Envoie une notification dans un canal Slack."

    def execute(self, message: str, channel: str = "#agents") -> SkillResult:
        webhook_url = self.config["SLACK_WEBHOOK_URL"]
        payload = {"text": message, "channel": channel}
        r = httpx.post(webhook_url, json=payload, timeout=10)
        success = r.status_code == 200
        return SkillResult(success=success, data={"status": r.status_code})

Cas d'usage : alertes sur fin de tâche, rapport quotidien automatique, notification d'erreur critique d'un agent.


4. GmailReaderSkill

Description : lit les N derniers e-mails non lus d'une boîte Gmail via l'API Google.

from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from openclaw.skills import BaseSkill, SkillResult

class GmailReaderSkill(BaseSkill):
    name = "gmail_reader"
    description = "Récupère les e-mails non lus depuis Gmail."

    def execute(self, max_results: int = 5) -> SkillResult:
        creds = Credentials.from_authorized_user_file("token.json")
        service = build("gmail", "v1", credentials=creds)
        results = service.users().messages().list(
            userId="me", labelIds=["UNREAD"], maxResults=max_results
        ).execute()
        messages = results.get("messages", [])
        emails = []
        for msg in messages:
            detail = service.users().messages().get(
                userId="me", id=msg["id"], format="metadata"
            ).execute()
            headers = {h["name"]: h["value"] for h in detail["payload"]["headers"]}
            emails.append({"from": headers.get("From"), "subject": headers.get("Subject")})
        return SkillResult(success=True, data={"emails": emails})

Cas d'usage : triage automatique des e-mails entrants, extraction de leads, monitoring de boîte support.


5. SQLQuerySkill

Description : exécute une requête SQL en lecture seule sur une base PostgreSQL et retourne les résultats.

import psycopg2
from openclaw.skills import BaseSkill, SkillResult

class SQLQuerySkill(BaseSkill):
    name = "sql_query"
    description = "Exécute une requête SQL SELECT sur la base de données."

    def execute(self, query: str) -> SkillResult:
        if not query.strip().upper().startswith("SELECT"):
            return SkillResult(success=False, data={"error": "Seules les requêtes SELECT sont autorisées."})
        conn = psycopg2.connect(self.config["DATABASE_URL"])
        with conn.cursor() as cur:
            cur.execute(query)
            rows = cur.fetchall()
            columns = [desc[0] for desc in cur.description]
        conn.close()
        return SkillResult(success=True, data={"columns": columns, "rows": rows})

Cas d'usage : génération de rapports, analyse de données métier, réponse à des questions business en langage naturel.


6. PDFExtractorSkill

Description : extrait le texte d'un fichier PDF local ou distant.

import httpx
import pdfplumber
import io
from openclaw.skills import BaseSkill, SkillResult

class PDFExtractorSkill(BaseSkill):
    name = "pdf_extractor"
    description = "Extrait le texte d'un fichier PDF (chemin local ou URL)."

    def execute(self, source: str) -> SkillResult:
        if source.startswith("http"):
            content = httpx.get(source, timeout=30).content
            file_obj = io.BytesIO(content)
        else:
            file_obj = open(source, "rb")
        with pdfplumber.open(file_obj) as pdf:
            text = "\n".join(page.extract_text() or "" for page in pdf.pages)
        return SkillResult(success=True, data={"text": text, "pages": len(pdf.pages)})

Cas d'usage : analyse de contrats, extraction de données depuis des rapports PDF, indexation de documentation.


7. OpenAISummarySkill

Description : génère un résumé structuré d'un texte long via l'API OpenAI.

from openai import OpenAI
from openclaw.skills import BaseSkill, SkillResult

class OpenAISummarySkill(BaseSkill):
    name = "openai_summary"
    description = "Résume un texte en points clés via GPT-4o."

    def execute(self, text: str, max_points: int = 5) -> SkillResult:
        client = OpenAI(api_key=self.config["OPENAI_API_KEY"])
        prompt = f"Résume ce texte en {max_points} points clés en français :\n\n{text[:6000]}"
        response = client.chat.completions.create(
            model="gpt-4o",
            messages=[{"role": "user", "content": prompt}],
            temperature=0.3,
        )
        summary = response.choices[0].message.content
        return SkillResult(success=True, data={"summary": summary})

Cas d'usage : condensation de longs documents, génération de TL;DR, préparation de briefings.


8. TwitterMonitorSkill

Description : surveille les mentions d'un mot-clé sur X (Twitter) via l'API v2.

import httpx
from openclaw.skills import BaseSkill, SkillResult

class TwitterMonitorSkill(BaseSkill):
    name = "twitter_monitor"
    description = "Récupère les tweets récents pour un mot-clé donné."

    def execute(self, keyword: str, max_results: int = 10) -> SkillResult:
        headers = {"Authorization": f"Bearer {self.config['TWITTER_BEARER_TOKEN']}"}
        params = {"query": keyword, "max_results": max_results,
                  "tweet.fields": "created_at,author_id,text"}
        r = httpx.get("https://api.twitter.com/2/tweets/search/recent",
                       headers=headers, params=params, timeout=10)
        tweets = r.json().get("data", [])
        return SkillResult(success=True, data={"tweets": tweets, "keyword": keyword})

Cas d'usage : veille de marque, détection de sujets viraux, monitoring de mentions concurrentes.


9. CalendarSkill

Description : crée un événement dans Google Calendar via l'API Google.

from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from openclaw.skills import BaseSkill, SkillResult

class CalendarSkill(BaseSkill):
    name = "calendar"
    description = "Crée un événement dans Google Calendar."

    def execute(self, title: str, start: str, end: str, description: str = "") -> SkillResult:
        creds = Credentials.from_authorized_user_file("token.json")
        service = build("calendar", "v3", credentials=creds)
        event = {
            "summary": title,
            "description": description,
            "start": {"dateTime": start, "timeZone": "Europe/Paris"},
            "end": {"dateTime": end, "timeZone": "Europe/Paris"},
        }
        result = service.events().insert(calendarId="primary", body=event).execute()
        return SkillResult(success=True, data={"event_id": result["id"], "link": result["htmlLink"]})

Cas d'usage : planification automatique de réunions, rappels générés par un agent, organisation de workflows récurrents.


10. DataFormatterSkill

Description : normalise et formate des données brutes (JSON, CSV, texte) dans un schéma cible défini.

import json
import csv
import io
from openclaw.skills import BaseSkill, SkillResult

class DataFormatterSkill(BaseSkill):
    name = "data_formatter"
    description = "Convertit des données brutes en JSON structuré selon un schéma."

    def execute(self, data: str, input_format: str = "csv", schema: dict = None) -> SkillResult:
        if input_format == "csv":
            reader = csv.DictReader(io.StringIO(data))
            rows = list(reader)
        elif input_format == "json":
            rows = json.loads(data)
        else:
            return SkillResult(success=False, data={"error": f"Format non supporté : {input_format}"})
        if schema:
            rows = [{k: row.get(v) for k, v in schema.items()} for row in rows]
        return SkillResult(success=True, data={"rows": rows, "count": len(rows)})

Cas d'usage : normalisation de données issues de sources hétérogènes, transformation avant insertion en base, pipeline ETL léger.


Choisir ses skills selon son use case

Tous les skills ne sont pas utiles dans toutes les situations. Voici une grille de sélection rapide :

Use caseSkills recommandés
Veille concurrentielleBraveSearchSkill, WebScraperSkill, TwitterMonitorSkill
Automatisation e-mailGmailReaderSkill, SlackNotifierSkill
Analyse de donnéesSQLQuerySkill, DataFormatterSkill, OpenAISummarySkill
Traitement documentairePDFExtractorSkill, OpenAISummarySkill, DataFormatterSkill
Productivité personnelleCalendarSkill, GmailReaderSkill, SlackNotifierSkill

Un agent efficace combine généralement 2 à 4 skills complémentaires. Au-delà, le LLM peut avoir du mal à choisir le bon outil, surtout si les descriptions se chevauchent. Soignez la description de chaque skill : c'est ce que le LLM lit pour décider lequel appeler.

Bonnes pratiques

Gestion des erreurs : chaque skill doit retourner un SkillResult(success=False, data={"error": ...}) plutôt que lever une exception non gérée. L'agent peut ainsi décider de réessayer ou d'emprunter un chemin alternatif.

Timeouts explicites : toujours définir un timeout sur les appels réseau. Un skill qui attend indéfiniment bloque l'agent entier.

Secrets via config : accédez aux clés API via self.config["MA_CLE"] et non via os.environ directement. OpenClaw injecte automatiquement les variables d'environnement dans self.config, ce qui facilite les tests unitaires avec des valeurs mockées.

Tests unitaires : testez chaque skill indépendamment avec des données de test, sans instancier d'agent. Moquez les appels réseau avec httpx.MockTransport ou unittest.mock.

Versioning des skills : ajoutez un attribut version = "1.0.0" à vos skills. Cela facilite le débogage quand plusieurs versions coexistent dans un projet.

Pour aller plus loin sur les skills API et les patterns avancés, consultez Skills API et le Guide complet OpenClaw.

Conclusion

Ces 10 skills couvrent la majorité des besoins courants en automatisation avec OpenClaw : recherche web, lecture d'e-mails, notifications, requêtes SQL, extraction de PDF et transformation de données. Chaque skill est volontairement minimal pour rester lisible et adaptable. Partez de ces bases, ajoutez votre gestion d'erreurs métier, et combinez-les dans vos agents pour automatiser des workflows réels.

Restez informé sur les agents IA

Nouveaux tutoriels, comparatifs et guides pratiques directement dans votre boîte mail.

homeAccueilcodeFrameworkssmart_toyAgentsmenu_bookTutorielsTwitter