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 quetool_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 :
- Garder les primitives partagées de contrÎleur/exécution dans
plugin-sdk/realtime-voice. - 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.
- Remplacer les anciennes familles RPC Talk par lâAPI finale
talk.session.*ettalk.client.*. - Annoncer un seul canal dâĂ©vĂ©nements Talk actif dans
hello-ok.features.eventsdu Gateway :talk.event. - 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 :
// 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 :
- ajouter le nouveau contrat
- conserver lâancien comportement cĂąblĂ© via un adaptateur de compatibilitĂ©
- Ă©mettre un diagnostic ou un avertissement qui nomme lâancien chemin et son remplacement
- couvrir les deux chemins dans les tests
- documenter lâobsolescence et le chemin de migration
- 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 :
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.
// 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 :
{ "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(...)parapprovalCapability.nativeRuntime - DĂ©placez lâauthentification/la livraison propres aux approbations hors du cĂąblage hĂ©ritĂ©
plugin.auth/plugin.approvalsversapprovalCapability ChannelPlugin.approvalsa Ă©tĂ© retirĂ© du contrat public des Plugins de canal ; dĂ©placez les champs de livraison/natif/rendu versapprovalCapabilityplugin.authreste 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
channelRuntimedanscreateChannelManager(...), fournissez une surface réellecreatePluginRuntime().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.
// 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 :
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 :
// 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 :
// 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
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é.
// 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.
// 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.
// 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(...).
{ "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.
// 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.
// 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 :
OPENCLAW_SUPPRESS_PLUGIN_SDK_COMPAT_WARNING=1 openclaw gateway runOPENCLAW_SUPPRESS_EXTENSION_API_WARNING=1 openclaw gateway runIl sâagit dâune solution de contournement temporaire, pas dâune solution permanente.
Associé
- Bien démarrer - créez votre premier plugin
- Vue dâensemble du SDK - rĂ©fĂ©rence complĂšte des importations de sous-chemins
- Plugins de canaux - création de plugins de canaux
- Plugins de fournisseurs - création de plugins de fournisseurs
- Internes des plugins - analyse approfondie de lâarchitecture
- Manifeste de plugin - référence du schéma de manifeste