Plugins
Plugin-Interna
Dies ist die umfassende Architekturreferenz für das OpenClaw-Plugin-System. Für praktische Anleitungen beginnen Sie mit einer der fokussierten Seiten unten.
Leitfaden für Endbenutzer zum Hinzufügen, Aktivieren und Beheben von Problemen mit Plugins.
Tutorial für das erste Plugin mit dem kleinsten funktionsfähigen Manifest.
Erstellen Sie ein Messaging-Kanal-Plugin.
Erstellen Sie ein Modell-Provider-Plugin.
Import-Map und Referenz zur Registrierungs-API.
Öffentliches Fähigkeitsmodell
Fähigkeiten sind das öffentliche native Plugin-Modell innerhalb von OpenClaw. Jedes native OpenClaw-Plugin registriert sich für einen oder mehrere Fähigkeitstypen:
| Fähigkeit | Registrierungsmethode | Beispiel-Plugins |
|---|---|---|
| Textinferenz | api.registerProvider(...) |
openai, anthropic |
| CLI-Inferenz-Backend | api.registerCliBackend(...) |
openai, anthropic |
| Sprache | api.registerSpeechProvider(...) |
elevenlabs, microsoft |
| Echtzeit-Transkription | api.registerRealtimeTranscriptionProvider(...) |
openai |
| Echtzeit-Sprache | api.registerRealtimeVoiceProvider(...) |
openai |
| Medienverständnis | api.registerMediaUnderstandingProvider(...) |
openai, google |
| Bildgenerierung | api.registerImageGenerationProvider(...) |
openai, google, fal, minimax |
| Musikgenerierung | api.registerMusicGenerationProvider(...) |
google, minimax |
| Videogenerierung | api.registerVideoGenerationProvider(...) |
qwen |
| Web-Abruf | api.registerWebFetchProvider(...) |
firecrawl |
| Websuche | api.registerWebSearchProvider(...) |
google |
| Kanal / Messaging | api.registerChannel(...) |
msteams, matrix |
| Gateway-Erkennung | api.registerGatewayDiscoveryService(...) |
bonjour |
Haltung zur externen Kompatibilität
Das Fähigkeitsmodell ist im Core gelandet und wird heute von mitgelieferten/nativen Plugins verwendet, aber externe Plugin-Kompatibilität braucht weiterhin einen strengeren Maßstab als „es ist exportiert, also ist es eingefroren“.
| Plugin-Situation | Empfehlung |
|---|---|
| Bestehende externe Plugins | Hook-basierte Integrationen funktionsfähig halten; dies ist die Kompatibilitätsbasis. |
| Neue mitgelieferte/native Plugins | Explizite Fähigkeitsregistrierung gegenüber anbieterspezifischen Zugriffen oder neuen Hook-only-Designs bevorzugen. |
| Externe Plugins mit Fähigkeitsregistrierung | Erlaubt, aber behandeln Sie fähigkeitsspezifische Hilfsoberflächen als in Entwicklung, sofern die Dokumentation sie nicht als stabil markiert. |
Fähigkeitsregistrierung ist die vorgesehene Richtung. Legacy-Hooks bleiben während der Übergangsphase der sicherste Pfad ohne Breaking Changes für externe Plugins. Exportierte Hilfs-Subpfade sind nicht alle gleichwertig — bevorzugen Sie eng gefasste dokumentierte Verträge gegenüber beiläufigen Hilfsexporten.
Plugin-Formen
OpenClaw klassifiziert jedes geladene Plugin anhand seines tatsächlichen Registrierungsverhaltens in eine Form (nicht nur anhand statischer Metadaten):
plain-capability
Registriert genau einen Fähigkeitstyp (zum Beispiel ein reines Provider-Plugin wie mistral).
hybrid-capability
Registriert mehrere Fähigkeitstypen (zum Beispiel besitzt openai Textinferenz, Sprache, Medienverständnis und Bildgenerierung).
hook-only
Registriert nur Hooks (typisiert oder benutzerdefiniert), keine Fähigkeiten, Tools, Befehle oder Dienste.
non-capability
Registriert Tools, Befehle, Dienste oder Routen, aber keine Fähigkeiten.
Verwenden Sie openclaw plugins inspect <id>, um die Form und Fähigkeitsaufschlüsselung eines Plugins zu sehen. Details finden Sie in der CLI-Referenz.
Legacy-Hooks
Der Hook before_agent_start bleibt als Kompatibilitätspfad für Hook-only-Plugins unterstützt. Ältere reale Plugins hängen weiterhin davon ab.
Richtung:
- funktionsfähig halten
- als Legacy dokumentieren
before_model_resolvefür Arbeiten an Modell-/Provider-Overrides bevorzugenbefore_prompt_buildfür Arbeiten an Prompt-Änderungen bevorzugen- erst entfernen, nachdem die reale Nutzung zurückgegangen ist und Fixture-Abdeckung die Migrationssicherheit belegt
Kompatibilitätssignale
Wenn Sie openclaw doctor oder openclaw plugins inspect <id> ausführen, sehen Sie möglicherweise eines dieser Labels:
| Signal | Bedeutung |
|---|---|
| config valid | Die Konfiguration wird korrekt geparst und Plugins werden aufgelöst |
| compatibility advisory | Plugin verwendet ein unterstütztes, aber älteres Muster (z. B. hook-only) |
| legacy warning | Plugin verwendet before_agent_start, das veraltet ist |
| hard error | Die Konfiguration ist ungültig oder das Plugin konnte nicht geladen werden |
Weder hook-only noch before_agent_start machen Ihr Plugin heute kaputt: hook-only ist ein Hinweis, und before_agent_start löst nur eine Warnung aus. Diese Signale erscheinen auch in openclaw status --all und openclaw plugins doctor.
Architekturübersicht
Das Plugin-System von OpenClaw hat vier Schichten:
Manifest + discovery
OpenClaw findet Plugin-Kandidaten aus konfigurierten Pfaden, Workspace-Roots, globalen Plugin-Roots und mitgelieferten Plugins. Die Erkennung liest zuerst native openclaw.plugin.json-Manifeste sowie unterstützte Bundle-Manifeste.
Enablement + validation
Der Core entscheidet, ob ein erkanntes Plugin aktiviert, deaktiviert, blockiert oder für einen exklusiven Slot wie Speicher ausgewählt ist.
Runtime loading
Native OpenClaw-Plugins werden im Prozess geladen und registrieren Fähigkeiten in einer zentralen Registry. Paketiertes JavaScript wird über natives require geladen; lokale TypeScript-Quellen von Drittanbietern sind der Notfall-Fallback über Jiti. Kompatible Bundles werden ohne Import von Laufzeitcode in Registry-Datensätze normalisiert.
Surface consumption
Der Rest von OpenClaw liest die Registry, um Tools, Kanäle, Provider-Einrichtung, Hooks, HTTP-Routen, CLI-Befehle und Dienste bereitzustellen.
Speziell für die Plugin-CLI ist die Root-Befehlserkennung in zwei Phasen aufgeteilt:
- Metadaten zur Parse-Zeit kommen aus
registerCli(..., { descriptors: [...] }) - das eigentliche Plugin-CLI-Modul kann lazy bleiben und sich beim ersten Aufruf registrieren
Dadurch bleibt plugin-eigener CLI-Code innerhalb des Plugins, während OpenClaw weiterhin Root-Befehlsnamen vor dem Parsen reservieren kann.
Die wichtige Designgrenze:
- Manifest-/Konfigurationsvalidierung sollte anhand von Manifest-/Schema-Metadaten funktionieren, ohne Plugin-Code auszuführen
- native Fähigkeitserkennung kann vertrauenswürdigen Plugin-Einstiegscode laden, um einen nicht aktivierenden Registry-Snapshot zu erstellen
- natives Laufzeitverhalten kommt aus dem Pfad
register(api)des Plugin-Moduls mitapi.registrationMode === "full"
Diese Aufteilung ermöglicht OpenClaw, die Konfiguration zu validieren, fehlende/deaktivierte Plugins zu erklären und UI-/Schema-Hinweise zu erstellen, bevor die vollständige Laufzeit aktiv ist.
Snapshot der Plugin-Metadaten und Lookup-Tabelle
Der Gateway-Start erstellt einen PluginMetadataSnapshot für den aktuellen Konfigurations-Snapshot. Der Snapshot enthält nur Metadaten: Er speichert den Index installierter Plugins, die Manifest-Registry, Manifest-Diagnosen, Owner-Maps, einen Plugin-ID-Normalizer und Manifest-Datensätze. Er enthält keine geladenen Plugin-Module, Provider-SDKs, Paketinhalte oder Laufzeitexporte.
Plugin-bewusste Konfigurationsvalidierung, automatisches Aktivieren beim Start und Plugin-Bootstrap des Gateway verwenden diesen Snapshot, statt Manifest-/Index-Metadaten unabhängig neu aufzubauen. PluginLookUpTable wird aus demselben Snapshot abgeleitet und fügt den Start-Plugin-Plan für die aktuelle Laufzeitkonfiguration hinzu.
Nach dem Start behält Gateway den aktuellen Metadaten-Snapshot als ersetzbares Laufzeitprodukt. Wiederholte Laufzeit-Provider-Erkennung kann diesen Snapshot verwenden, statt den installierten Index und die Manifest-Registry für jeden Provider-Katalogdurchlauf neu zu rekonstruieren. Der Snapshot wird beim Herunterfahren des Gateway, bei Änderungen an Konfiguration/Plugin-Inventar und bei Schreibvorgängen am installierten Index gelöscht oder ersetzt; Aufrufer fallen auf den kalten Manifest-/Index-Pfad zurück, wenn kein kompatibler aktueller Snapshot vorhanden ist. Kompatibilitätsprüfungen müssen Plugin-Erkennungs-Roots wie plugins.load.paths und den Standard-Agent-Workspace einschließen, weil Workspace-Plugins Teil des Metadatenumfangs sind.
Der Snapshot und die Lookup-Tabelle halten wiederholte Startentscheidungen auf dem schnellen Pfad:
- Kanal-Ownership
- verzögerter Kanalstart
- Start-Plugin-IDs
- Ownership für Provider und CLI-Backend
- Ownership für Einrichtungs-Provider, Befehlsalias, Modellkatalog-Provider und Manifest-Vertrag
- Validierung von Plugin-Konfigurationsschema und Kanal-Konfigurationsschema
- Entscheidungen zum automatischen Aktivieren beim Start
Die Sicherheitsgrenze ist Snapshot-Ersetzung, nicht Mutation. Erstellen Sie den Snapshot neu, wenn sich Konfiguration, Plugin-Inventar, Installationsdatensätze oder persistierte Indexrichtlinien ändern. Behandeln Sie ihn nicht als breit gefasste veränderbare globale Registry, und halten Sie keine unbegrenzten historischen Snapshots vor. Das Laden von Laufzeit-Plugins bleibt von Metadaten-Snapshots getrennt, damit veralteter Laufzeitstatus nicht hinter einem Metadaten-Cache verborgen werden kann.
Die Cache-Regel ist in Interne Plugin-Architektur dokumentiert: Manifest- und Erkennungsmetadaten sind frisch, sofern ein Aufrufer keinen expliziten Snapshot, keine Lookup-Tabelle oder keine Manifest-Registry für den aktuellen Ablauf hält. Versteckte Metadaten-Caches und wall-clock-TTLs sind nicht Teil des Plugin-Ladens. Nur Laufzeit-Loader-, Modul- und Abhängigkeitsartefakt-Caches dürfen bestehen bleiben, nachdem Code oder installierte Artefakte tatsächlich geladen wurden.
Einige Cold-Path-Aufrufer rekonstruieren Manifest-Registries weiterhin direkt aus dem persistierten installierten Plugin-Index, statt eine Gateway-PluginLookUpTable zu erhalten. Dieser Pfad rekonstruiert die Registry jetzt bei Bedarf; bevorzugen Sie die Übergabe der aktuellen Lookup-Tabelle oder einer expliziten Manifest-Registry durch Laufzeitabläufe, wenn ein Aufrufer bereits eine hat.
Aktivierungsplanung
Aktivierungsplanung ist Teil der Control Plane. Aufrufer können abfragen, welche Plugins für einen konkreten Befehl, Provider, Kanal, eine Route, ein Agent-Harness oder eine Fähigkeit relevant sind, bevor breitere Laufzeit-Registries geladen werden.
Der Planner hält das aktuelle Manifest-Verhalten kompatibel:
activation.*-Felder sind explizite Planner-Hinweiseproviders,channels,commandAliases,setup.providers,contracts.toolsund Hooks bleiben Fallback für Manifest-Ownership- die API des ids-only Planners bleibt für bestehende Aufrufer verfügbar
- die Plan-API meldet Begründungslabels, damit Diagnosen explizite Hinweise von Ownership-Fallback unterscheiden können
Channel-Plugins und das gemeinsame Nachrichtentool
Channel-Plugins müssen für normale Chat-Aktionen kein separates Tool zum Senden, Bearbeiten oder Reagieren registrieren. OpenClaw hält ein gemeinsames message-Tool im Kern vor, und Channel-Plugins besitzen die channelspezifische Erkennung und Ausführung dahinter.
Die aktuelle Grenze ist:
- der Kern besitzt den gemeinsamen
message-Tool-Host, die Prompt-Verkabelung, die Sitzungs-/Thread-Buchführung und die Ausführungsweiterleitung - Channel-Plugins besitzen die bereichsbezogene Aktionserkennung, Capability-Erkennung und alle channelspezifischen Schemafragmente
- Channel-Plugins besitzen die providerspezifische Konversationsgrammatik für Sitzungen, etwa wie Konversations-IDs Thread-IDs kodieren oder von übergeordneten Konversationen erben
- Channel-Plugins führen die finale Aktion über ihren Aktionsadapter aus
Für Channel-Plugins ist die SDK-Oberfläche ChannelMessageActionAdapter.describeMessageTool(...). Dieser einheitliche Erkennungsaufruf ermöglicht es einem Plugin, seine sichtbaren Aktionen, Capabilities und Schemabeiträge gemeinsam zurückzugeben, damit diese Teile nicht auseinanderlaufen.
Wenn ein channelspezifischer Parameter des Nachrichtentools eine Medienquelle wie einen lokalen Pfad oder eine entfernte Medien-URL enthält, sollte das Plugin außerdem mediaSourceParams aus describeMessageTool(...) zurückgeben. Der Kern verwendet diese explizite Liste, um Sandbox-Pfadnormalisierung und Hinweise zum ausgehenden Medienzugriff anzuwenden, ohne plugin-eigene Parameternamen fest zu codieren. Bevorzugen Sie dort aktionsbezogene Maps statt einer channelweiten flachen Liste, damit ein nur für Profile bestimmter Medienparameter nicht bei nicht verwandten Aktionen wie send normalisiert wird.
Der Kern übergibt den Laufzeitbereich in diesen Erkennungsschritt. Wichtige Felder sind:
accountIdcurrentChannelIdcurrentThreadTscurrentMessageIdsessionKeysessionIdagentId- vertrauenswürdige eingehende
requesterSenderId
Das ist für kontextsensitive Plugins wichtig. Ein Channel kann Nachrichtenaktionen basierend auf aktivem Konto, aktuellem Raum/Thread/aktueller Nachricht oder vertrauenswürdiger Requester-Identität ausblenden oder anzeigen, ohne channelspezifische Verzweigungen im zentralen message-Tool fest zu codieren.
Deshalb sind Routing-Änderungen am eingebetteten Runner weiterhin Plugin-Arbeit: Der Runner ist dafür verantwortlich, die aktuelle Chat-/Sitzungsidentität an die Plugin-Erkennungsgrenze weiterzuleiten, damit das gemeinsame message-Tool die richtige channel-eigene Oberfläche für den aktuellen Turn bereitstellt.
Für channel-eigene Ausführungshelfer sollten gebündelte Plugins die Ausführungslaufzeit in ihren eigenen Erweiterungsmodulen halten. Der Kern besitzt die Laufzeiten für Discord-, Slack-, Telegram- oder WhatsApp-Nachrichtenaktionen unter src/agents/tools nicht mehr. Wir veröffentlichen keine separaten plugin-sdk/*-action-runtime-Unterpfade, und gebündelte Plugins sollten ihren eigenen lokalen Laufzeitcode direkt aus ihren erweiterungseigenen Modulen importieren.
Dieselbe Grenze gilt allgemein für provider-benannte SDK-Schnittstellen: Der Kern sollte keine channelspezifischen Convenience-Barrels für Slack, Discord, Signal, WhatsApp oder ähnliche Erweiterungen importieren. Wenn der Kern ein Verhalten benötigt, sollte er entweder das eigene api.ts- / runtime-api.ts-Barrel des gebündelten Plugins konsumieren oder den Bedarf in eine enge generische Capability im gemeinsamen SDK überführen.
Gebündelte Plugins folgen derselben Regel. Das runtime-api.ts eines gebündelten Plugins sollte seine eigene markenspezifische openclaw/plugin-sdk/<plugin-id>-Fassade nicht erneut exportieren. Diese markenspezifischen Fassaden bleiben Kompatibilitäts-Shims für externe Plugins und ältere Verbraucher, aber gebündelte Plugins sollten lokale Exporte plus enge generische SDK-Unterpfade wie openclaw/plugin-sdk/channel-policy, openclaw/plugin-sdk/runtime-store oder openclaw/plugin-sdk/webhook-ingress verwenden. Neuer Code sollte keine plugin-id-spezifischen SDK-Fassaden hinzufügen, außer die Kompatibilitätsgrenze für ein bestehendes externes Ökosystem erfordert es.
Speziell für Umfragen gibt es zwei Ausführungspfade:
outbound.sendPollist die gemeinsame Basis für Channels, die zum üblichen Umfragemodell passenactions.handleAction("poll")ist der bevorzugte Pfad für channelspezifische Umfragesemantik oder zusätzliche Umfrageparameter
Der Kern verschiebt das gemeinsame Parsen von Umfragen jetzt, bis die Plugin-Umfrageweiterleitung die Aktion ablehnt, damit plugin-eigene Umfrage-Handler channelspezifische Umfragefelder akzeptieren können, ohne zuerst vom generischen Umfrageparser blockiert zu werden.
Siehe Plugin-Architektur-Interna für die vollständige Startsequenz.
Capability-Ownership-Modell
OpenClaw behandelt ein natives Plugin als Ownership-Grenze für ein Unternehmen oder ein Feature, nicht als Sammelbecken nicht zusammenhängender Integrationen.
Das bedeutet:
- ein Unternehmens-Plugin sollte in der Regel alle OpenClaw-bezogenen Oberflächen dieses Unternehmens besitzen
- ein Feature-Plugin sollte in der Regel die vollständige Feature-Oberfläche besitzen, die es einführt
- Channels sollten gemeinsame Kern-Capabilities konsumieren, statt Provider-Verhalten ad hoc neu zu implementieren
Mehrere Vendor-Capabilities
openai besitzt Textinferenz, Sprache, Echtzeit-Sprache, Medienverständnis und Bilderzeugung. google besitzt Textinferenz plus Medienverständnis, Bilderzeugung und Websuche. qwen besitzt Textinferenz plus Medienverständnis und Videogenerierung.
Eine Vendor-Capability
elevenlabs und microsoft besitzen Sprache; firecrawl besitzt Web-Abruf; minimax / mistral / moonshot / zai besitzen Backends für Medienverständnis.
Feature-Plugin
voice-call besitzt Anruftransport, Tools, CLI, Routen und Twilio-Media-Stream-Bridging, konsumiert aber gemeinsame Capabilities für Sprache, Echtzeit-Transkription und Echtzeit-Sprache, statt Vendor-Plugins direkt zu importieren.
Der angestrebte Endzustand ist:
- OpenAI lebt in einem Plugin, auch wenn es Textmodelle, Sprache, Bilder und künftige Videos umfasst
- ein anderer Vendor kann dasselbe für seine eigene Oberfläche tun
- Channels ist es egal, welches Vendor-Plugin den Provider besitzt; sie konsumieren den gemeinsamen Capability-Vertrag, den der Kern bereitstellt
Das ist die zentrale Unterscheidung:
- Plugin = Ownership-Grenze
- Capability = Kernvertrag, den mehrere Plugins implementieren oder konsumieren können
Wenn OpenClaw also eine neue Domäne wie Video hinzufügt, lautet die erste Frage nicht: „Welcher Provider sollte die Videoverarbeitung fest codieren?“ Die erste Frage lautet: „Was ist der Kernvertrag für die Video-Capability?“ Sobald dieser Vertrag existiert, können Vendor-Plugins sich dagegen registrieren, und Channel-/Feature-Plugins können ihn konsumieren.
Wenn die Capability noch nicht existiert, ist der richtige Schritt normalerweise:
Capability definieren
Definieren Sie die fehlende Capability im Kern.
Über das SDK bereitstellen
Stellen Sie sie typisiert über die Plugin-API/-Laufzeit bereit.
Verbraucher verdrahten
Verdrahten Sie Channels/Features gegen diese Capability.
Vendor-Implementierungen
Lassen Sie Vendor-Plugins Implementierungen registrieren.
So bleibt Ownership explizit, während Kernverhalten vermieden wird, das von einem einzelnen Vendor oder einem einmaligen plugin-spezifischen Codepfad abhängt.
Capability-Schichtung
Verwenden Sie dieses mentale Modell, wenn Sie entscheiden, wohin Code gehört:
Kern-Capability-Schicht
Gemeinsame Orchestrierung, Policy, Fallback, Regeln zum Zusammenführen von Konfiguration, Auslieferungssemantik und typisierte Verträge.
Vendor-Plugin-Schicht
Vendorspezifische APIs, Authentifizierung, Modellkataloge, Sprachsynthese, Bilderzeugung, künftige Video-Backends, Nutzungsendpunkte.
Channel-/Feature-Plugin-Schicht
Slack-/Discord-/voice-call-/usw.-Integration, die Kern-Capabilities konsumiert und sie auf einer Oberfläche präsentiert.
TTS folgt zum Beispiel dieser Form:
- der Kern besitzt die TTS-Policy zur Antwortzeit, Fallback-Reihenfolge, Einstellungen und Channel-Auslieferung
openai,elevenlabsundmicrosoftbesitzen Syntheseimplementierungenvoice-callkonsumiert den TTS-Laufzeithelfer für Telefonie
Dasselbe Muster sollte für künftige Capabilities bevorzugt werden.
Beispiel für ein Unternehmens-Plugin mit mehreren Capabilities
Ein Unternehmens-Plugin sollte sich von außen kohärent anfühlen. Wenn OpenClaw gemeinsame Verträge für Modelle, Sprache, Echtzeit-Transkription, Echtzeit-Sprache, Medienverständnis, Bilderzeugung, Videogenerierung, Web-Abruf und Websuche hat, kann ein Vendor alle seine Oberflächen an einem Ort besitzen:
describeImageWithModel,
transcribeOpenAiCompatibleAudio,
} from "openclaw/plugin-sdk/media-understanding";
const plugin: OpenClawPluginDefinition = {
id: "exampleai",
name: "ExampleAI",
register(api) {
api.registerProvider({
id: "exampleai",
// auth/model catalog/runtime hooks
});
api.registerSpeechProvider({
id: "exampleai",
// vendor speech config — implement the SpeechProviderPlugin interface directly
});
api.registerMediaUnderstandingProvider({
id: "exampleai",
capabilities: ["image", "audio", "video"],
async describeImage(req) {
return describeImageWithModel({
provider: "exampleai",
model: req.model,
input: req.input,
});
},
async transcribeAudio(req) {
return transcribeOpenAiCompatibleAudio({
provider: "exampleai",
model: req.model,
input: req.input,
});
},
});
api.registerWebSearchProvider(
createPluginBackedWebSearchProvider({
id: "exampleai-search",
// credential + fetch logic
}),
);
},
};
export default plugin;
Wichtig sind nicht die exakten Namen der Helfer. Wichtig ist die Form:
- ein Plugin besitzt die Vendor-Oberfläche
- der Kern besitzt weiterhin die Capability-Verträge
- Channels und Feature-Plugins konsumieren
api.runtime.*-Helfer, keinen Vendor-Code - Vertragstests können sicherstellen, dass das Plugin die Capabilities registriert hat, die es zu besitzen beansprucht
Capability-Beispiel: Videoverständnis
OpenClaw behandelt Bild-/Audio-/Videoverständnis bereits als eine gemeinsame Capability. Dasselbe Ownership-Modell gilt dort:
Der Kern definiert den Vertrag
Der Kern definiert den Vertrag für Medienverständnis.
Vendor-Plugins registrieren
Vendor-Plugins registrieren describeImage, transcribeAudio und describeVideo, sofern zutreffend.
Verbraucher verwenden das gemeinsame Verhalten
Channels und Feature-Plugins konsumieren das gemeinsame Kernverhalten, statt direkt mit Vendor-Code zu verdrahten.
Das verhindert, dass die Videoannahmen eines einzelnen Providers in den Kern eingebettet werden. Das Plugin besitzt die Vendor-Oberfläche; der Kern besitzt den Capability-Vertrag und das Fallback-Verhalten.
Videogenerierung verwendet bereits dieselbe Sequenz: Der Kern besitzt den typisierten Capability-Vertrag und den Laufzeithelfer, und Vendor-Plugins registrieren api.registerVideoGenerationProvider(...)-Implementierungen dagegen.
Benötigen Sie eine konkrete Rollout-Checkliste? Siehe Capability Cookbook.
Verträge und Durchsetzung
Die Plugin-API-Oberfläche ist absichtlich typisiert und in OpenClawPluginApi zentralisiert. Dieser Vertrag definiert die unterstützten Registrierungspunkte und die Laufzeithelfer, auf die sich ein Plugin verlassen darf.
Warum das wichtig ist:
- Plugin-Autoren erhalten einen stabilen internen Standard
- der Kern kann doppelte Ownership ablehnen, etwa wenn zwei Plugins dieselbe Provider-ID registrieren
- der Start kann umsetzbare Diagnosen für fehlerhafte Registrierung anzeigen
- Vertragstests können Ownership gebündelter Plugins durchsetzen und stille Abweichungen verhindern
Es gibt zwei Ebenen der Durchsetzung:
Durchsetzung der Runtime-Registrierung
Die Plugin-Registry validiert Registrierungen, während Plugins geladen werden. Beispiele: doppelte Provider-IDs, doppelte Speech-Provider-IDs und fehlerhafte Registrierungen erzeugen Plugin-Diagnosen statt undefiniertem Verhalten.
Contract-Tests
Gebündelte Plugins werden während Testläufen in Contract-Registries erfasst, damit OpenClaw die Ownership explizit prüfen kann. Derzeit wird dies für Modell-Provider, Speech-Provider, Websuche-Provider und die Ownership gebündelter Registrierungen verwendet.
Der praktische Effekt ist, dass OpenClaw im Voraus weiß, welches Plugin welche Oberfläche besitzt. Dadurch können Core und Channels nahtlos zusammenspielen, weil Ownership deklariert, typisiert und testbar ist, statt implizit zu sein.
Was in einen Contract gehört
Gute Contracts
- typisiert
- klein
- capability-spezifisch
- im Besitz des Core
- von mehreren Plugins wiederverwendbar
- von Channels/Funktionen ohne Vendor-Wissen nutzbar
Schlechte Contracts
- Vendor-spezifische Policy, die im Core verborgen ist
- einmalige Plugin-Fluchtwege, die die Registry umgehen
- Channel-Code, der direkt in eine Vendor-Implementierung greift
- Ad-hoc-Runtime-Objekte, die nicht Teil von
OpenClawPluginApioderapi.runtimesind
Im Zweifel erhöhen Sie die Abstraktionsebene: Definieren Sie zuerst die Capability, und lassen Sie Plugins sich dann daran anbinden.
Ausführungsmodell
Native OpenClaw-Plugins laufen in-process mit dem Gateway. Sie sind nicht sandboxed. Ein geladenes natives Plugin hat dieselbe Vertrauensgrenze auf Prozessebene wie Core-Code.
Compatible Bundles sind standardmäßig sicherer, weil OpenClaw sie derzeit als Metadaten-/Inhaltspakete behandelt. In aktuellen Releases bedeutet das hauptsächlich gebündelte Skills.
Verwenden Sie Allowlists und explizite Installations-/Ladepfade für nicht gebündelte Plugins. Behandeln Sie Workspace-Plugins als Code für die Entwicklungszeit, nicht als Produktionsstandard.
Halten Sie bei gebündelten Workspace-Paketnamen die Plugin-ID standardmäßig im npm-Namen verankert: @openclaw/<id>, oder verwenden Sie ein genehmigtes typisiertes Suffix wie -provider, -plugin, -speech, -sandbox oder -media-understanding, wenn das Paket absichtlich eine engere Plugin-Rolle bereitstellt.
Exportgrenze
OpenClaw exportiert Capabilities, nicht Implementierungskomfort.
Halten Sie Capability-Registrierung öffentlich. Entfernen Sie Nicht-Contract-Hilfsexporte:
- Hilfs-Subpfade, die spezifisch für gebündelte Plugins sind
- Runtime-Plumbing-Subpfade, die nicht als öffentliche API gedacht sind
- Vendor-spezifische Komfort-Helper
- Setup-/Onboarding-Helper, die Implementierungsdetails sind
Reservierte Hilfs-Subpfade für gebündelte Plugins wurden aus der generierten SDK-Export-Map entfernt. Halten Sie owner-spezifische Helper innerhalb des besitzenden Plugin-Pakets; heben Sie nur wiederverwendbares Host-Verhalten in generische SDK-Contracts wie plugin-sdk/gateway-runtime, plugin-sdk/security-runtime und plugin-sdk/plugin-config-runtime.
Interna und Referenz
Informationen zur Ladepipeline, zum Registry-Modell, zu Provider-Runtime-Hooks, Gateway-HTTP-Routen, Message-Tool-Schemata, Channel-Zielauflösung, Provider-Katalogen, Context-Engine-Plugins und zur Anleitung zum Hinzufügen einer neuen Capability finden Sie unter Interna der Plugin-Architektur.