docs/docs/fr/plugins/building-plugins.md
2026-04-05 12:58:42 +00:00

17 KiB
Raw Blame History

read_when sidebarTitle summary title x-i18n
Vous souhaitez créer un nouveau plugin OpenClaw
Vous avez besoin dun démarrage rapide pour le développement de plugins
Vous ajoutez un nouveau canal, fournisseur, outil ou une autre capacité à OpenClaw
Getting Started Créez votre premier plugin OpenClaw en quelques minutes Créer des plugins
generated_at model provider source_hash source_path workflow
2026-04-05T12:50:03Z gpt-5.4 openai 26e780d3f04270b79d1d8f8076d6c3c5031915043e78fb8174be921c6bdd60c9 plugins/building-plugins.md 15

Créer des plugins

Les plugins étendent OpenClaw avec de nouvelles capacités : canaux, fournisseurs de modèles, parole, transcription en temps réel, voix en temps réel, compréhension des médias, génération dimages, génération de vidéos, récupération web, recherche web, outils dagent, ou toute combinaison.

Vous navez pas besoin dajouter votre plugin au dépôt OpenClaw. Publiez-le sur ClawHub ou npm et les utilisateurs linstallent avec openclaw plugins install <package-name>. OpenClaw essaie dabord ClawHub puis bascule automatiquement vers npm.

Prérequis

  • Node >= 22 et un gestionnaire de paquets (npm ou pnpm)
  • Familiarité avec TypeScript (ESM)
  • Pour les plugins dans le dépôt : dépôt cloné et pnpm install exécuté

Quel type de plugin ?

Connecter OpenClaw à une plateforme de messagerie (Discord, IRC, etc.) Ajouter un fournisseur de modèles (LLM, proxy ou point de terminaison personnalisé) Enregistrer des outils dagent, des hooks dévénement ou des services — voir ci-dessous

Si un plugin de canal est facultatif et peut ne pas être installé lorsque lintégration guidée/la configuration sexécute, utilisez createOptionalChannelSetupSurface(...) depuis openclaw/plugin-sdk/channel-setup. Cela produit une paire adaptateur de configuration + assistant qui annonce lexigence dinstallation et échoue en mode fermé sur les vraies écritures de configuration tant que le plugin nest pas installé.

Démarrage rapide : plugin doutil

Cette procédure crée un plugin minimal qui enregistre un outil dagent. Les plugins de canal et de fournisseur ont des guides dédiés liés ci-dessus.

```json package.json { "name": "@myorg/openclaw-my-plugin", "version": "1.0.0", "type": "module", "openclaw": { "extensions": ["./index.ts"], "compat": { "pluginApi": ">=2026.3.24-beta.2", "minGatewayVersion": "2026.3.24-beta.2" }, "build": { "openclawVersion": "2026.3.24-beta.2", "pluginSdkVersion": "2026.3.24-beta.2" } } } ```
```json openclaw.plugin.json
{
  "id": "my-plugin",
  "name": "My Plugin",
  "description": "Ajoute un outil personnalisé à OpenClaw",
  "configSchema": {
    "type": "object",
    "additionalProperties": false
  }
}
```
</CodeGroup>

Chaque plugin a besoin dun manifeste, même sans configuration. Voir
[Manifest](/plugins/manifest) pour le schéma complet. Les extraits canoniques de publication ClawHub
se trouvent dans `docs/snippets/plugin-publish/`.
```typescript
// index.ts
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
import { Type } from "@sinclair/typebox";

export default definePluginEntry({
  id: "my-plugin",
  name: "My Plugin",
  description: "Ajoute un outil personnalisé à OpenClaw",
  register(api) {
    api.registerTool({
      name: "my_tool",
      description: "Faire une chose",
      parameters: Type.Object({ input: Type.String() }),
      async execute(_id, params) {
        return { content: [{ type: "text", text: `Reçu : ${params.input}` }] };
      },
    });
  },
});
```

`definePluginEntry` est destiné aux plugins non liés aux canaux. Pour les canaux, utilisez
`defineChannelPluginEntry` — voir [Plugins de canal](/plugins/sdk-channel-plugins).
Pour toutes les options de points dentrée, consultez [Points dentrée](/plugins/sdk-entrypoints).
**Plugins externes :** validez et publiez avec ClawHub, puis installez :

```bash
clawhub package publish your-org/your-plugin --dry-run
clawhub package publish your-org/your-plugin
openclaw plugins install clawhub:@myorg/openclaw-my-plugin
```

OpenClaw vérifie aussi ClawHub avant npm pour les spécifications de package brutes comme
`@myorg/openclaw-my-plugin`.

**Plugins dans le dépôt :** placez-les sous larborescence du workspace de plugins intégrés — découverte automatique.

```bash
pnpm test -- <bundled-plugin-root>/my-plugin/
```

Capacités des plugins

Un seul plugin peut enregistrer nimporte quel nombre de capacités via lobjet api :

Capacité Méthode denregistrement Guide détaillé
Inférence texte (LLM) api.registerProvider(...) Plugins de fournisseur
Backend dinférence CLI api.registerCliBackend(...) Backends CLI
Canal / messagerie api.registerChannel(...) Plugins de canal
Parole (TTS/STT) api.registerSpeechProvider(...) Plugins de fournisseur
Transcription temps réel api.registerRealtimeTranscriptionProvider(...) Plugins de fournisseur
Voix temps réel api.registerRealtimeVoiceProvider(...) Plugins de fournisseur
Compréhension des médias api.registerMediaUnderstandingProvider(...) Plugins de fournisseur
Génération dimages api.registerImageGenerationProvider(...) Plugins de fournisseur
Génération de vidéos api.registerVideoGenerationProvider(...) Plugins de fournisseur
Récupération web api.registerWebFetchProvider(...) Plugins de fournisseur
Recherche web api.registerWebSearchProvider(...) Plugins de fournisseur
Outils dagent api.registerTool(...) Ci-dessous
Commandes personnalisées api.registerCommand(...) Points dentrée
Hooks dévénement api.registerHook(...) Points dentrée
Routes HTTP api.registerHttpRoute(...) Internals
Sous-commandes CLI api.registerCli(...) Points dentrée

Pour lAPI denregistrement complète, consultez Vue densemble du SDK.

Si votre plugin enregistre des méthodes RPC Gateway personnalisées, gardez-les sur un préfixe propre au plugin. Les espaces de noms dadministration du cœur (config.*, exec.approvals.*, wizard.*, update.*) restent réservés et se résolvent toujours vers operator.admin, même si un plugin demande une portée plus étroite.

Sémantique des gardes de hooks à garder à lesprit :

  • before_tool_call : { block: true } est terminal et arrête les gestionnaires de priorité inférieure.
  • before_tool_call : { block: false } est traité comme aucune décision.
  • before_tool_call : { requireApproval: true } met en pause lexécution de lagent et demande une approbation à lutilisateur via la surcouche dapprobation exec, les boutons Telegram, les interactions Discord ou la commande /approve sur nimporte quel canal.
  • before_install : { block: true } est terminal et arrête les gestionnaires de priorité inférieure.
  • before_install : { block: false } est traité comme aucune décision.
  • message_sending : { cancel: true } est terminal et arrête les gestionnaires de priorité inférieure.
  • message_sending : { cancel: false } est traité comme aucune décision.

La commande /approve gère à la fois les approbations exec et plugin avec un repli borné : lorsquun identifiant dapprobation exec est introuvable, OpenClaw réessaie le même identifiant via les approbations plugin. Le transfert des approbations plugin peut être configuré indépendamment via approvals.plugin dans la configuration.

Si une plomberie dapprobation personnalisée doit détecter ce même cas de repli borné, préférez isApprovalNotFoundError depuis openclaw/plugin-sdk/error-runtime plutôt que de faire correspondre manuellement des chaînes dexpiration dapprobation.

Consultez Sémantique des décisions de hook dans la vue densemble du SDK pour plus de détails.

Enregistrement doutils dagent

Les outils sont des fonctions typées que le LLM peut appeler. Ils peuvent être requis (toujours disponibles) ou facultatifs (adhésion explicite de lutilisateur) :

register(api) {
  // Outil requis — toujours disponible
  api.registerTool({
    name: "my_tool",
    description: "Faire une chose",
    parameters: Type.Object({ input: Type.String() }),
    async execute(_id, params) {
      return { content: [{ type: "text", text: params.input }] };
    },
  });

  // Outil facultatif — lutilisateur doit lajouter à la liste dautorisation
  api.registerTool(
    {
      name: "workflow_tool",
      description: "Exécuter un workflow",
      parameters: Type.Object({ pipeline: Type.String() }),
      async execute(_id, params) {
        return { content: [{ type: "text", text: params.pipeline }] };
      },
    },
    { optional: true },
  );
}

Les utilisateurs activent les outils facultatifs dans la configuration :

{
  tools: { allow: ["workflow_tool"] },
}
  • Les noms doutils ne doivent pas entrer en conflit avec les outils du cœur (les conflits sont ignorés)
  • Utilisez optional: true pour les outils avec effets de bord ou exigences binaires supplémentaires
  • Les utilisateurs peuvent activer tous les outils dun plugin en ajoutant lidentifiant du plugin à tools.allow

Conventions dimport

Importez toujours depuis des chemins ciblés openclaw/plugin-sdk/<subpath> :

import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";

// Incorrect : racine monolithique (obsolète, sera supprimée)
import { ... } from "openclaw/plugin-sdk";

Pour la référence complète des sous-chemins, consultez Vue densemble du SDK.

À lintérieur de votre plugin, utilisez des fichiers barrel locaux (api.ts, runtime-api.ts) pour les imports internes — nimportez jamais votre propre plugin via son chemin SDK.

Pour les plugins de fournisseur, gardez les assistants spécifiques au fournisseur dans ces barrels à la racine du package, sauf si la jonction est réellement générique. Exemples intégrés actuels :

  • Anthropic : wrappers de flux Claude et assistants service_tier / bêta
  • OpenAI : constructeurs de fournisseurs, assistants de modèle par défaut, fournisseurs temps réel
  • OpenRouter : constructeur de fournisseur plus assistants dintégration guidée/configuration

Si un assistant nest utile quà lintérieur dun package de fournisseur intégré, gardez-le sur cette jonction à la racine du package au lieu de le promouvoir dans openclaw/plugin-sdk/*.

Certaines jonctions dassistants générées openclaw/plugin-sdk/<bundled-id> existent encore pour la maintenance et la compatibilité des plugins intégrés, par exemple plugin-sdk/feishu-setup ou plugin-sdk/zalo-setup. Traitez-les comme des surfaces réservées, pas comme le modèle par défaut pour les nouveaux plugins tiers.

Checklist avant soumission

package.json a les bonnes métadonnées openclaw Le manifeste openclaw.plugin.json est présent et valide Le point dentrée utilise defineChannelPluginEntry ou definePluginEntry Tous les imports utilisent des chemins ciblés plugin-sdk/<subpath> Les imports internes utilisent des modules locaux, pas des auto-imports SDK Les tests passent (pnpm test -- <bundled-plugin-root>/my-plugin/) pnpm check passe (plugins dans le dépôt)

Tests de publication bêta

  1. Surveillez les tags de publication GitHub sur openclaw/openclaw et abonnez-vous via Watch > Releases. Les tags bêta ressemblent à v2026.3.N-beta.1. Vous pouvez aussi activer les notifications pour le compte X officiel dOpenClaw @openclaw pour les annonces de publication.
  2. Testez votre plugin contre le tag bêta dès quil apparaît. La fenêtre avant stable nest généralement que de quelques heures.
  3. Publiez dans le fil de votre plugin dans le canal Discord plugin-forum après le test avec soit all good, soit ce qui a cassé. Si vous navez pas encore de fil, créez-en un.
  4. Si quelque chose casse, ouvrez ou mettez à jour une issue intitulée Beta blocker: <plugin-name> - <summary> et appliquez le label beta-blocker. Placez le lien de lissue dans votre fil.
  5. Ouvrez une PR vers main intitulée fix(<plugin-id>): beta blocker - <summary> et liez lissue à la fois dans la PR et dans votre fil Discord. Les contributeurs ne peuvent pas labelliser les PR, donc le titre est le signal côté PR pour les mainteneurs et lautomatisation. Les bloqueurs avec une PR sont fusionnés ; les bloqueurs sans PR peuvent quand même partir en publication. Les mainteneurs surveillent ces fils pendant les tests bêta.
  6. Le silence signifie vert. Si vous ratez la fenêtre, votre correctif arrivera probablement dans le cycle suivant.

Étapes suivantes

Créer un plugin de canal de messagerie Créer un plugin de fournisseur de modèles Référence de la table dimport et de lAPI denregistrement TTS, recherche, sous-agent via api.runtime Utilitaires et modèles de test Référence complète du schéma de manifeste

Lié