Passer au contenu principal

Documentation Index

Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt

Use this file to discover all available pages before exploring further.

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 d’images, génération de vidéos, récupération web, recherche web, outils d’agent, ou toute combinaison. Vous n’avez pas besoin d’ajouter votre plugin au dépôt OpenClaw. Publiez-le sur ClawHub et les utilisateurs l’installent avec openclaw plugins install clawhub:<package-name>. Les spécifications de paquet nues continuent de s’installer depuis npm pendant la transition de lancement.

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 effectué. Le développement de plugins depuis un checkout source utilise uniquement pnpm, car OpenClaw charge les plugins groupés depuis les paquets d’espace de travail extensions/*.

Quel type de plugin ?

Channel plugin

Connecter OpenClaw à une plateforme de messagerie (Discord, IRC, etc.)

Provider plugin

Ajouter un fournisseur de modèles (LLM, proxy ou endpoint personnalisé)

CLI backend plugin

Mapper une CLI IA locale vers le runner de repli textuel d’OpenClaw

Tool / hook plugin

Enregistrer des outils d’agent, des hooks d’événements ou des services - continuez ci-dessous
Pour un plugin de canal qui n’est pas garanti d’être installé quand l’intégration/la configuration s’exécute, utilisez createOptionalChannelSetupSurface(...) depuis openclaw/plugin-sdk/channel-setup. Il produit une paire adaptateur de configuration + assistant qui annonce l’exigence d’installation et échoue de manière fermée lors des écritures de configuration réelles tant que le plugin n’est pas installé.

Démarrage rapide : plugin d’outil

Ce guide crée un plugin minimal qui enregistre un outil d’agent. Les plugins de canal et de fournisseur ont des guides dédiés liés ci-dessus.
1

Create the package and manifest

{
  "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"
    }
  }
}
Chaque plugin nécessite un manifeste, même sans configuration. Les outils enregistrés à l’exécution doivent être listés dans contracts.tools afin qu’OpenClaw puisse découvrir le plugin propriétaire sans charger chaque runtime de plugin. Les plugins doivent aussi déclarer activation.onStartup intentionnellement. Cet exemple le définit à true. Voir Manifest pour le schéma complet. Les extraits canoniques de publication ClawHub se trouvent dans docs/snippets/plugin-publish/.
2

Write the entry point

// 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: "Adds a custom tool to OpenClaw",
  register(api) {
    api.registerTool({
      name: "my_tool",
      description: "Do a thing",
      parameters: Type.Object({ input: Type.String() }),
      async execute(_id, params) {
        return { content: [{ type: "text", text: `Got: ${params.input}` }] };
      },
    });
  },
});
definePluginEntry concerne les plugins qui ne sont pas des canaux. Pour les canaux, utilisez defineChannelPluginEntry - voir Plugins de canal. Pour les options complètes du point d’entrée, voir Points d’entrée.
3

Test and publish

Plugins externes : validez et publiez avec ClawHub, puis installez :
clawhub package publish your-org/your-plugin --dry-run
clawhub package publish your-org/your-plugin
openclaw plugins install clawhub:@myorg/openclaw-my-plugin
Les spécifications de paquet nues comme @myorg/openclaw-my-plugin s’installent depuis npm pendant la transition de lancement. Utilisez clawhub: lorsque vous voulez la résolution ClawHub.Plugins dans le dépôt : placez-les sous l’arborescence d’espace de travail des plugins groupés - ils sont découverts automatiquement.
pnpm test -- <bundled-plugin-root>/my-plugin/

Capacités des plugins

Un seul plugin peut enregistrer autant de capacités que nécessaire via l’objet api :
CapacitéMéthode d’enregistrementGuide détaillé
Inférence textuelle (LLM)api.registerProvider(...)Plugins de fournisseur
Backend d’inférence CLIapi.registerCliBackend(...)Plugins de backend CLI
Canal / messagerieapi.registerChannel(...)Plugins de canal
Parole (TTS/STT)api.registerSpeechProvider(...)Plugins de fournisseur
Transcription en temps réelapi.registerRealtimeTranscriptionProvider(...)Plugins de fournisseur
Voix en temps réelapi.registerRealtimeVoiceProvider(...)Plugins de fournisseur
Compréhension des médiasapi.registerMediaUnderstandingProvider(...)Plugins de fournisseur
Génération d’imagesapi.registerImageGenerationProvider(...)Plugins de fournisseur
Génération de musiqueapi.registerMusicGenerationProvider(...)Plugins de fournisseur
Génération de vidéosapi.registerVideoGenerationProvider(...)Plugins de fournisseur
Récupération webapi.registerWebFetchProvider(...)Plugins de fournisseur
Recherche webapi.registerWebSearchProvider(...)Plugins de fournisseur
Middleware de résultat d’outilapi.registerAgentToolResultMiddleware(...)Vue d’ensemble du SDK
Outils d’agentapi.registerTool(...)Ci-dessous
Commandes personnaliséesapi.registerCommand(...)Points d’entrée
Hooks de pluginapi.on(...)Hooks de plugin
Hooks d’événements internesapi.registerHook(...)Points d’entrée
Routes HTTPapi.registerHttpRoute(...)Internes
Sous-commandes CLIapi.registerCli(...)Points d’entrée
Pour l’API d’enregistrement complète, voir Vue d’ensemble du SDK. Les plugins groupés peuvent utiliser api.registerAgentToolResultMiddleware(...) lorsqu’ils ont besoin d’une réécriture asynchrone des résultats d’outils avant que le modèle voie la sortie. Déclarez les runtimes ciblés dans contracts.agentToolResultMiddleware, par exemple ["pi", "codex"]. Il s’agit d’un seam de plugin groupé de confiance ; les plugins externes devraient préférer les hooks de plugin OpenClaw ordinaires, sauf si OpenClaw ajoute une politique de confiance explicite pour cette capacité. Si votre plugin enregistre des méthodes RPC de gateway personnalisées, gardez-les sous un préfixe propre au plugin. Les espaces de noms d’administration 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 garde-fous de hook à garder en tête :
  • before_tool_call : { block: true } est terminal et arrête les gestionnaires de priorité inférieure.
  • before_tool_call : { block: false } est traité comme une absence de décision.
  • before_tool_call : { requireApproval: true } met en pause l’exécution de l’agent et demande l’approbation de l’utilisateur via la superposition d’approbation exec, les boutons Telegram, les interactions Discord ou la commande /approve sur n’importe quel canal.
  • before_install : { block: true } est terminal et arrête les gestionnaires de priorité inférieure.
  • before_install : { block: false } est traité comme une absence de décision.
  • message_sending : { cancel: true } est terminal et arrête les gestionnaires de priorité inférieure.
  • message_sending : { cancel: false } est traité comme une absence de décision.
  • message_received : préférez le champ typé threadId lorsque vous avez besoin du routage entrant de fil/sujet. Gardez metadata pour les extras propres au canal.
  • message_sending : préférez les champs de routage typés replyToId / threadId aux clés de métadonnées propres au canal.
La commande /approve gère à la fois les approbations exec et plugin avec un repli borné : lorsqu’un identifiant d’approbation 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 d’approbation personnalisée doit détecter ce même cas de repli borné, préférez isApprovalNotFoundError depuis openclaw/plugin-sdk/error-runtime au lieu de faire correspondre manuellement les chaînes d’expiration d’approbation. Voir Hooks de plugin pour des exemples et la référence des hooks.

Enregistrement des outils d’agent

Les outils sont des fonctions typées que le LLM peut appeler. Ils peuvent être requis (toujours disponibles) ou optionnels (activation par l’utilisateur) :
register(api) {
  // Required tool - always available
  api.registerTool({
    name: "my_tool",
    description: "Do a thing",
    parameters: Type.Object({ input: Type.String() }),
    async execute(_id, params) {
      return { content: [{ type: "text", text: params.input }] };
    },
  });

  // Optional tool - user must add to allowlist
  api.registerTool(
    {
      name: "workflow_tool",
      description: "Run a workflow",
      parameters: Type.Object({ pipeline: Type.String() }),
      async execute(_id, params) {
        return { content: [{ type: "text", text: params.pipeline }] };
      },
    },
    { optional: true },
  );
}
Les fabriques d’outils reçoivent un objet de contexte fourni par le runtime. Utilisez ctx.activeModel lorsqu’un outil doit journaliser, afficher ou s’adapter au modèle actif pour le tour actuel. L’objet peut inclure provider, modelId et modelRef. Traitez-le comme des métadonnées de runtime informatives, et non comme une frontière de sécurité contre l’opérateur local, le code de plugin installé ou un runtime OpenClaw modifié. Pour les outils locaux sensibles, conservez une activation explicite par le plugin ou l’opérateur et échouez de manière fermée lorsque les métadonnées du modèle actif sont absentes ou inadaptées. Chaque outil enregistré avec api.registerTool(...) doit également être déclaré dans le manifeste du plugin :
{
  "contracts": {
    "tools": ["my_tool", "workflow_tool"]
  },
  "toolMetadata": {
    "workflow_tool": {
      "optional": true
    }
  }
}
OpenClaw capture et met en cache le descripteur validé de l’outil enregistré, afin que les plugins ne dupliquent pas les données description ou de schéma dans le manifeste. Le contrat de manifeste déclare uniquement la propriété et la découverte ; l’exécution appelle toujours l’implémentation vivante de l’outil enregistré. Définissez toolMetadata.<tool>.optional: true pour les outils enregistrés avec api.registerTool(..., { optional: true }) afin qu’OpenClaw puisse éviter de charger ce runtime de plugin tant que l’outil n’est pas explicitement placé dans la liste d’autorisation. Les utilisateurs activent les outils optionnels dans la configuration :
{
  tools: { allow: ["workflow_tool"] },
}
  • Les noms d’outils ne doivent pas entrer en conflit avec les outils du cœur (les conflits sont ignorés)
  • Les outils dont les objets d’enregistrement sont mal formés, y compris ceux auxquels il manque parameters, sont ignorés et signalés dans les diagnostics de plugin au lieu d’interrompre les exécutions d’agent
  • Utilisez optional: true pour les outils avec des effets de bord ou des exigences binaires supplémentaires
  • Les utilisateurs peuvent activer tous les outils d’un plugin en ajoutant l’identifiant du plugin à tools.allow

Enregistrement de commandes CLI

Les plugins peuvent ajouter des groupes de commandes racine openclaw avec api.registerCli. Fournissez des descriptors pour chaque racine de commande de premier niveau afin qu’OpenClaw puisse afficher et router la commande sans charger avidement chaque runtime de plugin.
register(api) {
  api.registerCli(
    ({ program }) => {
      const demo = program
        .command("demo-plugin")
        .description("Run demo plugin commands");

      demo
        .command("ping")
        .description("Check that the plugin CLI is executable")
        .action(() => {
          console.log("demo-plugin:pong");
        });
    },
    {
      descriptors: [
        {
          name: "demo-plugin",
          description: "Run demo plugin commands",
          hasSubcommands: true,
        },
      ],
    },
  );
}
Après l’installation, vérifiez l’enregistrement du runtime et exécutez la commande :
openclaw plugins inspect demo-plugin --runtime --json
openclaw demo-plugin ping

Conventions d’importation

Importez toujours depuis les chemins ciblés openclaw/plugin-sdk/<subpath> :
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";

// Wrong: monolithic root (deprecated, will be removed)
import { ... } from "openclaw/plugin-sdk";
Pour la référence complète des sous-chemins, consultez Vue d’ensemble du SDK. Dans votre plugin, utilisez des fichiers barrel locaux (api.ts, runtime-api.ts) pour les imports internes - n’importez jamais votre propre plugin via son chemin SDK. Pour les plugins de fournisseur, conservez les helpers propres au fournisseur dans ces barrels à la racine du paquet, sauf si la jonction est réellement générique. Exemples intégrés actuels :
  • Anthropic : wrappers de flux Claude et helpers service_tier / bêta
  • OpenAI : constructeurs de fournisseur, helpers de modèle par défaut, fournisseurs temps réel
  • OpenRouter : constructeur de fournisseur et helpers d’onboarding/configuration
Si un helper n’est utile qu’à l’intérieur d’un seul paquet de fournisseur intégré, conservez-le sur cette jonction à la racine du paquet au lieu de le promouvoir dans openclaw/plugin-sdk/*. Certaines jonctions de helpers générées openclaw/plugin-sdk/<bundled-id> existent encore pour la maintenance des plugins intégrés lorsqu’elles ont un usage propriétaire suivi. Traitez-les comme des surfaces réservées, et non comme le modèle par défaut pour les nouveaux plugins tiers.

Liste de vérification avant soumission

package.json contient les métadonnées openclaw correctes
Le manifeste openclaw.plugin.json est présent et valide
Le point d’entré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 version bêta

  1. Surveillez les tags de version GitHub sur openclaw/openclaw et abonnez-vous via Watch > Releases. Les tags bêta ressemblent à v2026.3.N-beta.1. Vous pouvez également activer les notifications du compte X officiel d’OpenClaw @openclaw pour les annonces de version.
  2. Testez votre plugin avec le tag bêta dès son apparition. La fenêtre avant la version stable n’est généralement que de quelques heures.
  3. Publiez dans le fil de votre plugin dans le canal Discord plugin-forum après les tests avec soit all good, soit ce qui a cassé. Si vous n’avez 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. Mettez le lien de l’issue dans votre fil.
  5. Ouvrez une PR vers main intitulée fix(<plugin-id>): beta blocker - <summary> et liez l’issue à la fois dans la PR et dans votre fil Discord. Les contributeurs ne peuvent pas étiqueter les PR, donc le titre sert de signal côté PR pour les mainteneurs et l’automatisation. Les bloqueurs avec une PR sont fusionnés ; ceux sans PR peuvent tout de même être livrés. Les mainteneurs surveillent ces fils pendant les tests bêta.
  6. Le silence signifie vert. Si vous manquez la fenêtre, votre correctif atterrira probablement dans le cycle suivant.

Étapes suivantes

Plugins de canal

Créer un plugin de canal de messagerie

Plugins de fournisseur

Créer un plugin de fournisseur de modèles

Plugins backend CLI

Enregistrer un backend CLI d’IA local

Vue d’ensemble du SDK

Référence de la carte d’importation et de l’API d’enregistrement

Helpers de runtime

TTS, recherche, sous-agent via api.runtime

Tests

Utilitaires et modèles de test

Manifeste de plugin

Référence complète du schéma de manifeste

Connexe