Plugins
Übersicht zum Plugin SDK
Das Plugin-SDK ist die typisierte Schnittstelle zwischen Plugins und Core. Diese Seite ist die Referenz dafür, was importiert werden soll und was Sie registrieren können.
Importkonvention
Importieren Sie immer aus einem spezifischen Unterpfad:
Jeder Unterpfad ist ein kleines, eigenständiges Modul. Dadurch bleibt der Start schnell und
Probleme mit zirkulären Abhängigkeiten werden vermieden. Für Channel-spezifische Entry-/Build-Helfer
bevorzugen Sie openclaw/plugin-sdk/channel-core; behalten Sie openclaw/plugin-sdk/core für
die breitere Sammeloberfläche und gemeinsam genutzte Helfer wie
buildChannelConfigSchema bei.
Für die Channel-Konfiguration veröffentlichen Sie das Channel-eigene JSON Schema über
openclaw.plugin.json#channelConfigs. Der Unterpfad plugin-sdk/channel-config-schema
ist für gemeinsam genutzte Schema-Primitiven und den generischen Builder vorgesehen. Die
gebündelten Plugins von OpenClaw verwenden plugin-sdk/bundled-channel-config-schema für beibehaltene
Schemas gebündelter Channels. Veraltete Kompatibilitätsexporte verbleiben unter
plugin-sdk/channel-config-schema-legacy; keiner der beiden gebündelten Schema-Unterpfade ist ein
Muster für neue Plugins.
Unterpfadreferenz
Das Plugin-SDK wird als Sammlung enger Unterpfade bereitgestellt, gruppiert nach Bereich (Plugin- Entry, Channel, Provider, Authentifizierung, Runtime, Capability, Memory und reservierte Helfer für gebündelte Plugins). Den vollständigen Katalog, gruppiert und verlinkt, finden Sie unter Plugin-SDK-Unterpfade.
Die generierte Liste mit über 200 Unterpfaden befindet sich in scripts/lib/plugin-sdk-entrypoints.json.
Registrierungs-API
Der Callback register(api) erhält ein OpenClawPluginApi-Objekt mit diesen
Methoden:
Capability-Registrierung
| Methode | Was registriert wird |
|---|---|
api.registerProvider(...) |
Textinferenz (LLM) |
api.registerAgentHarness(...) |
Experimenteller Low-Level-Agent-Executor |
api.registerCliBackend(...) |
Lokales CLI-Inferenz-Backend |
api.registerChannel(...) |
Messaging-Channel |
api.registerSpeechProvider(...) |
Text-to-Speech-/STT-Synthese |
api.registerRealtimeTranscriptionProvider(...) |
Streaming-Echtzeittranskription |
api.registerRealtimeVoiceProvider(...) |
Duplex-Echtzeit-Sprachsitzungen |
api.registerMediaUnderstandingProvider(...) |
Bild-/Audio-/Videoanalyse |
api.registerImageGenerationProvider(...) |
Bilderzeugung |
api.registerMusicGenerationProvider(...) |
Musikerzeugung |
api.registerVideoGenerationProvider(...) |
Videoerzeugung |
api.registerWebFetchProvider(...) |
Web-Fetch-/Scrape-Provider |
api.registerWebSearchProvider(...) |
Websuche |
Tools und Befehle
| Methode | Was registriert wird |
|---|---|
api.registerTool(tool, opts?) |
Agent-Tool (erforderlich oder { optional: true }) |
api.registerCommand(def) |
Benutzerdefinierter Befehl (umgeht das LLM) |
Plugin-Befehle können agentPromptGuidance setzen, wenn der Agent einen kurzen,
befehlsseitigen Routing-Hinweis benötigt. Beschränken Sie diesen Text auf den Befehl selbst; fügen Sie keine
Provider- oder Plugin-spezifische Policy zu Core-Prompt-Buildern hinzu.
Infrastruktur
| Methode | Was registriert wird |
|---|---|
api.registerHook(events, handler, opts?) |
Event-Hook |
api.registerHttpRoute(params) |
Gateway-HTTP-Endpunkt |
api.registerGatewayMethod(name, handler) |
Gateway-RPC-Methode |
api.registerGatewayDiscoveryService(service) |
Lokaler Gateway-Discovery-Advertiser |
api.registerCli(registrar, opts?) |
CLI-Unterbefehl |
api.registerService(service) |
Hintergrunddienst |
api.registerInteractiveHandler(registration) |
Interaktiver Handler |
api.registerAgentToolResultMiddleware(...) |
Runtime-Middleware für Tool-Ergebnisse |
api.registerMemoryPromptSupplement(builder) |
Additiver Prompt-Abschnitt nahe Memory |
api.registerMemoryCorpusSupplement(adapter) |
Additiver Memory-Such-/Lese-Korpus |
Host-Hooks für Workflow-Plugins
Host-Hooks sind die SDK-Schnittstellen für Plugins, die am Host- Lifecycle teilnehmen müssen, statt nur einen Provider, Channel oder ein Tool hinzuzufügen. Sie sind generische Verträge; Plan Mode kann sie verwenden, ebenso aber Approval-Workflows, Workspace-Policy-Gates, Hintergrundmonitore, Einrichtungsassistenten und UI-Begleit- Plugins.
| Methode | Vertrag, den sie besitzt |
|---|---|
api.registerSessionExtension(...) |
Plugin-eigener, JSON-kompatibler Sitzungszustand, der über Gateway-Sitzungen projiziert wird |
api.enqueueNextTurnInjection(...) |
Dauerhafter Exactly-once-Kontext, der in den nächsten Agent-Turn für eine Sitzung injiziert wird |
api.registerTrustedToolPolicy(...) |
Gebündelte/vertrauenswürdige Pre-Plugin-Tool-Policy, die Tool-Parameter blockieren oder umschreiben kann |
api.registerToolMetadata(...) |
Anzeige-Metadaten des Tool-Katalogs, ohne die Tool-Implementierung zu ändern |
api.registerCommand(...) |
Scoped Plugin-Befehle; Befehlsergebnisse können continueAgent: true setzen; native Discord-Befehle unterstützen descriptionLocalizations |
api.registerControlUiDescriptor(...) |
Control-UI-Beitragsdeskriptoren für Sitzungs-, Tool-, Lauf- oder Einstellungsoberflächen |
api.registerRuntimeLifecycle(...) |
Cleanup-Callbacks für Plugin-eigene Runtime-Ressourcen auf Reset-/Delete-/Reload-Pfaden |
api.registerAgentEventSubscription(...) |
Bereinigte Event-Abonnements für Workflow-Zustand und Monitore |
api.setRunContext(...) / getRunContext(...) / clearRunContext(...) |
Plugin-Scratch-State pro Lauf, der beim terminalen Lauf-Lifecycle gelöscht wird |
api.registerSessionSchedulerJob(...) |
Plugin-eigene Session-Scheduler-Job-Records mit deterministischem Cleanup |
Die Verträge teilen Autorität bewusst auf:
- Externe Plugins können Session-Erweiterungen, UI-Deskriptoren, Befehle, Tool- Metadaten, Next-Turn-Injections und normale Hooks besitzen.
- Vertrauenswürdige Tool-Policies laufen vor gewöhnlichen
before_tool_call-Hooks und sind nur gebündelt, weil sie an der Host-Sicherheits-Policy teilnehmen. - Reservierter Befehlsbesitz ist nur gebündelt. Externe Plugins sollten ihre eigenen Befehlsnamen oder Aliase verwenden.
allowPromptInjection=falsedeaktiviert prompt-verändernde Hooks einschließlichagent_turn_prepare,before_prompt_build,heartbeat_prompt_contribution, Prompt-Felder aus dem Legacy-before_agent_startundenqueueNextTurnInjection.
Beispiele für Nicht-Plan-Consumer:
| Plugin-Archetyp | Verwendete Hooks |
|---|---|
| Approval-Workflow | Session-Erweiterung, Befehlsfortsetzung, Next-Turn-Injection, UI-Deskriptor |
| Budget-/Workspace-Policy-Gate | Vertrauenswürdige Tool-Policy, Tool-Metadaten, Sitzungsprojektion |
| Hintergrund-Lifecycle-Monitor | Runtime-Lifecycle-Cleanup, Agent-Event-Abonnement, Session-Scheduler-Besitz/-Cleanup, Heartbeat-Prompt-Beitrag, UI-Deskriptor |
| Einrichtungs- oder Onboarding-Assistent | Session-Erweiterung, scoped Befehle, Control-UI-Deskriptor |
When to use tool-result middleware
Gebündelte Plugins können api.registerAgentToolResultMiddleware(...) verwenden, wenn
sie ein Tool-Ergebnis nach der Ausführung und bevor die Runtime
dieses Ergebnis zurück in das Modell einspeist, umschreiben müssen. Dies ist die vertrauenswürdige Runtime-neutrale
Schnittstelle für asynchrone Output-Reducer wie tokenjuice.
Gebündelte Plugins müssen contracts.agentToolResultMiddleware für jede
Ziel-Runtime deklarieren, zum Beispiel ["pi", "codex"]. Externe Plugins
können diese Middleware nicht registrieren; verwenden Sie normale OpenClaw-Plugin-Hooks für Arbeit,
die kein Timing für Tool-Ergebnisse vor dem Modell benötigt. Der alte, nur für Pi bestimmte eingebettete
Registrierungspfad der Extension-Factory wurde entfernt.
Gateway-Discovery-Registrierung
api.registerGatewayDiscoveryService(...) ermöglicht einem Plugin, den aktiven
Gateway über einen lokalen Erkennungstransport wie mDNS/Bonjour anzukündigen. OpenClaw ruft den
Dienst während des Gateway-Starts auf, wenn lokale Erkennung aktiviert ist, übergibt die
aktuellen Gateway-Ports und nicht geheimen TXT-Hinweisdaten und ruft beim
Herunterfahren des Gateways den zurückgegebenen stop-Handler auf.
api.registerGatewayDiscoveryService({
id: "my-discovery",
async advertise(ctx) {
const handle = await startMyAdvertiser({
gatewayPort: ctx.gatewayPort,
tls: ctx.gatewayTlsEnabled,
displayName: ctx.machineDisplayName,
});
return { stop: () => handle.stop() };
},
});
Gateway-Erkennungs-Plugins dürfen angekündigte TXT-Werte nicht als Geheimnisse oder Authentifizierung behandeln. Erkennung ist ein Routing-Hinweis; Gateway-Authentifizierung und TLS-Pinning bleiben für die Vertrauensstellung zuständig.
CLI-Registrierungsmetadaten
api.registerCli(registrar, opts?) akzeptiert zwei Arten von Metadaten auf oberster Ebene:
commands: explizite Befehlswurzeln im Besitz des Registrarsdescriptors: Deskriptoren für Befehle zur Parse-Zeit, die für die Root-CLI-Hilfe, das Routing und die verzögerte CLI-Registrierung von Plugins verwendet werden
Wenn ein Plugin-Befehl im normalen Root-CLI-Pfad verzögert geladen bleiben soll,
stellen Sie descriptors bereit, die jede von diesem Registrar bereitgestellte
Befehlswurzel auf oberster Ebene abdecken.
api.registerCli(
async ({ program }) => {
const { registerMatrixCli } = await import("./src/cli.js");
registerMatrixCli({ program });
},
{
descriptors: [
{
name: "matrix",
description: "Manage Matrix accounts, verification, devices, and profile state",
hasSubcommands: true,
},
],
},
);
Verwenden Sie commands allein nur, wenn Sie keine verzögerte Root-CLI-Registrierung benötigen.
Dieser eifrige Kompatibilitätspfad wird weiterhin unterstützt, installiert jedoch keine
deskriptorbasierten Platzhalter für verzögertes Laden zur Parse-Zeit.
CLI-Backend-Registrierung
api.registerCliBackend(...) ermöglicht einem Plugin, die Standardkonfiguration für ein lokales
KI-CLI-Backend wie codex-cli zu besitzen.
- Die Backend-
idwird zum Provider-Präfix in Modellreferenzen wiecodex-cli/gpt-5. - Die Backend-
configverwendet dieselbe Form wieagents.defaults.cliBackends.<id>. - Die Benutzerkonfiguration hat weiterhin Vorrang. OpenClaw führt
agents.defaults.cliBackends.<id>mit dem Plugin-Standard zusammen, bevor die CLI ausgeführt wird. - Verwenden Sie
normalizeConfig, wenn ein Backend nach dem Zusammenführen Kompatibilitätsumschreibungen benötigt (zum Beispiel die Normalisierung alter Flag-Formen). - Verwenden Sie
resolveExecutionArgsfür anfragebezogene argv-Umschreibungen, die zum CLI-Dialekt gehören, etwa das Zuordnen von OpenClaw-Denkstufen zu einem nativen Effort-Flag.
Exklusive Slots
| Methode | Was sie registriert |
|---|---|
api.registerContextEngine(id, factory) |
Kontext-Engine (jeweils eine aktiv). Der assemble()-Callback erhält availableTools und citationsMode, damit die Engine Prompt-Ergänzungen anpassen kann. |
api.registerMemoryCapability(capability) |
Einheitliche Memory-Funktion |
api.registerMemoryPromptSection(builder) |
Builder für Memory-Prompt-Abschnitte |
api.registerMemoryFlushPlan(resolver) |
Resolver für Memory-Flush-Pläne |
api.registerMemoryRuntime(runtime) |
Memory-Runtime-Adapter |
Memory-Embedding-Adapter
| Methode | Was sie registriert |
|---|---|
api.registerMemoryEmbeddingProvider(adapter) |
Memory-Embedding-Adapter für das aktive Plugin |
registerMemoryCapabilityist die bevorzugte exklusive Memory-Plugin-API.registerMemoryCapabilitykann außerdempublicArtifacts.listArtifacts(...)bereitstellen, damit Begleit-Plugins exportierte Memory-Artefakte überopenclaw/plugin-sdk/memory-host-corenutzen können, statt auf das private Layout eines bestimmten Memory-Plugins zuzugreifen.registerMemoryPromptSection,registerMemoryFlushPlanundregisterMemoryRuntimesind abwärtskompatible exklusive Memory-Plugin-APIs.MemoryFlushPlan.modelkann den Flush-Turn an eine exakteprovider/model- Referenz wieollama/qwen3:8bbinden, ohne die aktive Fallback- Kette zu übernehmen.registerMemoryEmbeddingProviderermöglicht dem aktiven Memory-Plugin, eine oder mehrere Embedding-Adapter-IDs zu registrieren (zum Beispielopenai,geminioder eine benutzerdefinierte vom Plugin definierte ID).- Benutzerkonfiguration wie
agents.defaults.memorySearch.providerundagents.defaults.memorySearch.fallbackwird gegen diese registrierten Adapter-IDs aufgelöst.
Ereignisse und Lebenszyklus
| Methode | Was sie bewirkt |
|---|---|
api.on(hookName, handler, opts?) |
Typisierter Lebenszyklus-Hook |
api.onConversationBindingResolved(handler) |
Callback für Konversationsbindung |
Siehe Plugin-Hooks für Beispiele, gängige Hook-Namen und Guard- Semantik.
Semantik von Hook-Entscheidungen
before_tool_call: Die Rückgabe von{ block: true }ist terminal. Sobald ein Handler dies setzt, werden Handler mit niedrigerer Priorität übersprungen.before_tool_call: Die Rückgabe von{ block: false }wird als keine Entscheidung behandelt (genauso wie das Weglassen vonblock), nicht als Überschreibung.before_install: Die Rückgabe von{ block: true }ist terminal. Sobald ein Handler dies setzt, werden Handler mit niedrigerer Priorität übersprungen.before_install: Die Rückgabe von{ block: false }wird als keine Entscheidung behandelt (genauso wie das Weglassen vonblock), nicht als Überschreibung.reply_dispatch: Die Rückgabe von{ handled: true, ... }ist terminal. Sobald ein Handler den Versand beansprucht, werden Handler mit niedrigerer Priorität und der Standardpfad für den Modellversand übersprungen.message_sending: Die Rückgabe von{ cancel: true }ist terminal. Sobald ein Handler dies setzt, werden Handler mit niedrigerer Priorität übersprungen.message_sending: Die Rückgabe von{ cancel: false }wird als keine Entscheidung behandelt (genauso wie das Weglassen voncancel), nicht als Überschreibung.message_received: Verwenden Sie das typisierte FeldthreadId, wenn Sie eingehendes Thread-/Topic-Routing benötigen. Behalten Siemetadatafür kanalspezifische Extras bei.message_sending: Verwenden Sie die typisierten Routing-FelderreplyToId/threadId, bevor Sie auf kanalspezifischemetadatazurückfallen.gateway_start: Verwenden Siectx.config,ctx.workspaceDirundctx.getCron?.()für gatewayeigenen Startzustand, statt sich auf internegateway:startup-Hooks zu verlassen.cron_changed: Beobachten Sie gatewayeigene Cron-Lebenszyklusänderungen. Verwenden Sieevent.job?.state?.nextRunAtMsundctx.getCron?.(), wenn Sie externe Wake-Scheduler synchronisieren, und behalten Sie OpenClaw als Quelle der Wahrheit für Fälligkeitsprüfungen und Ausführung bei.
API-Objektfelder
| Feld | Typ | Beschreibung |
|---|---|---|
api.id |
string |
Plugin-ID |
api.name |
string |
Anzeigename |
api.version |
string? |
Plugin-Version (optional) |
api.description |
string? |
Plugin-Beschreibung (optional) |
api.source |
string |
Plugin-Quellpfad |
api.rootDir |
string? |
Plugin-Stammverzeichnis (optional) |
api.config |
OpenClawConfig |
Aktueller Konfigurations-Snapshot (aktiver In-Memory-Runtime-Snapshot, wenn verfügbar) |
api.pluginConfig |
Record<string, unknown> |
Plugin-spezifische Konfiguration aus plugins.entries.<id>.config |
api.runtime |
PluginRuntime |
Runtime-Hilfsfunktionen |
api.logger |
PluginLogger |
Bereichsgebundener Logger (debug, info, warn, error) |
api.registrationMode |
PluginRegistrationMode |
Aktueller Lademodus; "setup-runtime" ist das schlanke Start-/Einrichtungsfenster vor dem vollständigen Einstieg |
api.resolvePath(input) |
(string) => string |
Pfad relativ zum Plugin-Stamm auflösen |
Konvention für interne Module
Verwenden Sie innerhalb Ihres Plugins lokale Barrel-Dateien für interne Importe:
my-plugin/
api.ts # Public exports for external consumers
runtime-api.ts # Internal-only runtime exports
index.ts # Plugin entry point
setup-entry.ts # Lightweight setup-only entry (optional)
Über Facades geladene öffentliche Oberflächen gebündelter Plugins (api.ts, runtime-api.ts,
index.ts, setup-entry.ts und ähnliche öffentliche Einstiegdateien) bevorzugen den
aktiven Runtime-Konfigurations-Snapshot, wenn OpenClaw bereits ausgeführt wird. Wenn noch kein Runtime-
Snapshot vorhanden ist, fallen sie auf die aufgelöste Konfigurationsdatei auf der Festplatte zurück.
Paketierte Facades gebündelter Plugins sollten über die Plugin-
Facade-Loader von OpenClaw geladen werden; direkte Importe aus dist/extensions/... umgehen die Manifest-
und Runtime-Sidecar-Prüfungen, die paketierte Installationen für Plugin-eigenen Code verwenden.
Provider-Plugins können ein schmales pluginlokales Vertrags-Barrel bereitstellen, wenn ein Hilfsprogramm absichtlich providerspezifisch ist und noch nicht in einen generischen SDK- Unterpfad gehört. Gebündelte Beispiele:
- Anthropic: öffentliche
api.ts- /contract-api.ts-Nahtstelle für Claude- Beta-Header- undservice_tier-Stream-Hilfsfunktionen. @openclaw/openai-provider:api.tsexportiert Provider-Builder, Hilfsfunktionen für Standardmodelle und Realtime-Provider-Builder.@openclaw/openrouter-provider:api.tsexportiert den Provider-Builder sowie Hilfsfunktionen für Onboarding/Konfiguration.
Verwandte
Optionen für definePluginEntry und defineChannelPluginEntry.
Vollständige Referenz für den Namespace api.runtime.
Paketierung, Manifeste und Konfigurationsschemas.
Testhilfen und Lint-Regeln.
Migration von veralteten Oberflächen.
Tiefgehende Architektur und Capability-Modell.