Plugin maintainer reference

Migration du SDK Plugin

OpenClaw est passĂ© d’une large couche de rĂ©trocompatibilitĂ© Ă  une architecture de Plugin moderne avec des imports ciblĂ©s et documentĂ©s. Si votre Plugin a Ă©tĂ© créé avant la nouvelle architecture, ce guide vous aide Ă  le migrer.

Ce qui change

L’ancien systĂšme de Plugin fournissait deux surfaces trĂšs ouvertes qui permettaient aux Plugins d’importer tout ce dont ils avaient besoin depuis un point d’entrĂ©e unique :

  • openclaw/plugin-sdk/compat - un import unique qui rĂ©exportait des dizaines d’assistants. Il a Ă©tĂ© introduit pour maintenir le fonctionnement des anciens Plugins basĂ©s sur des hooks pendant la construction de la nouvelle architecture de Plugin.
  • openclaw/plugin-sdk/infra-runtime - un large barrel d’assistants d’exĂ©cution qui mĂ©langeait Ă©vĂ©nements systĂšme, Ă©tat Heartbeat, files de livraison, assistants fetch/proxy, assistants de fichiers, types d’approbation et utilitaires sans rapport.
  • openclaw/plugin-sdk/config-runtime - un large barrel de compatibilitĂ© de configuration qui conserve encore des assistants directs de chargement/Ă©criture dĂ©prĂ©ciĂ©s pendant la fenĂȘtre de migration.
  • openclaw/extension-api - un pont qui donnait aux Plugins un accĂšs direct aux assistants cĂŽtĂ© hĂŽte, comme l’exĂ©cuteur d’agent intĂ©grĂ©.
  • api.registerEmbeddedExtensionFactory(...) - un hook d’extension groupĂ©e rĂ©servĂ© Ă  l’exĂ©cuteur intĂ©grĂ©, dĂ©sormais supprimĂ©, qui pouvait observer les Ă©vĂ©nements de l’exĂ©cuteur intĂ©grĂ© tels que tool_result.

Les larges surfaces d’import sont maintenant dĂ©prĂ©ciĂ©es. Elles fonctionnent encore Ă  l’exĂ©cution, mais les nouveaux Plugins ne doivent pas les utiliser, et les Plugins existants devraient migrer avant que la prochaine version majeure ne les supprime. L’API d’enregistrement de fabrique d’extension rĂ©servĂ©e Ă  l’exĂ©cuteur intĂ©grĂ© a Ă©tĂ© supprimĂ©e ; utilisez plutĂŽt un middleware de rĂ©sultat d’outil.

OpenClaw ne supprime ni ne rĂ©interprĂšte un comportement de Plugin documentĂ© dans le mĂȘme changement qui introduit un remplacement. Les changements de contrat incompatibles doivent d’abord passer par un adaptateur de compatibilitĂ©, des diagnostics, de la documentation et une fenĂȘtre de dĂ©prĂ©ciation. Cela s’applique aux imports SDK, champs de manifeste, API de configuration, hooks et comportements d’enregistrement Ă  l’exĂ©cution.

Pourquoi cela a changé

L’ancienne approche posait des problùmes :

  • DĂ©marrage lent - importer un assistant chargeait des dizaines de modules sans rapport
  • DĂ©pendances circulaires - les rĂ©exports larges facilitaient la crĂ©ation de cycles d’import
  • Surface d’API peu claire - aucun moyen de distinguer les exports stables des exports internes

Le SDK de Plugin moderne corrige cela : chaque chemin d’import (openclaw/plugin-sdk/\<subpath\>) est un petit module autonome, dotĂ© d’un objectif clair et d’un contrat documentĂ©.

Les coutures de commoditĂ© des anciens fournisseurs pour les canaux groupĂ©s ont Ă©galement disparu. Les coutures d’assistants de marque de canal Ă©taient des raccourcis privĂ©s du monorepo, pas des contrats de Plugin stables. Utilisez plutĂŽt des sous-chemins SDK gĂ©nĂ©riques et Ă©troits. Dans l’espace de travail du Plugin groupĂ©, gardez les assistants appartenant au fournisseur dans le propre api.ts ou runtime-api.ts de ce Plugin.

Exemples actuels de fournisseurs groupés :

  • Anthropic garde les assistants de flux propres Ă  Claude dans sa propre couture api.ts / contract-api.ts
  • OpenAI garde les constructeurs de fournisseur, les assistants de modĂšle par dĂ©faut et les constructeurs de fournisseur temps rĂ©el dans son propre api.ts
  • OpenRouter garde le constructeur de fournisseur et les assistants d’onboarding/configuration dans son propre api.ts

Plan de migration de Talk et de la voix en temps réel

Le code Talk pour la voix en temps rĂ©el, la tĂ©lĂ©phonie, les rĂ©unions et le navigateur passe d’une comptabilitĂ© des tours locale Ă  chaque surface Ă  un contrĂŽleur de session Talk partagĂ© exportĂ© par openclaw/plugin-sdk/realtime-voice. Le nouveau contrĂŽleur possĂšde l’enveloppe commune des Ă©vĂ©nements Talk, l’état de tour actif, l’état de capture, l’état de sortie audio, l’historique rĂ©cent des Ă©vĂ©nements et le rejet des tours obsolĂštes. Les Plugins fournisseurs doivent continuer Ă  possĂ©der les sessions temps rĂ©el propres au fournisseur ; les Plugins de surface doivent continuer Ă  possĂ©der la capture, la lecture, la tĂ©lĂ©phonie et les particularitĂ©s de rĂ©union.

Cette migration Talk est volontairement nette et incompatible :

  1. Garder les primitives partagées de contrÎleur/exécution dans plugin-sdk/realtime-voice.
  2. Migrer les surfaces groupĂ©es vers le contrĂŽleur partagĂ© : relais navigateur, transfert de salle gĂ©rĂ©e, temps rĂ©el d’appel vocal, STT en streaming d’appel vocal, temps rĂ©el Google Meet et push-to-talk natif.
  3. Remplacer les anciennes familles RPC Talk par l’API finale talk.session.* et talk.client.*.
  4. Annoncer un seul canal d’évĂ©nements Talk actif dans hello-ok.features.events du Gateway : talk.event.
  5. Supprimer l’ancien endpoint HTTP temps rĂ©el et tout chemin de remplacement des instructions au moment de la requĂȘte.

Le nouveau code ne devrait pas appeler createTalkEventSequencer(...) directement, sauf s’il implĂ©mente un adaptateur bas niveau ou un fixture de test. PrĂ©fĂ©rez le contrĂŽleur partagĂ© afin que les Ă©vĂ©nements limitĂ©s Ă  un tour ne puissent pas ĂȘtre Ă©mis sans identifiant de tour, que les appels turnEnd / turnCancel obsolĂštes ne puissent pas effacer un tour actif plus rĂ©cent, et que les Ă©vĂ©nements de cycle de vie de sortie audio restent cohĂ©rents entre la tĂ©lĂ©phonie, les rĂ©unions, le relais navigateur, le transfert de salle gĂ©rĂ©e et les clients Talk natifs.

La forme cible de l’API publique est :

typescript
// Gateway-owned Talk session API.await gateway.request("talk.session.create", {  mode: "realtime",  transport: "gateway-relay",  brain: "agent-consult",  sessionKey: "main",});await gateway.request("talk.session.appendAudio", { sessionId, audioBase64 });await gateway.request("talk.session.cancelOutput", { sessionId, reason: "barge-in" });await gateway.request("talk.session.submitToolResult", {  sessionId,  callId,  result: { status: "working" },  options: { willContinue: true },});await gateway.request("talk.session.submitToolResult", {  sessionId,  callId,  result: { status: "already_delivered" },  options: { suppressResponse: true },});await gateway.request("talk.session.submitToolResult", { sessionId, callId, result });await gateway.request("talk.session.close", { sessionId }); // Client-owned provider session API.await gateway.request("talk.client.create", {  mode: "realtime",  transport: "webrtc",  brain: "agent-consult",  sessionKey: "main",});await gateway.request("talk.client.toolCall", { sessionKey, callId, name, args });await gateway.request("talk.client.steer", { sessionKey, text, mode: "steer" });

Les sessions WebRTC/provider-websocket appartenant au navigateur utilisent talk.client.create, car le navigateur possĂšde la nĂ©gociation fournisseur et le transport mĂ©dia tandis que le Gateway possĂšde les identifiants, les instructions et la politique d’outils. talk.session.* est la surface commune gĂ©rĂ©e par le Gateway pour le temps rĂ©el gateway-relay, la transcription gateway-relay et les sessions STT/TTS natives managed-room.

Les anciennes configurations qui plaçaient les sĂ©lecteurs temps rĂ©el Ă  cĂŽtĂ© de talk.provider / talk.providers doivent ĂȘtre rĂ©parĂ©es avec openclaw doctor --fix ; l’exĂ©cution Talk ne rĂ©interprĂšte pas la configuration de fournisseur speech/TTS comme configuration de fournisseur temps rĂ©el.

Les combinaisons prises en charge par talk.session.create sont volontairement limitées :

Mode Transport Cerveau Propriétaire Notes
realtime gateway-relay agent-consult Gateway Audio fournisseur full-duplex relayĂ© par le Gateway ; les appels d’outils sont routĂ©s via l’outil agent-consult.
transcription gateway-relay none Gateway STT en streaming uniquement ; les appelants envoient l’audio d’entrĂ©e et reçoivent des Ă©vĂ©nements de transcription.
stt-tts managed-room agent-consult Salle native/client Salles de style push-to-talk et talkie-walkie oĂč le client possĂšde la capture/lecture et le Gateway possĂšde l’état de tour.
stt-tts managed-room direct-tools Salle native/client Mode de salle rĂ©servĂ© aux administrateurs pour les surfaces internes fiables qui exĂ©cutent directement les actions d’outil du Gateway.

Carte des méthodes supprimées :

Ancien Nouveau
talk.realtime.session talk.client.create
talk.realtime.toolCall talk.client.toolCall
talk.realtime.relayAudio talk.session.appendAudio
talk.realtime.relayCancel talk.session.cancelOutput ou talk.session.cancelTurn
talk.realtime.relayToolResult talk.session.submitToolResult
talk.realtime.relayStop talk.session.close
talk.transcription.session talk.session.create({ mode: "transcription" })
talk.transcription.relayAudio talk.session.appendAudio
talk.transcription.relayCancel talk.session.cancelTurn
talk.transcription.relayStop talk.session.close
talk.handoff.create talk.session.create({ transport: "managed-room" })
talk.handoff.join talk.session.join
talk.handoff.revoke talk.session.close

Le vocabulaire de contrÎle unifié est également volontairement étroit :

MĂ©thode S’applique Ă  Contrat
talk.session.appendAudio realtime/gateway-relay, transcription/gateway-relay Ajoute un fragment audio PCM en base64 Ă  la session fournisseur dĂ©tenue par la mĂȘme connexion Gateway.
talk.session.startTurn stt-tts/managed-room Démarre un tour utilisateur de salle gérée.
talk.session.endTurn stt-tts/managed-room Termine le tour actif aprĂšs validation des tours obsolĂštes.
talk.session.cancelTurn toutes les sessions détenues par le Gateway Annule le travail de capture/fournisseur/agent/TTS actif pour un tour.
talk.session.cancelOutput realtime/gateway-relay ArrĂȘte la sortie audio de l’assistant sans nĂ©cessairement terminer le tour utilisateur.
talk.session.submitToolResult realtime/gateway-relay Termine un appel d’outil fournisseur Ă©mis par le relais ; passez options.willContinue pour une sortie intermĂ©diaire ou options.suppressResponse pour satisfaire l’appel sans autre rĂ©ponse de l’assistant.
talk.session.steer sessions Talk adossĂ©es Ă  un agent Envoie une commande vocale status, steer, cancel ou followup Ă  l’exĂ©cution intĂ©grĂ©e active rĂ©solue depuis la session Talk.
talk.session.close toutes les sessions unifiĂ©es ArrĂȘte les sessions de relais ou rĂ©voque l’état de salle gĂ©rĂ©e, puis oublie l’identifiant de session unifiĂ©e.

N’introduisez pas de cas particuliers de fournisseur ou de plateforme dans le cƓur pour que cela fonctionne. Le cƓur possĂšde la sĂ©mantique des sessions Talk. Les Plugins fournisseurs possĂšdent la configuration des sessions fournisseur. Les appels vocaux et Google Meet possĂšdent les adaptateurs de tĂ©lĂ©phonie/rĂ©union. Les navigateurs et les applications natives possĂšdent l’expĂ©rience utilisateur de capture/lecture des appareils.

Politique de compatibilité

Pour les Plugins externes, le travail de compatibilité suit cet ordre :

  1. ajouter le nouveau contrat
  2. conserver l’ancien comportement cĂąblĂ© via un adaptateur de compatibilitĂ©
  3. Ă©mettre un diagnostic ou un avertissement qui nomme l’ancien chemin et son remplacement
  4. couvrir les deux chemins dans les tests
  5. documenter l’obsolescence et le chemin de migration
  6. supprimer uniquement aprĂšs la fenĂȘtre de migration annoncĂ©e, gĂ©nĂ©ralement dans une version majeure

Les mainteneurs peuvent auditer la file de migration actuelle avec pnpm plugins:boundary-report. Utilisez pnpm plugins:boundary-report:summary pour des nombres compacts, --owner <id> pour un Plugin ou propriĂ©taire de compatibilitĂ©, et pnpm plugins:boundary-report:ci lorsqu’une barriĂšre CI doit Ă©chouer sur des enregistrements de compatibilitĂ© arrivĂ©s Ă  Ă©chĂ©ance, des imports SDK rĂ©servĂ©s entre propriĂ©taires ou des sous-chemins SDK rĂ©servĂ©s inutilisĂ©s. Le rapport groupe les enregistrements de compatibilitĂ© obsolĂštes par date de suppression, compte les rĂ©fĂ©rences locales de code/docs, met en Ă©vidence les imports SDK rĂ©servĂ©s entre propriĂ©taires et rĂ©sume le pont SDK privĂ© de l’hĂŽte mĂ©moire afin que le nettoyage de compatibilitĂ© reste explicite au lieu de s’appuyer sur des recherches ponctuelles. Les sous-chemins SDK rĂ©servĂ©s doivent avoir une utilisation propriĂ©taire suivie ; les exports d’aides rĂ©servĂ©es inutilisĂ©s doivent ĂȘtre retirĂ©s du SDK public.

Si un champ de manifeste est toujours acceptĂ©, les auteurs de Plugins peuvent continuer Ă  l’utiliser jusqu’à ce que les docs et diagnostics indiquent le contraire. Le nouveau code doit prĂ©fĂ©rer le remplacement documentĂ©, mais les Plugins existants ne doivent pas casser pendant les versions mineures ordinaires.

Comment migrer

  • Migrate runtime config load/write helpers

    Les Plugins groupĂ©s doivent cesser d’appeler api.runtime.config.loadConfig() et api.runtime.config.writeConfigFile(...) directement. PrĂ©fĂ©rez la configuration qui a dĂ©jĂ  Ă©tĂ© transmise au chemin d’appel actif. Les gestionnaires Ă  longue durĂ©e de vie qui ont besoin de l’instantanĂ© du processus actuel peuvent utiliser api.runtime.config.current(). Les outils d’agent Ă  longue durĂ©e de vie doivent utiliser ctx.getRuntimeConfig() du contexte d’outil dans execute afin qu’un outil créé avant une Ă©criture de configuration voie tout de mĂȘme la configuration d’exĂ©cution actualisĂ©e.

    Les écritures de configuration doivent passer par les aides transactionnelles et choisir une politique aprÚs écriture :

    typescript
    await api.runtime.config.mutateConfigFile({  afterWrite: { mode: "auto" },  mutate(draft) {    draft.plugins ??= {};  },});

    Utilisez afterWrite: { mode: "restart", reason: "..." } lorsque l’appelant sait que le changement nĂ©cessite un redĂ©marrage propre du Gateway, et afterWrite: { mode: "none", reason: "..." } uniquement lorsque l’appelant possĂšde le suivi et veut dĂ©libĂ©rĂ©ment supprimer le planificateur de rechargement. Les rĂ©sultats de mutation incluent un rĂ©sumĂ© typĂ© followUp pour les tests et la journalisation ; le Gateway reste responsable de l’application ou de la planification du redĂ©marrage. loadConfig et writeConfigFile restent des aides de compatibilitĂ© obsolĂštes pour les Plugins externes pendant la fenĂȘtre de migration et avertissent une fois avec le code de compatibilitĂ© runtime-config-load-write. Les Plugins groupĂ©s et le code d’exĂ©cution du dĂ©pĂŽt sont protĂ©gĂ©s par des garde-fous de scanner dans pnpm check:deprecated-api-usage et pnpm check:no-runtime-action-load-config : toute nouvelle utilisation de Plugin de production Ă©choue immĂ©diatement, les Ă©critures directes de configuration Ă©chouent, les mĂ©thodes du serveur Gateway doivent utiliser l’instantanĂ© d’exĂ©cution de la requĂȘte, les aides d’envoi/action/client de canal d’exĂ©cution doivent recevoir la configuration depuis leur frontiĂšre, et les modules d’exĂ©cution Ă  longue durĂ©e de vie ont zĂ©ro appel ambiant loadConfig() autorisĂ©.

    Le nouveau code de Plugin doit aussi Ă©viter d’importer le large barrel de compatibilitĂ© openclaw/plugin-sdk/config-runtime. Utilisez le sous-chemin SDK Ă©troit qui correspond au travail :

    Besoin Import
    Types de configuration tels que OpenClawConfig openclaw/plugin-sdk/config-contracts
    Assertions de configuration dĂ©jĂ  chargĂ©e et recherche de configuration d’entrĂ©e de Plugin openclaw/plugin-sdk/plugin-config-runtime
    Lectures de l’instantanĂ© d’exĂ©cution actuel openclaw/plugin-sdk/runtime-config-snapshot
    Écritures de configuration openclaw/plugin-sdk/config-mutation
    Aides de stockage de session openclaw/plugin-sdk/session-store-runtime
    Configuration de tableau Markdown openclaw/plugin-sdk/markdown-table-runtime
    Aides d’exĂ©cution de stratĂ©gie de groupe openclaw/plugin-sdk/runtime-group-policy
    RĂ©solution d’entrĂ©e secrĂšte openclaw/plugin-sdk/secret-input-runtime
    Remplacements de modĂšle/session openclaw/plugin-sdk/model-session-runtime

    Les Plugins groupés et leurs tests sont protégés par scanner contre le large barrel afin que les imports et mocks restent locaux au comportement dont ils ont besoin. Le large barrel existe toujours pour la compatibilité externe, mais le nouveau code ne doit pas en dépendre.

  • Migrate embedded tool-result extensions to middleware

    Les Plugins groupĂ©s doivent remplacer les gestionnaires de rĂ©sultats d’outil api.registerEmbeddedExtensionFactory(...) propres au runner intĂ©grĂ© par un middleware neutre vis-Ă -vis de l’exĂ©cution.

    typescript
    // OpenClaw and Codex runtime dynamic toolsapi.registerAgentToolResultMiddleware(async (event) => {  return compactToolResult(event);}, {  runtimes: ["openclaw", "codex"],});

    Mettez Ă  jour le manifeste du Plugin en mĂȘme temps :

    json
    {  "contracts": {    "agentToolResultMiddleware": ["openclaw", "codex"]  }}

    Les Plugins installĂ©s peuvent aussi enregistrer un middleware de rĂ©sultat d’outil lorsqu’ils sont explicitement activĂ©s et dĂ©clarent chaque exĂ©cution ciblĂ©e dans contracts.agentToolResultMiddleware. Les enregistrements de middleware installĂ© non dĂ©clarĂ©s sont rejetĂ©s.

  • Migrate approval-native handlers to capability facts

    Les Plugins de canal prenant en charge les approbations exposent dĂ©sormais le comportement d’approbation natif via approvalCapability.nativeRuntime plus le registre partagĂ© de contexte d’exĂ©cution.

    Changements clés :

    • Remplacez approvalCapability.handler.loadRuntime(...) par approvalCapability.nativeRuntime
    • DĂ©placez l’authentification/la livraison propres aux approbations hors du cĂąblage hĂ©ritĂ© plugin.auth / plugin.approvals vers approvalCapability
    • ChannelPlugin.approvals a Ă©tĂ© retirĂ© du contrat public des Plugins de canal ; dĂ©placez les champs de livraison/natif/rendu vers approvalCapability
    • plugin.auth reste rĂ©servĂ© aux flux de connexion/dĂ©connexion de canal ; les hooks d’authentification d’approbation Ă  cet endroit ne sont plus lus par le cƓur
    • Enregistrez les objets d’exĂ©cution possĂ©dĂ©s par le canal, tels que les clients, jetons ou applications Bolt, via openclaw/plugin-sdk/channel-runtime-context
    • N’envoyez pas d’avis de reroutage possĂ©dĂ©s par le Plugin depuis les gestionnaires d’approbation natifs ; le cƓur possĂšde dĂ©sormais les avis routĂ©s ailleurs Ă  partir des rĂ©sultats de livraison rĂ©els
    • Lors du passage de channelRuntime dans createChannelManager(...), fournissez une surface rĂ©elle createPluginRuntime().channel. Les stubs partiels sont rejetĂ©s.

    Voir /plugins/sdk-channel-plugins pour la disposition actuelle de la capacitĂ© d’approbation.

  • Audit Windows wrapper fallback behavior

    Si votre Plugin utilise openclaw/plugin-sdk/windows-spawn, les wrappers Windows .cmd/.bat non résolus échouent désormais de maniÚre fermée sauf si vous passez explicitement allowShellFallback: true.

    typescript
    // Beforeconst program = applyWindowsSpawnProgramPolicy({ candidate }); // Afterconst program = applyWindowsSpawnProgramPolicy({  candidate,  // Only set this for trusted compatibility callers that intentionally  // accept shell-mediated fallback.  allowShellFallback: true,});

    Si votre appelant ne s’appuie pas intentionnellement sur le repli shell, ne dĂ©finissez pas allowShellFallback et gĂ©rez plutĂŽt l’erreur levĂ©e.

  • Find deprecated imports

    Recherchez dans votre Plugin les imports provenant de l’une ou l’autre surface obsolùte :

    bash
    grep -r "plugin-sdk/compat" my-plugin/grep -r "plugin-sdk/infra-runtime" my-plugin/grep -r "plugin-sdk/config-runtime" my-plugin/grep -r "openclaw/extension-api" my-plugin/
  • Replace with focused imports

    Chaque export de l’ancienne surface correspond Ă  un chemin d’import moderne spĂ©cifique :

    typescript
    // Before (deprecated backwards-compatibility layer)import {  createChannelReplyPipeline,  createPluginRuntimeStore,  resolveControlCommandGate,} from "openclaw/plugin-sdk/compat"; // After (modern focused imports)import { createChannelReplyPipeline } from "openclaw/plugin-sdk/channel-reply-pipeline";import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";import { resolveControlCommandGate } from "openclaw/plugin-sdk/command-auth";

    Pour les aides cĂŽtĂ© hĂŽte, utilisez l’exĂ©cution de Plugin injectĂ©e au lieu d’importer directement :

    typescript
    // Before (deprecated extension-api bridge)import { runEmbeddedAgent } from "openclaw/extension-api";const result = await runEmbeddedAgent({ sessionId, prompt }); // After (injected runtime)const result = await api.runtime.agent.runEmbeddedAgent({ sessionId, prompt });

    Le mĂȘme modĂšle s’applique aux autres assistants de pont hĂ©ritĂ©s :

    Ancienne importation Équivalent moderne
    resolveAgentDir api.runtime.agent.resolveAgentDir
    resolveAgentWorkspaceDir api.runtime.agent.resolveAgentWorkspaceDir
    resolveAgentIdentity api.runtime.agent.resolveAgentIdentity
    resolveThinkingDefault api.runtime.agent.resolveThinkingDefault
    resolveAgentTimeoutMs api.runtime.agent.resolveAgentTimeoutMs
    ensureAgentWorkspace api.runtime.agent.ensureAgentWorkspace
    assistants du magasin de sessions api.runtime.agent.session.*
  • Remplacer les importations infra-runtime larges

    openclaw/plugin-sdk/infra-runtime existe toujours pour la compatibilitĂ© externe, mais le nouveau code doit importer la surface d’assistance ciblĂ©e dont il a rĂ©ellement besoin :

    Besoin Importation
    Assistants de file d’évĂ©nements systĂšme openclaw/plugin-sdk/system-event-runtime
    Assistants de rĂ©veil, d’évĂ©nement et de visibilitĂ© Heartbeat openclaw/plugin-sdk/heartbeat-runtime
    Vidage de la file des livraisons en attente openclaw/plugin-sdk/delivery-queue-runtime
    TĂ©lĂ©mĂ©trie d’activitĂ© de canal openclaw/plugin-sdk/channel-activity-runtime
    Caches de déduplication en mémoire et persistants openclaw/plugin-sdk/dedupe-runtime
    Assistants sûrs de chemins de fichiers locaux/médias openclaw/plugin-sdk/file-access-runtime
    fetch compatible avec le répartiteur openclaw/plugin-sdk/runtime-fetch
    Assistants de proxy et de fetch protégé openclaw/plugin-sdk/fetch-runtime
    Types de politique de répartiteur SSRF openclaw/plugin-sdk/ssrf-dispatcher
    Types de demande/rĂ©solution d’approbation openclaw/plugin-sdk/approval-runtime
    Charge utile de rĂ©ponse d’approbation et assistants de commande openclaw/plugin-sdk/approval-reply-runtime
    Assistants de formatage des erreurs openclaw/plugin-sdk/error-runtime
    Attentes de disponibilité du transport openclaw/plugin-sdk/transport-ready-runtime
    Assistants de jetons sécurisés openclaw/plugin-sdk/secure-random-runtime
    Concurrence bornée des tùches asynchrones openclaw/plugin-sdk/concurrency-runtime
    Coercition numérique openclaw/plugin-sdk/number-runtime
    Verrou asynchrone local au processus openclaw/plugin-sdk/async-lock-runtime
    Verrous de fichiers openclaw/plugin-sdk/file-lock

    Les plugins intégrés sont protégés par scanner contre infra-runtime, donc le code du dépÎt ne peut pas régresser vers le barrel large.

  • Migrer les assistants de route de canal

    Le nouveau code de route de canal doit utiliser openclaw/plugin-sdk/channel-route. Les anciens noms de clĂ© de route et de cible comparable restent comme alias de compatibilitĂ© pendant la fenĂȘtre de migration, mais les nouveaux plugins doivent utiliser les noms de route qui dĂ©crivent directement le comportement :

    Ancien assistant Assistant moderne
    channelRouteIdentityKey(...) channelRouteDedupeKey(...)
    channelRouteKey(...) channelRouteCompactKey(...)
    ComparableChannelTarget ChannelRouteParsedTarget
    comparableChannelTargetsMatch(...) channelRouteTargetsMatchExact(...)
    comparableChannelTargetsShareRoute(...) channelRouteTargetsShareConversation(...)

    Les assistants de route modernes normalisent { channel, to, accountId, threadId } de façon cohérente pour les approbations natives, la suppression de réponse, la déduplication entrante, la livraison Cron et le routage de session.

    N’ajoutez pas de nouvelles utilisations de ChannelMessagingAdapter.parseExplicitTarget ni des assistants de route chargĂ©e adossĂ©s Ă  l’analyseur (parseExplicitTargetForLoadedChannel ou resolveRouteTargetForLoadedChannel) ni de resolveChannelRouteTargetWithParser(...) depuis plugin-sdk/channel-route. Ces points d’accroche sont obsolĂštes et ne restent prĂ©sents que pour les anciens plugins pendant la fenĂȘtre de migration. Les nouveaux plugins de canal doivent utiliser messaging.targetResolver.resolveTarget(...) pour la normalisation des identifiants de cible et le repli en cas d’absence dans le rĂ©pertoire, messaging.inferTargetChatType(...) lorsque le cƓur a besoin d’un type de pair prĂ©coce, et messaging.resolveOutboundSessionRoute(...) pour la session native au fournisseur et l’identitĂ© de fil.

  • Construire et tester

    bash
    pnpm buildpnpm test -- my-plugin/
  • RĂ©fĂ©rence des chemins d’importation

    Common import path table
    Chemin d’importation Objectif Exports principaux
    plugin-sdk/plugin-entry Utilitaire d’entrĂ©e canonique de Plugin definePluginEntry
    plugin-sdk/core RĂ©export global hĂ©ritĂ© pour les dĂ©finitions/gĂ©nĂ©rateurs d’entrĂ©es de canal defineChannelPluginEntry, createChatChannelPlugin
    plugin-sdk/config-schema Export du schéma de configuration racine OpenClawSchema
    plugin-sdk/provider-entry Utilitaire d’entrĂ©e pour fournisseur unique defineSingleProviderPluginEntry
    plugin-sdk/channel-core DĂ©finitions et gĂ©nĂ©rateurs ciblĂ©s d’entrĂ©es de canal defineChannelPluginEntry, defineSetupPluginEntry, createChatChannelPlugin, createChannelPluginBase
    plugin-sdk/setup Utilitaires partagĂ©s de l’assistant de configuration Traducteur de configuration, invites de liste d’autorisation, gĂ©nĂ©rateurs d’état de configuration
    plugin-sdk/setup-runtime Utilitaires runtime au moment de la configuration createSetupTranslator, adaptateurs de correctifs de configuration sûrs à importer, utilitaires de notes de recherche, promptResolvedAllowFrom, splitSetupEntries, proxys de configuration déléguée
    plugin-sdk/setup-adapter-runtime Alias obsolùte d’adaptateur de configuration Utilisez plugin-sdk/setup-runtime
    plugin-sdk/setup-tools Utilitaires d’outillage de configuration formatCliCommand, detectBinary, extractArchive, resolveBrewExecutable, formatDocsLink, CONFIG_DIR
    plugin-sdk/account-core Utilitaires multicomptes Utilitaires de liste de comptes/configuration/verrouillage d’action
    plugin-sdk/account-id Utilitaires d’identifiants de compte DEFAULT_ACCOUNT_ID, normalisation d’identifiant de compte
    plugin-sdk/account-resolution Utilitaires de recherche de compte Utilitaires de recherche de compte + repli par défaut
    plugin-sdk/account-helpers Utilitaires de compte ciblés Utilitaires de liste de comptes/action de compte
    plugin-sdk/channel-setup Adaptateurs d’assistant de configuration createOptionalChannelSetupSurface, createOptionalChannelSetupAdapter, createOptionalChannelSetupWizard, plus DEFAULT_ACCOUNT_ID, createTopLevelChannelDmPolicy, setSetupChannelEnabled, splitSetupEntries
    plugin-sdk/channel-pairing Primitives d’association DM createChannelPairingController
    plugin-sdk/channel-reply-pipeline Cùblage du préfixe de réponse, de la saisie et de la livraison depuis la source createChannelReplyPipeline, resolveChannelSourceReplyDeliveryMode
    plugin-sdk/channel-config-helpers Fabriques d’adaptateurs de configuration et utilitaires d’accùs DM createHybridChannelConfigAdapter, resolveChannelDmAccess, resolveChannelDmAllowFrom, resolveChannelDmPolicy, normalizeChannelDmPolicy, normalizeLegacyDmAliases
    plugin-sdk/channel-config-schema Générateurs de schémas de configuration Primitives partagées de schéma de configuration de canal et générateur générique uniquement
    plugin-sdk/bundled-channel-config-schema Schémas de configuration groupés Plugins groupés maintenus par OpenClaw uniquement ; les nouveaux plugins doivent définir des schémas locaux au Plugin
    plugin-sdk/channel-config-schema-legacy Schémas de configuration groupés obsolÚtes Alias de compatibilité uniquement ; utilisez plugin-sdk/bundled-channel-config-schema pour les plugins groupés maintenus
    plugin-sdk/telegram-command-config Utilitaires de configuration des commandes Telegram Normalisation des noms de commande, troncature des descriptions, validation des doublons/conflits
    plugin-sdk/channel-policy Résolution de politique groupe/DM resolveChannelGroupRequireMention
    plugin-sdk/channel-lifecycle Façade de compatibilité obsolÚte Utilisez plugin-sdk/channel-outbound
    plugin-sdk/inbound-envelope Utilitaires d’enveloppe entrante Utilitaires partagĂ©s de route + gĂ©nĂ©rateurs d’enveloppe
    plugin-sdk/channel-inbound Utilitaires de rĂ©ception entrante Construction de contexte, formatage, racines, lanceurs, envoi prĂ©parĂ© des rĂ©ponses et prĂ©dicats d’envoi
    plugin-sdk/messaging-targets Chemin d’importation obsolĂšte pour l’analyse des cibles Utilisez plugin-sdk/channel-targets pour les utilitaires gĂ©nĂ©riques d’analyse de cible, plugin-sdk/channel-route pour la comparaison de routes, et messaging.targetResolver / messaging.resolveOutboundSessionRoute appartenant au Plugin pour la rĂ©solution de cible propre au fournisseur
    plugin-sdk/outbound-media Utilitaires de média sortant Chargement partagé des médias sortants
    plugin-sdk/outbound-send-deps Façade de compatibilité obsolÚte Utilisez plugin-sdk/channel-outbound
    plugin-sdk/channel-outbound Utilitaires de cycle de vie des messages sortants Adaptateurs de messages, accusĂ©s de rĂ©ception, utilitaires d’envoi durable, utilitaires d’aperçu en direct/streaming, options de rĂ©ponse, utilitaires de cycle de vie, identitĂ© sortante et planification de charge utile
    plugin-sdk/channel-streaming Façade de compatibilité obsolÚte Utilisez plugin-sdk/channel-outbound
    plugin-sdk/outbound-runtime Façade de compatibilité obsolÚte Utilisez plugin-sdk/channel-outbound
    plugin-sdk/thread-bindings-runtime Utilitaires de liaison de fils Utilitaires de cycle de vie et d’adaptateur pour la liaison de fils
    plugin-sdk/agent-media-payload Utilitaires hĂ©ritĂ©s de charges utiles mĂ©dia GĂ©nĂ©rateur de charge utile mĂ©dia d’agent pour les dispositions de champs hĂ©ritĂ©es
    plugin-sdk/channel-runtime Shim de compatibilité obsolÚte Utilitaires runtime de canal hérité uniquement
    plugin-sdk/channel-send-result Types de rĂ©sultat d’envoi Types de rĂ©sultat de rĂ©ponse
    plugin-sdk/runtime-store Stockage persistant de Plugin createPluginRuntimeStore
    plugin-sdk/runtime Utilitaires runtime larges Utilitaires runtime/journalisation/sauvegarde/installation de Plugin
    plugin-sdk/runtime-env Utilitaires ciblĂ©s d’environnement runtime Utilitaires de journalisation/environnement runtime, dĂ©lai d’expiration, nouvelle tentative et temporisation exponentielle
    plugin-sdk/plugin-runtime Utilitaires partagés de runtime de Plugin Utilitaires de commandes/hooks/http/interactifs de Plugin
    plugin-sdk/hook-runtime Utilitaires de pipeline de hooks Utilitaires partagés de pipeline Webhook/hook interne
    plugin-sdk/lazy-runtime Utilitaires runtime paresseux createLazyRuntimeModule, createLazyRuntimeMethod, createLazyRuntimeMethodBinder, createLazyRuntimeNamedExport, createLazyRuntimeSurface
    plugin-sdk/process-runtime Utilitaires de processus Utilitaires exec partagés
    plugin-sdk/cli-runtime Utilitaires runtime de CLI Formatage des commandes, attentes, utilitaires de version
    plugin-sdk/gateway-runtime Utilitaires Gateway Client Gateway, utilitaire de dĂ©marrage prĂȘt pour la boucle d’évĂ©nements, rĂ©solution de l’hĂŽte LAN annoncĂ© et utilitaires de correctif d’état de canal
    plugin-sdk/config-runtime Shim de compatibilité de configuration obsolÚte Préférez config-contracts, plugin-config-runtime, runtime-config-snapshot et config-mutation
    plugin-sdk/telegram-command-config Utilitaires de commandes Telegram Utilitaires de validation de commandes Telegram stables avec repli lorsque la surface de contrat Telegram groupée est indisponible
    plugin-sdk/approval-runtime Utilitaires d’invite d’approbation Charge utile d’approbation exec/Plugin, utilitaires de capacitĂ©/profil d’approbation, utilitaires natifs de routage/runtime d’approbation et formatage structurĂ© du chemin d’affichage de l’approbation
    plugin-sdk/approval-auth-runtime Utilitaires d’authentification d’approbation RĂ©solution d’approbateur, authentification d’action dans la mĂȘme discussion
    plugin-sdk/approval-client-runtime Utilitaires client d’approbation Utilitaires natifs de profil/filtre d’approbation exec
    plugin-sdk/approval-delivery-runtime Utilitaires de livraison d’approbation Adaptateurs natifs de capacitĂ©/livraison d’approbation
    plugin-sdk/approval-gateway-runtime Utilitaires Gateway d’approbation Utilitaire partagĂ© de rĂ©solution Gateway d’approbation
    plugin-sdk/approval-handler-adapter-runtime Utilitaires d’adaptateur d’approbation Utilitaires lĂ©gers de chargement d’adaptateur d’approbation natif pour les points d’entrĂ©e de canal critiques
    plugin-sdk/approval-handler-runtime Utilitaires de gestionnaire d’approbation Utilitaires runtime plus larges de gestionnaire d’approbation ; prĂ©fĂ©rez les coutures d’adaptateur/Gateway plus ciblĂ©es lorsqu’elles suffisent
    plugin-sdk/approval-native-runtime Utilitaires de cible d’approbation Utilitaires natifs de liaison cible/compte d’approbation
    plugin-sdk/approval-reply-runtime Utilitaires de rĂ©ponse d’approbation Utilitaires de charge utile de rĂ©ponse d’approbation exec/Plugin
    plugin-sdk/channel-runtime-context Utilitaires de contexte runtime de canal Utilitaires gĂ©nĂ©riques d’enregistrement/rĂ©cupĂ©ration/surveillance du contexte runtime de canal
    plugin-sdk/security-runtime Utilitaires de sécurité Utilitaires partagés de confiance, verrouillage DM, fichiers/chemins bornés à la racine, contenu externe et collecte de secrets
    plugin-sdk/ssrf-policy Utilitaires de politique SSRF Utilitaires de liste d’autorisation d’hĂŽtes et de politique de rĂ©seau privĂ©
    plugin-sdk/ssrf-runtime Utilitaires runtime SSRF Répartiteur épinglé, fetch protégé, utilitaires de politique SSRF
    plugin-sdk/system-event-runtime Utilitaires d’évĂ©nements systĂšme enqueueSystemEvent, peekSystemEventEntries
    plugin-sdk/heartbeat-runtime Utilitaires Heartbeat Utilitaires de rĂ©veil, d’évĂ©nement et de visibilitĂ© Heartbeat
    plugin-sdk/delivery-queue-runtime Utilitaires de file de livraison drainPendingDeliveries
    plugin-sdk/channel-activity-runtime Utilitaires d’activitĂ© de canal recordChannelActivity
    plugin-sdk/dedupe-runtime Utilitaires de déduplication Caches de déduplication en mémoire et adossés à un stockage persistant
    plugin-sdk/file-access-runtime Utilitaires d’accĂšs aux fichiers Utilitaires sĂ»rs de chemins de fichiers/mĂ©dias locaux
    plugin-sdk/transport-ready-runtime Utilitaires de préparation du transport waitForTransportReady
    plugin-sdk/exec-approvals-runtime Utilitaires de politique d’approbation exec loadExecApprovals, resolveExecApprovalsFromFile, ExecApprovalsFile
    plugin-sdk/collection-runtime Utilitaires de cache borné pruneMapToMaxSize
    plugin-sdk/diagnostic-runtime Utilitaires de verrouillage diagnostique isDiagnosticFlagEnabled, isDiagnosticsEnabled
    plugin-sdk/error-runtime Utilitaires de formatage d’erreurs formatUncaughtError, isApprovalNotFoundError, utilitaires de graphe d’erreurs
    plugin-sdk/fetch-runtime Utilitaires de fetch/proxy encapsulĂ© resolveFetch, utilitaires de proxy, utilitaires d’options EnvHttpProxyAgent
    plugin-sdk/host-runtime Utilitaires de normalisation d’hîte normalizeHostname, normalizeScpRemoteHost
    plugin-sdk/retry-runtime Utilitaires de nouvelle tentative RetryConfig, retryAsync, lanceurs de politiques
    plugin-sdk/allow-from Formatage de liste d’autorisation et mappage d’entrĂ©e formatAllowFromLowercase, mapAllowlistResolutionInputs
    plugin-sdk/command-auth Utilitaires de verrouillage de commande et de surface de commande resolveControlCommandGate, utilitaires d’autorisation d’expĂ©diteur, utilitaires de registre de commandes incluant le formatage dynamique du menu d’arguments
    plugin-sdk/command-status Moteurs de rendu d’état/aide des commandes buildCommandsMessage, buildCommandsMessagePaginated, buildHelpMessage
    plugin-sdk/secret-input Analyse de saisie de secret Utilitaires de saisie de secret
    plugin-sdk/webhook-ingress Utilitaires de requĂȘte Webhook Utilitaires de cible Webhook
    plugin-sdk/webhook-request-guards Utilitaires de garde du corps Webhook Utilitaires de lecture/limite du corps de requĂȘte
    plugin-sdk/reply-runtime Runtime de réponse partagé Envoi entrant, Heartbeat, planificateur de réponses, découpage
    plugin-sdk/reply-dispatch-runtime Utilitaires ciblĂ©s d’envoi de rĂ©ponse Finalisation, envoi par fournisseur et utilitaires d’étiquette de conversation
    plugin-sdk/reply-history Utilitaires d’historique de rĂ©ponses createChannelHistoryWindow ; exports de compatibilitĂ© obsolĂštes pour utilitaires de map tels que buildPendingHistoryContextFromMap, recordPendingHistoryEntry et clearHistoryEntriesIfEnabled
    plugin-sdk/reply-reference Planification des références de réponse createReplyReferencePlanner
    plugin-sdk/reply-chunking Utilitaires de découpage de réponses Utilitaires de découpage texte/Markdown
    plugin-sdk/session-store-runtime Utilitaires de magasin de sessions Utilitaires de chemin de magasin + date de mise Ă  jour
    plugin-sdk/state-paths Utilitaires de chemins d’état Utilitaires de rĂ©pertoires d’état et OAuth
    plugin-sdk/routing Utilitaires de routage/clé de session resolveAgentRoute, buildAgentSessionKey, resolveDefaultAgentBoundAccountId, utilitaires de normalisation des clés de session
    plugin-sdk/status-helpers Utilitaires d’état de canal Constructeurs de rĂ©sumĂ©s d’état de canal/compte, valeurs par dĂ©faut d’état d’exĂ©cution, utilitaires de mĂ©tadonnĂ©es de problĂšme
    plugin-sdk/target-resolver-runtime Utilitaires de résolution de cible Utilitaires partagés de résolution de cible
    plugin-sdk/string-normalization-runtime Utilitaires de normalisation de chaĂźne Utilitaires de normalisation de slug/chaĂźne
    plugin-sdk/request-url Utilitaires d’URL de requĂȘte Extraire les URL de chaĂźne depuis des entrĂ©es de type requĂȘte
    plugin-sdk/run-command Utilitaires de commande temporisée Exécuteur de commande temporisée avec stdout/stderr normalisés
    plugin-sdk/param-readers Lecteurs de paramùtres Lecteurs communs de paramùtres d’outil/CLI
    plugin-sdk/tool-payload Extraction de charge utile d’outil Extraire des charges utiles normalisĂ©es depuis des objets de rĂ©sultat d’outil
    plugin-sdk/tool-send Extraction d’envoi d’outil Extraire les champs canoniques de cible d’envoi depuis les arguments d’outil
    plugin-sdk/temp-path Utilitaires de chemin temporaire Utilitaires partagés de chemin de téléchargement temporaire
    plugin-sdk/logging-core Utilitaires de journalisation Journaliseur de sous-systĂšme et utilitaires de caviardage
    plugin-sdk/markdown-table-runtime Utilitaires de tableau Markdown Utilitaires de mode de tableau Markdown
    plugin-sdk/reply-payload Types de réponse de message Types de charge utile de réponse
    plugin-sdk/provider-setup Utilitaires organisés de configuration de fournisseur local/auto-hébergé Utilitaires de découverte/configuration de fournisseurs auto-hébergés
    plugin-sdk/self-hosted-provider-setup Utilitaires ciblĂ©s de configuration de fournisseur auto-hĂ©bergĂ© compatible OpenAI MĂȘmes utilitaires de dĂ©couverte/configuration de fournisseurs auto-hĂ©bergĂ©s
    plugin-sdk/provider-auth-runtime Utilitaires d’authentification d’exĂ©cution du fournisseur Utilitaires de rĂ©solution de clĂ© API Ă  l’exĂ©cution
    plugin-sdk/provider-auth-api-key Utilitaires de configuration de clĂ© API de fournisseur Utilitaires d’intĂ©gration/d’écriture de profil pour clĂ© API
    plugin-sdk/provider-auth-result Utilitaires de rĂ©sultat d’authentification de fournisseur Constructeur standard de rĂ©sultat d’authentification OAuth
    plugin-sdk/provider-selection-runtime Utilitaires de sélection de fournisseur Sélection de fournisseur configuré ou automatique et fusion de configuration brute de fournisseur
    plugin-sdk/provider-env-vars Utilitaires de variables d’environnement de fournisseur Utilitaires de recherche de variable d’environnement d’authentification de fournisseur
    plugin-sdk/provider-model-shared Utilitaires partagĂ©s de modĂšle/relecture de fournisseur ProviderReplayFamily, buildProviderReplayFamilyHooks, normalizeModelCompat, constructeurs partagĂ©s de politique de relecture, utilitaires de point de terminaison de fournisseur et utilitaires de normalisation d’ID de modĂšle
    plugin-sdk/provider-catalog-shared Utilitaires partagés de catalogue de fournisseur findCatalogTemplate, buildSingleProviderApiKeyCatalog, buildManifestModelProviderConfig, supportsNativeStreamingUsageCompat, applyProviderNativeStreamingUsageCompat
    plugin-sdk/provider-onboard Correctifs d’intĂ©gration de fournisseur Utilitaires de configuration d’intĂ©gration
    plugin-sdk/provider-http Utilitaires HTTP de fournisseur Utilitaires génériques de capacité HTTP/point de terminaison de fournisseur, y compris les utilitaires de formulaire multipart de transcription audio
    plugin-sdk/provider-web-fetch Utilitaires web-fetch de fournisseur Utilitaires d’enregistrement/cache de fournisseur web-fetch
    plugin-sdk/provider-web-search-config-contract Utilitaires de configuration web-search de fournisseur Utilitaires ciblĂ©s de configuration/identifiants web-search pour les fournisseurs qui n’ont pas besoin du cĂąblage d’activation de plugin
    plugin-sdk/provider-web-search-contract Utilitaires de contrat web-search de fournisseur Utilitaires ciblĂ©s de contrat de configuration/identifiants web-search tels que createWebSearchProviderContractFields, enablePluginInConfig, resolveProviderWebSearchPluginConfig et les setters/getters d’identifiants limitĂ©s Ă  un pĂ©rimĂštre
    plugin-sdk/provider-web-search Utilitaires web-search de fournisseur Utilitaires d’enregistrement/cache/exĂ©cution de fournisseur web-search
    plugin-sdk/provider-tools Utilitaires de compatibilitĂ© d’outils/schĂ©mas de fournisseur ProviderToolCompatFamily, buildProviderToolCompatFamilyHooks et nettoyage + diagnostics des schĂ©mas DeepSeek/Gemini/OpenAI
    plugin-sdk/provider-usage Utilitaires d’utilisation de fournisseur fetchClaudeUsage, fetchGeminiUsage, fetchGithubCopilotUsage et autres utilitaires d’utilisation de fournisseur
    plugin-sdk/provider-stream Utilitaires d’enveloppe de flux de fournisseur ProviderStreamFamily, buildProviderStreamFamilyHooks, composeProviderStreamWrappers, types d’enveloppe de flux et utilitaires partagĂ©s d’enveloppe Anthropic/Bedrock/DeepSeek V4/Google/Kilocode/Moonshot/OpenAI/OpenRouter/Z.A.I/MiniMax/Copilot
    plugin-sdk/provider-transport-runtime Utilitaires de transport de fournisseur Utilitaires de transport natif de fournisseur tels que fetch protĂ©gĂ©, extraction de texte de rĂ©sultat d’outil, transformations de messages de transport et flux d’évĂ©nements de transport inscriptibles
    plugin-sdk/keyed-async-queue File d’attente asynchrone ordonnĂ©e KeyedAsyncQueue
    plugin-sdk/media-runtime Utilitaires multimédias partagés Utilitaires de récupération/transformation/stockage de médias, sondage des dimensions vidéo basé sur ffprobe et constructeurs de charges utiles multimédias
    plugin-sdk/media-generation-runtime Utilitaires partagĂ©s de gĂ©nĂ©ration multimĂ©dia Utilitaires partagĂ©s de bascule, sĂ©lection de candidats et messages de modĂšle manquant pour la gĂ©nĂ©ration d’images/vidĂ©os/musique
    plugin-sdk/media-understanding Utilitaires de comprĂ©hension multimĂ©dia Types de fournisseurs de comprĂ©hension multimĂ©dia et exports d’utilitaires image/audio cĂŽtĂ© fournisseur
    plugin-sdk/text-runtime Export de compatibilité textuelle large déprécié Utiliser string-coerce-runtime, text-chunking, text-utility-runtime et logging-core
    plugin-sdk/text-chunking Utilitaires de découpage de texte Utilitaire de découpage de texte sortant
    plugin-sdk/speech Utilitaires vocaux Types de fournisseurs vocaux et utilitaires cÎté fournisseur pour directives, registre, validation, ainsi que constructeur TTS compatible OpenAI
    plugin-sdk/speech-core Noyau vocal partagé Types de fournisseurs vocaux, registre, directives, normalisation
    plugin-sdk/realtime-transcription Utilitaires de transcription en temps réel Types de fournisseurs, utilitaires de registre et utilitaire partagé de session WebSocket
    plugin-sdk/realtime-voice Utilitaires vocaux en temps rĂ©el Types de fournisseurs, utilitaires de registre/rĂ©solution, utilitaires de session de pont, files partagĂ©es de rĂ©ponse vocale d’agent, contrĂŽle vocal d’exĂ©cution active, santĂ© de transcription/Ă©vĂ©nement, suppression d’écho, correspondance des questions de consultation, coordination de consultation forcĂ©e, suivi du contexte de tour, suivi d’activitĂ© de sortie et utilitaires de consultation rapide de contexte
    plugin-sdk/image-generation Utilitaires de gĂ©nĂ©ration d’images Types de fournisseurs de gĂ©nĂ©ration d’images, utilitaires d’URL de donnĂ©es/ressources image et constructeur de fournisseur d’images compatible OpenAI
    plugin-sdk/image-generation-core Noyau partagĂ© de gĂ©nĂ©ration d’images Types de gĂ©nĂ©ration d’images, bascule, authentification et utilitaires de registre
    plugin-sdk/music-generation Utilitaires de gĂ©nĂ©ration musicale Types de fournisseur/requĂȘte/rĂ©sultat de gĂ©nĂ©ration musicale
    plugin-sdk/music-generation-core Noyau partagé de génération musicale Types de génération musicale, utilitaires de bascule, recherche de fournisseur et analyse de référence de modÚle
    plugin-sdk/video-generation Utilitaires de gĂ©nĂ©ration vidĂ©o Types de fournisseur/requĂȘte/rĂ©sultat de gĂ©nĂ©ration vidĂ©o
    plugin-sdk/video-generation-core Noyau partagé de génération vidéo Types de génération vidéo, utilitaires de bascule, recherche de fournisseur et analyse de référence de modÚle
    plugin-sdk/interactive-runtime Utilitaires de réponse interactive Normalisation/réduction de charge utile de réponse interactive
    plugin-sdk/channel-config-primitives Primitives de configuration de canal Primitives ciblées de schéma de configuration de canal
    plugin-sdk/channel-config-writes Utilitaires d’écriture de configuration de canal Utilitaires d’autorisation d’écriture de configuration de canal
    plugin-sdk/channel-plugin-common Préambule de canal partagé Exports partagés de préambule de plugin de canal
    plugin-sdk/channel-status Utilitaires d’état de canal Utilitaires partagĂ©s d’instantanĂ©/rĂ©sumĂ© d’état de canal
    plugin-sdk/allowlist-config-edit Utilitaires de configuration de liste d’autorisation Utilitaires de modification/lecture de configuration de liste d’autorisation
    plugin-sdk/group-access Utilitaires d’accĂšs de groupe Utilitaires partagĂ©s de dĂ©cision d’accĂšs de groupe
    plugin-sdk/direct-dm, plugin-sdk/direct-dm-access Façades de compatibilité dépréciées Utiliser plugin-sdk/channel-inbound
    plugin-sdk/direct-dm-guard-policy Utilitaires de garde de DM direct Utilitaires ciblés de politique de garde pré-crypto
    plugin-sdk/extension-shared Utilitaires d’extension partagĂ©s Primitives de canal passif/d’état et d’assistant de proxy ambiant
    plugin-sdk/webhook-targets Utilitaires de cibles Webhook Registre de cibles Webhook et utilitaires d’installation de route
    plugin-sdk/webhook-path Alias déprécié de chemin Webhook Utiliser plugin-sdk/webhook-ingress
    plugin-sdk/web-media Utilitaires multimédias web partagés Utilitaires de chargement de médias distants/locaux
    plugin-sdk/zod Réexport de compatibilité Zod déprécié Importer zod depuis zod directement
    plugin-sdk/memory-core Utilitaires memory-core intĂ©grĂ©s Surface d’utilitaires de gestionnaire/configuration/fichier/CLI de mĂ©moire
    plugin-sdk/memory-core-engine-runtime Façade d’exĂ©cution du moteur de mĂ©moire Façade d’exĂ©cution d’index/recherche de mĂ©moire
    plugin-sdk/memory-core-host-embedding-registry Registre d’embeddings de mĂ©moire Utilitaires lĂ©gers de registre de fournisseurs d’embeddings de mĂ©moire
    plugin-sdk/memory-core-host-engine-foundation Moteur de fondation de l’hĂŽte de mĂ©moire Exports du moteur de fondation de l’hĂŽte de mĂ©moire
    plugin-sdk/memory-core-host-engine-embeddings Moteur d’embeddings de l’hĂŽte de mĂ©moire Contrats d’embeddings de mĂ©moire, accĂšs au registre, fournisseur local et utilitaires gĂ©nĂ©riques de traitement par lot/distants ; les fournisseurs distants concrets vivent dans leurs plugins propriĂ©taires
    plugin-sdk/memory-core-host-engine-qmd Moteur QMD de l’hĂŽte de mĂ©moire Exports du moteur QMD de l’hĂŽte de mĂ©moire
    plugin-sdk/memory-core-host-engine-storage Moteur de stockage de l’hĂŽte de mĂ©moire Exports du moteur de stockage de l’hĂŽte de mĂ©moire
    plugin-sdk/memory-core-host-multimodal Utilitaires multimodaux de l’hĂŽte de mĂ©moire Utilitaires multimodaux de l’hĂŽte de mĂ©moire
    plugin-sdk/memory-core-host-query Utilitaires de requĂȘte de l’hĂŽte de mĂ©moire Utilitaires de requĂȘte de l’hĂŽte de mĂ©moire
    plugin-sdk/memory-core-host-secret Utilitaires de secret de l’hĂŽte de mĂ©moire Utilitaires de secret de l’hĂŽte de mĂ©moire
    plugin-sdk/memory-core-host-events Alias dĂ©prĂ©ciĂ© d’évĂ©nement de mĂ©moire Utiliser plugin-sdk/memory-host-events
    plugin-sdk/memory-core-host-status Utilitaires d’état de l’hĂŽte de mĂ©moire Utilitaires d’état de l’hĂŽte de mĂ©moire
    plugin-sdk/memory-core-host-runtime-cli ExĂ©cution CLI de l’hĂŽte de mĂ©moire Utilitaires d’exĂ©cution CLI de l’hĂŽte de mĂ©moire
    plugin-sdk/memory-core-host-runtime-core ExĂ©cution du noyau de l’hĂŽte de mĂ©moire Utilitaires d’exĂ©cution du noyau de l’hĂŽte de mĂ©moire
    plugin-sdk/memory-core-host-runtime-files Utilitaires de fichier/exĂ©cution de l’hĂŽte de mĂ©moire Utilitaires de fichier/exĂ©cution de l’hĂŽte de mĂ©moire
    plugin-sdk/memory-host-core Alias d’exĂ©cution du noyau de l’hĂŽte de mĂ©moire Alias indĂ©pendant du fournisseur pour les utilitaires d’exĂ©cution du noyau de l’hĂŽte de mĂ©moire
    plugin-sdk/memory-host-events Alias de journal d’évĂ©nements de l’hĂŽte de mĂ©moire Alias indĂ©pendant du fournisseur pour les utilitaires de journal d’évĂ©nements de l’hĂŽte de mĂ©moire
    plugin-sdk/memory-host-files Alias déprécié de fichier/exécution de mémoire Utiliser plugin-sdk/memory-core-host-runtime-files
    plugin-sdk/memory-host-markdown Utilitaires Markdown gérés Utilitaires partagés de Markdown géré pour les plugins adjacents à la mémoire
    plugin-sdk/memory-host-search Façade de recherche Active Memory Façade d’exĂ©cution diffĂ©rĂ©e du gestionnaire de recherche active-memory
    plugin-sdk/memory-host-status Alias dĂ©prĂ©ciĂ© d’état de l’hĂŽte de mĂ©moire Utiliser plugin-sdk/memory-core-host-status
    plugin-sdk/testing Utilitaires de test Barrel de compatibilité déprécié local au dépÎt ; utiliser des sous-chemins de test ciblés locaux au dépÎt tels que plugin-sdk/plugin-test-runtime, plugin-sdk/channel-test-helpers, plugin-sdk/channel-target-testing, plugin-sdk/test-env et plugin-sdk/test-fixtures

    Ce tableau est volontairement le sous-ensemble commun de migration, et non la surface complĂšte du SDK. L’inventaire des points d’entrĂ©e du compilateur se trouve dans scripts/lib/plugin-sdk-entrypoints.json ; les exports de paquet sont gĂ©nĂ©rĂ©s Ă  partir du sous-ensemble public.

    Les points de jonction d’assistance rĂ©servĂ©s aux plugins groupĂ©s ont Ă©tĂ© retirĂ©s de la carte d’export public du SDK, sauf pour les façades de compatibilitĂ© explicitement documentĂ©es, comme le shim dĂ©prĂ©ciĂ© plugin-sdk/discord conservĂ© pour le paquet publiĂ© @openclaw/discord@2026.3.13. Les assistants propres Ă  un propriĂ©taire rĂ©sident dans le paquet du plugin propriĂ©taire ; le comportement partagĂ© de l’hĂŽte doit passer par des contrats SDK gĂ©nĂ©riques comme plugin-sdk/gateway-runtime, plugin-sdk/security-runtime et plugin-sdk/plugin-config-runtime.

    Utilisez l’import le plus Ă©troit qui correspond Ă  la tĂąche. Si vous ne trouvez pas d’export, vĂ©rifiez la source dans src/plugin-sdk/ ou demandez aux mainteneurs quel contrat gĂ©nĂ©rique doit en ĂȘtre propriĂ©taire.

    Dépréciations actives

    DĂ©prĂ©ciations plus ciblĂ©es qui s’appliquent au SDK de plugin, au contrat de fournisseur, Ă  la surface d’exĂ©cution et au manifeste. Chacune fonctionne encore aujourd’hui, mais sera supprimĂ©e dans une future version majeure. L’entrĂ©e sous chaque Ă©lĂ©ment associe l’ancienne API Ă  son remplacement canonique.

    command-auth help builders → command-status

    Ancien (openclaw/plugin-sdk/command-auth) : buildCommandsMessage, buildCommandsMessagePaginated, buildHelpMessage.

    Nouveau (openclaw/plugin-sdk/command-status) : mĂȘmes signatures, mĂȘmes exports - simplement importĂ©s depuis le sous-chemin plus Ă©troit. command-auth les rĂ©exporte comme stubs de compatibilitĂ©.

    typescript
    // Beforeimport { buildHelpMessage } from "openclaw/plugin-sdk/command-auth"; // Afterimport { buildHelpMessage } from "openclaw/plugin-sdk/command-status";
    Mention gating helpers → resolveInboundMentionDecision

    Ancien : resolveInboundMentionRequirement({ facts, policy }) et shouldDropInboundForMention(...) depuis openclaw/plugin-sdk/channel-inbound ou openclaw/plugin-sdk/channel-mention-gating.

    Nouveau : resolveInboundMentionDecision({ facts, policy }) - renvoie un seul objet de décision au lieu de deux appels séparés.

    Les plugins de canal en aval (Slack, Discord, Matrix, MS Teams) ont déjà basculé.

    Channel runtime shim and channel actions helpers

    openclaw/plugin-sdk/channel-runtime est un shim de compatibilitĂ© pour les anciens plugins de canal. Ne l’importez pas depuis du nouveau code ; utilisez openclaw/plugin-sdk/channel-runtime-context pour enregistrer les objets d’exĂ©cution.

    Les assistants channelActions* dans openclaw/plugin-sdk/channel-actions sont dĂ©prĂ©ciĂ©s avec les exports de canal "actions" bruts. Exposez plutĂŽt les capacitĂ©s via la surface sĂ©mantique presentation - les plugins de canal dĂ©clarent ce qu’ils affichent (cartes, boutons, sĂ©lecteurs) plutĂŽt que les noms d’action bruts qu’ils acceptent.

    Web search provider tool() helper → createTool() on the plugin

    Ancien : fabrique tool() depuis openclaw/plugin-sdk/provider-web-search.

    Nouveau : implĂ©mentez createTool(...) directement sur le plugin fournisseur. OpenClaw n’a plus besoin de l’assistant SDK pour enregistrer l’enveloppe de l’outil.

    Plaintext channel envelopes → BodyForAgent

    Ancien : formatInboundEnvelope(...) (et ChannelMessageForAgent.channelEnvelope) pour construire une enveloppe d’invite en texte brut plat à partir des messages de canal entrants.

    Nouveau : BodyForAgent avec des blocs structurĂ©s de contexte utilisateur. Les plugins de canal attachent les mĂ©tadonnĂ©es de routage (fil, sujet, rĂ©ponse Ă , rĂ©actions) comme champs typĂ©s au lieu de les concatĂ©ner dans une chaĂźne d’invite. L’assistant formatAgentEnvelope(...) reste pris en charge pour les enveloppes synthĂ©tisĂ©es destinĂ©es Ă  l’assistant, mais les enveloppes entrantes en texte brut sont en cours de retrait.

    Zones concernées : inbound_claim, message_received et tout plugin de canal personnalisé qui post-traitait le texte channelEnvelope.

    deactivate hook → gateway_stop

    Ancien : api.on("deactivate", handler).

    Nouveau : api.on("gateway_stop", handler). L’évĂ©nement et le contexte constituent le mĂȘme contrat de nettoyage Ă  l’arrĂȘt ; seul le nom du hook change.

    typescript
    // Beforeapi.on("deactivate", async (event, ctx) => {  await stopPluginService(ctx);}); // Afterapi.on("gateway_stop", async (event, ctx) => {  await stopPluginService(ctx);});

    deactivate reste cĂąblĂ© comme alias de compatibilitĂ© dĂ©prĂ©ciĂ© jusqu’aprĂšs le 2026-08-16.

    subagent_spawning hook → core thread binding

    Ancien : api.on("subagent_spawning", handler) renvoyant threadBindingReady ou deliveryOrigin.

    Nouveau : laissez le cƓur prĂ©parer les liaisons de sous-agent thread: true via l’adaptateur de liaison de session du canal. Utilisez api.on("subagent_spawned", handler) uniquement pour l’observation aprĂšs lancement.

    typescript
    // Beforeapi.on("subagent_spawning", async () => ({  status: "ok",  threadBindingReady: true,  deliveryOrigin: { channel: "discord", to: "channel:123", threadId: "456" },})); // Afterapi.on("subagent_spawned", async (event) => {  await observeSubagentLaunch(event);});

    subagent_spawning, PluginHookSubagentSpawningEvent, PluginHookSubagentSpawningResult et SubagentLifecycleHookRunner.runSubagentSpawning(...) ne restent que comme surfaces de compatibilité dépréciées pendant la migration des plugins externes.

    Provider discovery types → provider catalog types

    Quatre alias de type de dĂ©couverte sont maintenant de fines enveloppes autour des types de l’ùre catalogue :

    Ancien alias Nouveau type
    ProviderDiscoveryOrder ProviderCatalogOrder
    ProviderDiscoveryContext ProviderCatalogContext
    ProviderDiscoveryResult ProviderCatalogResult
    ProviderPluginDiscovery ProviderPluginCatalog

    Plus l’ancien sac statique ProviderCapabilities - les plugins fournisseurs doivent utiliser des hooks de fournisseur explicites comme buildReplayPolicy, normalizeToolSchemas et wrapStreamFn plutît qu’un objet statique.

    Thinking policy hooks → resolveThinkingProfile

    Ancien (trois hooks séparés sur ProviderThinkingPolicy) : isBinaryThinking(ctx), supportsXHighThinking(ctx) et resolveDefaultThinkingLevel(ctx).

    Nouveau : un seul resolveThinkingProfile(ctx) qui renvoie un ProviderThinkingProfile avec l’id canonique, un label facultatif et la liste de niveaux classĂ©s. OpenClaw rĂ©trograde automatiquement les valeurs stockĂ©es obsolĂštes selon le rang du profil.

    Le contexte inclut provider, modelId, reasoning fusionnĂ© facultatif et les faits compat de modĂšle fusionnĂ©s facultatifs. Les plugins fournisseurs peuvent utiliser ces faits de catalogue pour exposer un profil propre au modĂšle uniquement lorsque le contrat de requĂȘte configurĂ© le prend en charge.

    ImplĂ©mentez un hook au lieu de trois. Les anciens hooks continuent de fonctionner pendant la fenĂȘtre de dĂ©prĂ©ciation, mais ne sont pas composĂ©s avec le rĂ©sultat du profil.

    External auth providers → contracts.externalAuthProviders

    Ancien : implĂ©menter des hooks d’authentification externe sans dĂ©clarer le fournisseur dans le manifeste du plugin.

    Nouveau : déclarez contracts.externalAuthProviders dans le manifeste du plugin et implémentez resolveExternalAuthProfiles(...).

    json
    {  "contracts": {    "externalAuthProviders": ["anthropic", "openai"]  }}
    Provider env-var lookup → setup.providers[].envVars

    Ancien champ de manifeste : providerAuthEnvVars: { anthropic: ["ANTHROPIC_API_KEY"] }.

    Nouveau : reflĂ©tez la mĂȘme recherche de variable d’environnement dans setup.providers[].envVars sur le manifeste. Cela consolide les mĂ©tadonnĂ©es d’environnement de configuration/statut en un seul endroit et Ă©vite de dĂ©marrer l’environnement d’exĂ©cution du plugin uniquement pour rĂ©pondre aux recherches de variables d’environnement.

    providerAuthEnvVars reste pris en charge via un adaptateur de compatibilitĂ© jusqu’à la fermeture de la fenĂȘtre de dĂ©prĂ©ciation.

    Memory plugin registration → registerMemoryCapability

    Ancien : trois appels séparés - api.registerMemoryPromptSection(...), api.registerMemoryFlushPlan(...), api.registerMemoryRuntime(...).

    Nouveau : un appel sur l’API d’état mĂ©moire - registerMemoryCapability(pluginId, { promptBuilder, flushPlanResolver, runtime }).

    MĂȘmes emplacements, un seul appel d’enregistrement. Les assistants additifs de prompt et de corpus (registerMemoryPromptSupplement, registerMemoryCorpusSupplement) ne sont pas affectĂ©s.

    Memory embedding provider API

    Ancien : api.registerMemoryEmbeddingProvider(...) avec contracts.memoryEmbeddingProviders.

    Nouveau : api.registerEmbeddingProvider(...) avec contracts.embeddingProviders.

    Le contrat gĂ©nĂ©rique de fournisseur d’embeddings est rĂ©utilisable en dehors de la mĂ©moire et constitue le chemin pris en charge pour les nouveaux fournisseurs. L’API d’enregistrement propre Ă  la mĂ©moire reste cĂąblĂ©e comme compatibilitĂ© dĂ©prĂ©ciĂ©e pendant la migration des fournisseurs existants. L’inspection des plugins signale l’usage non groupĂ© comme dette de compatibilitĂ©.

    Subagent session messages types renamed

    Deux alias de type hérités sont encore exportés depuis src/plugins/runtime/types.ts :

    Ancien Nouveau
    SubagentReadSessionParams SubagentGetSessionMessagesParams
    SubagentReadSessionResult SubagentGetSessionMessagesResult

    La mĂ©thode d’exĂ©cution readSession est dĂ©prĂ©ciĂ©e au profit de getSessionMessages. MĂȘme signature ; l’ancienne mĂ©thode dĂ©lĂšgue Ă  la nouvelle.

    runtime.tasks.flow → runtime.tasks.managedFlows

    Ancien : runtime.tasks.flow (singulier) renvoyait un accesseur de flux de tĂąches actif.

    Nouveau : runtime.tasks.managedFlows conserve l’environnement d’exĂ©cution de mutation TaskFlow gĂ©rĂ©e pour les plugins qui crĂ©ent, mettent Ă  jour, annulent ou exĂ©cutent des tĂąches enfant depuis un flux. Utilisez runtime.tasks.flows lorsque le plugin n’a besoin que de lectures basĂ©es sur des DTO.

    typescript
    // Beforeconst flow = api.runtime.tasks.flow.fromToolContext(ctx);// Afterconst flow = api.runtime.tasks.managedFlows.fromToolContext(ctx);
    Embedded extension factories → agent tool-result middleware

    Couvert dans "Comment migrer → Migrer les extensions de rĂ©sultats d’outils intĂ©grĂ©es vers le middleware" ci-dessus. Inclus ici par souci d’exhaustivitĂ© : le chemin supprimĂ© rĂ©servĂ© Ă  l’exĂ©cuteur intĂ©grĂ© api.registerEmbeddedExtensionFactory(...) est remplacĂ© par api.registerAgentToolResultMiddleware(...) avec une liste explicite d’environnements d’exĂ©cution dans contracts.agentToolResultMiddleware.

    OpenClawSchemaType alias → OpenClawConfig

    OpenClawSchemaType rĂ©exportĂ© depuis openclaw/plugin-sdk est maintenant un alias d’une ligne pour OpenClawConfig. PrĂ©fĂ©rez le nom canonique.

    typescript
    // Beforeimport type { OpenClawSchemaType } from "openclaw/plugin-sdk";// Afterimport type { OpenClawConfig } from "openclaw/plugin-sdk/config-schema";

    Calendrier de suppression

    Quand Ce qui se passe
    Maintenant Les surfaces dĂ©prĂ©ciĂ©es Ă©mettent des avertissements d’exĂ©cution
    Prochaine version majeure Les surfaces dépréciées seront supprimées ; les plugins qui les utilisent encore échoueront

    Tous les plugins principaux ont déjà été migrés. Les plugins externes doivent migrer avant la prochaine version majeure.

    Suppression temporaire des avertissements

    DĂ©finissez ces variables d’environnement pendant que vous travaillez sur la migration :

    bash
    OPENCLAW_SUPPRESS_PLUGIN_SDK_COMPAT_WARNING=1 openclaw gateway runOPENCLAW_SUPPRESS_EXTENSION_API_WARNING=1 openclaw gateway run

    Il s’agit d’une solution de contournement temporaire, pas d’une solution permanente.

    Associé

    Was this useful?
    On this page

    On this page