Plugin SDK reference
Übersicht über das Plugin-SDK
Das Plugin-SDK ist der typisierte Vertrag zwischen Plugins und dem Kern. Diese Seite dient als Referenz dafür, was importiert werden muss und was registriert werden kann.
Importkonvention
Importieren Sie immer aus einem bestimmten Unterpfad:
Jeder Unterpfad ist ein kleines, eigenständiges Modul. Dies beschleunigt den Start und
verhindert Probleme mit zyklischen Abhängigkeiten. Bevorzugen Sie für kanalspezifische Einstiegspunkt-/Build-Hilfsfunktionen
openclaw/plugin-sdk/channel-core; verwenden Sie openclaw/plugin-sdk/core weiterhin für
die umfassendere Sammelschnittstelle und gemeinsam genutzte Hilfsfunktionen wie
buildChannelConfigSchema.
Veröffentlichen Sie für die Kanalkonfiguration das kanaleigene JSON-Schema über
openclaw.plugin.json#channelConfigs. Der Unterpfad plugin-sdk/channel-config-schema
ist für gemeinsam genutzte Schemaprimitive und den generischen Builder vorgesehen. Die
mit OpenClaw gebündelten Plugins verwenden plugin-sdk/bundled-channel-config-schema für beibehaltene
Schemas gebündelter Kanäle. Dieser Unterpfad für gebündelte Schemas ist kein Muster für neue
Plugins.
Unterpfadreferenz
Das Plugin-SDK wird als Satz eng gefasster Unterpfade bereitgestellt, die nach Bereichen gruppiert sind (Plugin- Einstiegspunkt, Kanal, Provider, Authentifizierung, Laufzeit, Fähigkeit, Speicher und reservierte Hilfsfunktionen für gebündelte Plugins). Den vollständigen, gruppierten und verlinkten Katalog finden Sie unter Unterpfade des Plugin-SDKs.
Das Inventar der Compiler-Einstiegspunkte befindet sich in
scripts/lib/plugin-sdk-entrypoints.json; typisierte öffentliche Exporte schließen die
internen Unterpfade aus, die in
scripts/lib/plugin-sdk-private-local-only-subpaths.json aufgeführt sind. Produktionseinstiegspunkte
in dieser Liste behalten reine JavaScript-Exporte der Host-Laufzeit für separat
veröffentlichte offizielle Plugins bei, während reine Testeinstiegspunkte nicht exportiert bleiben. Führen Sie
pnpm plugin-sdk:surface aus, um die Anzahl öffentlicher Exporte zu prüfen. Veraltete öffentliche
Unterpfade, die alt genug sind und nicht vom Produktionscode gebündelter Erweiterungen verwendet werden,
werden in scripts/lib/plugin-sdk-deprecated-public-subpaths.json nachverfolgt; umfassende
veraltete Reexport-Barrels werden in
scripts/lib/plugin-sdk-deprecated-barrel-subpaths.json nachverfolgt.
Registrierungs-API
Der Callback register(api) erhält ein OpenClawPluginApi-Objekt mit diesen
Methoden:
Plugins, die eine externe Teamchat-Oberfläche für eine Sitzung bereitstellen, können
den einzelnen prozessweiten Provider registrieren, der von
openclaw/plugin-sdk/session-discussion exportiert wird. Dessen Methode info({ sessionKey })
meldet, ob eine Diskussion nicht verfügbar, zum Öffnen bereit oder bereits geöffnet ist;
open({ sessionKey }) erstellt oder ermittelt die Diskussion und gibt deren Einbettungs-
und externe URLs zurück. Durch die Registrierung eines anderen Providers wird der aktuelle Provider ersetzt.
Registrierung von Fähigkeiten
| Methode | Was sie registriert |
|---|---|
api.registerProvider(...) |
Textinferenz (LLM) |
api.registerWorkerProvider(...) |
Lebenszyklus-Leases für Cloud-Worker |
api.registerModelCatalogProvider(...) |
Modellkatalogzeilen für Text- und Mediengenerierung |
api.registerAgentHarness(...) |
Experimenteller nativer Agent-Executor (Codex, Copilot) |
api.registerCliBackend(...) |
Lokales CLI-Inferenz-Backend |
api.registerChannel(...) |
Nachrichtenkanal |
api.registerEmbeddingProvider(...) |
Wiederverwendbarer Provider für Vektoreinbettungen |
api.registerSpeechProvider(...) |
Text-zu-Sprache-/STT-Synthese |
api.registerRealtimeTranscriptionProvider(...) |
Echtzeit-Transkription per Streaming |
api.registerRealtimeVoiceProvider(...) |
Duplex-Echtzeit-Sprachsitzungen |
api.registerMediaUnderstandingProvider(...) |
Bild-/Audio-/Videoanalyse |
api.registerTranscriptSourceProvider(...) |
Quelle für Live- oder importierte Besprechungstranskripte; Besprechungs-Plugins können createMeetingTranscriptSourceProvider aus plugin-sdk/transcripts verwenden |
api.registerImageGenerationProvider(...) |
Bildgenerierung |
api.registerMusicGenerationProvider(...) |
Musikgenerierung |
api.registerVideoGenerationProvider(...) |
Videogenerierung |
api.registerWebFetchProvider(...) |
Provider für Webabruf/Web-Scraping |
api.registerWebSearchProvider(...) |
Websuche |
api.registerCompactionProvider(...) |
Austauschbares Backend für die Transkript-Compaction |
Worker-Provider müssen ihre ID außerdem in contracts.workerProviders deklarieren.
Der Kern speichert die dauerhafte Absicht vor provision(profile, operationId). Provider validieren die Einstellungen vor der externen Zuweisung und lösen bei einer dauerhaften Ablehnung des Profils WorkerProviderError aus. provision muss dieselbe Lease übernehmen, wenn sich die Vorgangs-ID wiederholt.
Der Kern speichert die validierten Profileinstellungen zusammen mit der Lease und stellt diesen Snapshot destroy({ leaseId, profile }), das idempotent sein muss, sowie inspect({ leaseId, profile }) bereit, das active, destroyed oder unknown zurückgibt. Dadurch können Provider Lebenszyklusaufrufe nach einem Neustart des Gateways oder dem Entfernen eines benannten Profils weiterleiten. SSH-Endpunkte verwenden für keyRef ein SecretRef, niemals direkt eingebettetes Schlüsselmaterial, und enthalten ein hostKey aus einer vertrauenswürdigen Bereitstellungsausgabe exakt als algorithm base64, ohne Hostnamen oder Kommentar. Der Kern fixiert hostKey und vertraut niemals einem Schlüssel aus der ersten Verbindung. Ein Provider, der ein dynamisches keyRef ausstellt, kann resolveSshIdentity({ leaseId, profile, keyRef }) implementieren; falls vorhanden, ist dieser Resolver maßgeblich, während Provider ohne ihn den konfigurierten generischen Secret-Resolver verwenden.
Provider mit verlängerbaren Leases können außerdem renew(leaseId) implementieren.
inspect muss bei vorübergehenden oder unbestimmten Fehlern eine Ausnahme auslösen; geben Sie unknown nur bei verbindlich festgestellter Abwesenheit zurück. Der Kern markiert einen aktiven lokalen Datensatz als verwaist oder behandelt die Abwesenheit nach einer dauerhaft gespeicherten Löschanforderung als Abschluss des Abbaus.
Mit api.registerEmbeddingProvider(...) registrierte Einbettungs-Provider müssen
außerdem im Plugin-Manifest unter contracts.embeddingProviders aufgeführt sein. Dies
ist die generische Einbettungsschnittstelle für wiederverwendbare Vektorgenerierung. Die Speichersuche
kann diese generische Provider-Schnittstelle verwenden. Die ältere Schnittstelle
api.registerMemoryEmbeddingProvider(...) und
contracts.memoryEmbeddingProviders dient als veraltete Kompatibilität, während
bestehende speicherspezifische Provider migriert werden.
Speicherspezifische Provider, die weiterhin eine Laufzeit batchEmbed(...) bereitstellen, verbleiben beim
bestehenden Vertrag für dateiweise Batches, sofern ihre Laufzeit nicht ausdrücklich
sourceWideBatchEmbed: true festlegt. Diese Aktivierung ermöglicht es dem Speicher-Host, Chunks aus
mehreren geänderten Speicherdateien und aktivierten Quellen in einem batchEmbed(...)-Aufruf
bis zu den Batch-Grenzwerten des Hosts zu übermitteln. Batch-Adapter, die JSONL-Anforderungsdateien hochladen, müssen
Provider-Aufträge sowohl vor Erreichen der maximalen Upload-Größe als auch der maximalen Anzahl
von Anforderungen aufteilen. Der Provider muss für jeden Eingabe-Chunk genau eine Einbettung in derselben Reihenfolge wie
batch.chunks zurückgeben; lassen Sie das Flag weg, wenn der Provider dateilokale Batches erwartet oder
die Eingabereihenfolge über einen größeren, quellweiten Auftrag hinweg nicht beibehalten kann.
Tools und Befehle
Verwenden Sie defineToolPlugin für einfache reine Tool-Plugins
mit festen Tool-Namen. Verwenden Sie api.registerTool(...) direkt für gemischte Plugins
oder eine vollständig dynamische Tool-Registrierung.
| Methode | Was sie registriert |
|---|---|
api.registerTool(tool, opts?) |
Agent-Tool (erforderlich oder { optional: true }) |
api.registerCommand(def) |
Benutzerdefinierter Befehl (umgeht das LLM) |
api.registerNodeHostCommand(command) |
Von openclaw node run verarbeiteter Befehl; optionale agentTool-Metadaten können ihn als für den Agenten sichtbares Tool verfügbar machen, während die Node verbunden ist |
Plugin-Befehle können agentPromptGuidance festlegen, wenn der Agent einen kurzen,
befehlseigenen Routing-Hinweis benötigt. Beschränken Sie diesen Text auf den Befehl selbst; fügen Sie den Prompt-Buildern
des Kerns keine Provider- oder Plugin-spezifischen Richtlinien hinzu.
Anleitungseinträge können Legacy-Zeichenfolgen sein, die für jede Prompt-Oberfläche gelten, oder strukturierte Einträge:
agentPromptGuidance: [ "Globaler Befehlshinweis.", { text: "Dies nur im OpenClaw-Hauptprompt anzeigen.", surfaces: ["openclaw_main"] },];Strukturierte surfaces können openclaw_main, codex_app_server,
cli_backend, acp_backend oder subagent enthalten. pi_main bleibt ein veralteter Alias
für openclaw_main. Lassen Sie surfaces für bewusst oberflächenübergreifende Anweisungen weg. Übergeben
Sie kein leeres surfaces-Array; es wird abgelehnt, damit ein versehentlicher Verlust des Geltungsbereichs
nicht zu globalem Prompt-Text führt.
Native Entwickleranweisungen für den Codex-App-Server sind strenger als bei anderen Prompt-
Oberflächen: Nur Anweisungen, die ausdrücklich auf codex_app_server begrenzt sind, werden in
diese Lane mit höherer Priorität übernommen. Veraltete Zeichenkettenanweisungen und unstrukturierte
strukturierte Anweisungen bleiben aus Kompatibilitätsgründen für Nicht-Codex-Prompt-Oberflächen verfügbar.
Node-Host-Befehle werden auf dem verbundenen Node-Host ausgeführt, nicht innerhalb des Gateway-
Prozesses. Wenn agentTool vorhanden ist, veröffentlicht die Node nach einer
erfolgreichen Gateway-Verbindung einen Deskriptor; das Gateway stellt ihn Agent-Ausführungen nur bereit, solange diese
Node verbunden ist und nur, wenn command des Deskriptors zur
genehmigten Befehlsoberfläche der Node gehört. Setzen Sie agentTool.defaultPlatforms, um einen
ungefährlichen Befehl in die standardmäßige Node-Befehls-Zulassungsliste aufzunehmen; andernfalls ist
ein explizites gateway.nodes.commands.allow oder eine Node-Aufrufrichtlinie erforderlich. agentTool.name
muss Provider-sicher sein: mit einem Buchstaben beginnen, ausschließlich Buchstaben, Ziffern,
Unterstriche oder Bindestriche verwenden und höchstens 64 Zeichen lang sein. MCP-gestützte Node-Tools
können agentTool.mcp-Metadaten setzen, damit Katalog- und Tool-Suchoberflächen
die Identität des entfernten MCP-Servers/Tools anzeigen können; die Ausführung erfolgt jedoch weiterhin über den
angekündigten Node-Befehl.
Infrastruktur
| Methode | Was sie registriert |
|---|---|
api.registerHook(events, handler, opts?) |
Ereignis-Hook |
api.registerHttpRoute(params) |
Gateway-HTTP-Endpunkt |
api.registerGatewayMethod(name, handler) |
Gateway-RPC-Methode |
api.registerGatewayDiscoveryService(service) |
Ankündigungsdienst für die lokale Gateway-Erkennung |
api.registerCli(registrar, opts?) |
CLI-Unterbefehl |
api.registerNodeCliFeature(registrar, opts?) |
CLI für Node-Funktionen unter openclaw nodes |
api.registerService(service) |
Hintergrunddienst |
api.registerInteractiveHandler(registration) |
Interaktiver Handler |
api.registerAgentToolResultMiddleware(...) |
Laufzeit-Middleware für Tool-Ergebnisse |
api.registerMemoryPromptSupplement(builder) |
Additiver Prompt-Abschnitt im Umfeld des Speichers |
api.registerMemoryPromptPreparation(prepare) |
Asynchrone Vorbereitung eines Prompt-Abschnitts im Umfeld des Speichers |
api.registerMemoryCorpusSupplement(adapter) |
Additiver Korpus zum Durchsuchen/Lesen des Speichers |
api.registerHostedMediaResolver(resolver) |
Resolver für browserartige URLs gehosteter Medien |
api.registerMcpServerConnectionResolver(...) |
MCP-Transport pro Anfragendem (url/headers) für einen statischen Servernamen |
api.registerTextTransforms(transforms) |
Plugin-eigene Kompatibilitätsumschreibungen für Prompt-/Nachrichtentext |
api.registerConfigMigration(migrate) |
Leichtgewichtige Konfigurationsmigration vor dem Laden der Plugin-Laufzeit |
api.registerMigrationProvider(provider) |
Importeur für openclaw migrate |
api.registerAutoEnableProbe(probe) |
Konfigurationsprüfung, die dieses Plugin automatisch aktivieren kann |
api.registerReload(registration) |
Richtlinie für Neustart/Hot-Reload/Keine Aktion anhand von Konfigurationspräfixen |
api.registerNodeHostCommand(command) |
Befehls-Handler, der gekoppelten Nodes bereitgestellt wird |
api.registerNodeInvokePolicy(policy) |
Zulassungslisten-/Genehmigungsrichtlinie für von Nodes aufgerufene Befehle |
api.registerSecurityAuditCollector(collector) |
Befundsammler für openclaw security audit |
Webhook-Arbeit nach der Bestätigung
Webhook-Routen, die eine Anfrage bestätigen, bevor die Verarbeitung abgeschlossen ist, müssen diese abgekoppelte Arbeit auf einen eigenen nachverfolgten Zulassungsstamm verlagern:
void runDetachedWebhookWork(() => processWebhookEvent(event)).catch((error) => { runtime.error?.(`Webhook-Versand fehlgeschlagen: ${String(error)}`);});Rufen Sie runDetachedWebhookWork(...) synchron auf, solange die HTTP-Anfrage noch
zugelassen ist. Der Helper reserviert sofort einen unabhängigen Stamm und startet dann den
Callback im nächsten Microtask, sodass der Anfrage-Handler zuerst seine
Bestätigung schreiben kann. Das zurückgegebene Promise übernimmt das Callback-Ergebnis; die Aufrufenden
sind weiterhin für die Behandlung von Ablehnungen verantwortlich. Dadurch wird Arbeit in der Warteschlange nach der Bestätigung angenommen, und
Entleerungsvorgänge bei Neustart oder Suspendierung warten auf sie. Handler, die vor der Rückgabe die gesamte Verarbeitung
abwarten, benötigen diesen Helper nicht.
Auf Anfragende begrenzte MCP-Verbindungen
Halten Sie die MCP-Server-Identität (Name, Tool-Filter) in mcp.servers, im Manifestfeld mcpServers
eines nativen Plugins oder in einem Bundle-Manifest statisch. Optional können Sie einen Verbindungs-Resolver registrieren, damit jeder vertrauenswürdige
Nachrichtenabsender einen eigenen Transport erhält:
api.registerMcpServerConnectionResolver({ serverName: "user-email", resolve: async (ctx) => { // ctx.requesterSenderId wird vom Host als vertrauenswürdig eingestuft; erfinden Sie hier niemals eine Absenderidentität. const token = await lookupUserToken(ctx.requesterSenderId); if (!token) { return null; // diesen Server für die aktuelle Ausführung weglassen } return { url: "https://mcp.example.com/email", headers: { Authorization: `Bearer ${token}` }, }; },});Vertragshinweise:
- Der Resolver-Kontext enthält ausschließlich eine vertrauenswürdige Host-Identität (
requesterSenderId, optionalagentAccountId/messageChannel). Zukünftige vertrauenswürdige Felder (zum Beispiel Cron-/Subagent-Benutzerkontext) können additiv hinzugefügt werden. - Ein Plugin besitzt genau einen Servernamen: Ein doppeltes
registerMcpServerConnectionResolverfür denselbenserverNamevon einem anderen Plugin wird mit einer Fehlerdiagnose abgelehnt (die erste Registrierung gewinnt), sodass der Verbindungseigentümer niemals von der Ladereihenfolge der Plugins abhängt. - Tool-Namen werden aus der vollständigen Menge deklarierter Server abgeleitet, sodass eine teilweise Auflösung sichere Servernamen niemals zwischen Anfragenden oder Durchläufen verändert. Der Core überprüft nicht, ob unterschiedliche Endpunkte für Anfragende identische Tool-Schemas bereitstellen; ein Resolver muss jeden Anfragenden auf denselben logischen Dienst verweisen, andernfalls unterscheiden sich Tool-Schemas (und die Stabilität des Prompt-Caches) je nach Anfragendem.
- Ausführungen ohne vertrauenswürdiges
requesterSenderId(Cron, Subagent, Heartbeat, öffentliches Gateway) materialisieren niemals auf Anfragende begrenzte Server. Es gibt keine gemeinsam genutzte Fallback-Verbindung. resolveist auf 10 Sekunden pro Server begrenzt; bei einer Zeitüberschreitung oder Ausnahme wird dieser Server für die Ausführung weggelassen, ohne dass statisches MCP fehlschlägt.- Aufgelöste Verbindungen werden höchstens alle 5 Minuten pro Anfragendem erneut validiert:
Bei einer Rotation wird der Transport mit neuen Anmeldedaten neu aufgebaut, und ein
null-Ergebnis widerruft ihn (die zwischengespeicherte Laufzeit wird selbst mitten in einer Sitzung freigegeben). Widerrufene oder rotierte Anmeldedaten können daher bis zu 5 Minuten lang weiterverwendet werden. - Aufgelöste
headerswerden niemals protokolliert oder persistiert; der Core hält nur einen flüchtigen, im Arbeitsspeicher abgelegten schlüsselbasierten Digest (prozesslokales HMAC) vor, um die Rotation von Anmeldedaten zu erkennen, und registriert aufgelöste Anmeldedatenwerte aus Headern/URLs in der Schwärzungsregistrierung für Protokollierung und Debug-Erfassung. - Auf Anfragende begrenzte Server erzeugen keine MCP-App-Ansichten: Eine Ansicht überdauert die durch den Anfragenden authentifizierte Ausführung, und die Begrenzung der Gateway-Ansicht besitzt keine Identität des Anfragenden, daher bleiben App-Vorschauen für diese Server standardmäßig geschlossen. Tool-Ergebnisse sind davon nicht betroffen.
- Statische Server ohne Resolver behalten den bestehenden sitzungsbezogenen Lebenszyklus bei.
- Bereitstellungsregel für Harnesses: Auf Anfragende begrenzte Server gelangen niemals in die Harness-native
MCP-Client-Konfiguration (Codex-Thread
mcp_servers, CLI-c mcp_servers=…oder eine andere sitzungsübergreifend gemeinsam genutzte MCP-Projektion). Harnesses stellen sie stattdessen als ausführungsbezogene Tools bereit:- Eingebetteter Runner: Sitzungs-MCP-Laufzeit + Bundle-Tools (statisch + begrenzt).
- Codex-App-Server: dynamische Tools über
materializeRequesterScopedMcpToolsForHarnessRun(nur begrenzte Tools; statische Server verbleiben im nativen MCP-Client von Codex).
- Begrenzte Tool-Spezifikationen sind nach der ersten erfolgreichen Auflösung in dieser Sitzung sitzungsstabil, sodass Harnesses mit gemeinsam genutzten Threads (Codex) bei einem Wechsel der Absender keine Threads rotieren. Bevor ein Anfragender erfolgreich aufgelöst wurde, werden keine begrenzten Spezifikationen angekündigt.
- Nicht authentifizierte Anfragende in einem Harness mit gemeinsam genutzten Threads sehen weiterhin die angekündigten begrenzten Tools; der Aufruf eines solchen Tools gibt für diesen Anfragenden einen eindeutigen Tool-Fehler wegen fehlender Verbindung zurück. OpenClaw greift niemals auf die Anmeldedaten eines anderen Anfragenden zurück.
Builder für Speicher-Prompt-Ergänzungen erhalten optional den Kontext agentId,
agentSessionKey und sandboxed. Aufrufe von search und get für Ergänzungen des Speicherkorpus
erhalten optional den Kontext agentId und sandboxed. Plugins mit
Agent-eigenem Speicher sollten diesen Speicher bei jedem Aufruf auflösen, statt
bei der Registrierung einen einzelnen globalen Pfad zu erfassen. Wenn eine Agent-ID erforderlich ist, aber
bei einer Multi-Agent-Operation fehlt, muss der Vorgang standardmäßig geschlossen fehlschlagen, statt einen
beliebigen Agent auszuwählen.
Verwenden Sie registerMemoryPromptPreparation(...), wenn Prompt-Text vom asynchronen
Plugin-Zustand abhängt. Der Callback wird einmal vor jedem vollständigen Agent-Prompt ausgeführt und erhält
denselben Tool-, Agent-, Sitzungs- und Sandbox-Kontext wie synchrone Builder für Speicher-Prompts.
Validieren Sie die aktuelle Speicherinhaber-Instanz, bevor Sie persistierten
Zustand laden, und geben Sie dann nur Zeilen für diese Ausführung zurück. OpenClaw friert diese Zeilen ein und
übergibt das unveränderliche Ergebnis an die synchrone Prompt-Zusammenstellung. Persistenz,
atomarer Austausch und Löschung bei Entfernung des Inhabers müssen innerhalb des zuständigen Plugins verbleiben; führen Sie in einem Prompt-Builder keine
Abfragen oder Dateilesevorgänge durch.
Interaktive Telegram-Handler können { submitText } zurückgeben, um Text nach
erfolgreichem Abschluss des Handlers durch den normalen eingehenden Agent-Pfad von Telegram zu leiten. OpenClaw behält
die Callback-Schaltfläche bei, wenn die Richtlinie für eingehende Nachrichten den Text überspringt oder die Verarbeitung fehlschlägt, sodass
die Person den Vorgang wiederholen kann, nachdem sich die blockierende Bedingung geändert hat. Dieses Ergebnisfeld ist
Telegram-spezifisch; andere Kanäle behalten ihre eigenen Verträge für interaktive Ergebnisse bei.
Host-Hooks für Workflow-Plugins
Host-Hooks sind die SDK-Schnittstellen für Plugins, die am Host- Lebenszyklus teilnehmen müssen, statt nur einen Provider, Kanal oder ein Tool hinzuzufügen. Es handelt sich um generische Verträge; der Planungsmodus kann sie verwenden, ebenso aber Genehmigungs-Workflows, Arbeitsbereichs-Richtlinienprüfungen, Hintergrundüberwachungen, Einrichtungsassistenten und UI-Begleit- Plugins.
| Methode | Zuständiger Vertrag |
|---|---|
api.session.state.registerSessionExtension(...) |
Plugin-eigener, JSON-kompatibler Sitzungsstatus, der über Gateway-Sitzungen projiziert wird |
api.session.workflow.enqueueNextTurnInjection(...) |
Dauerhafter Exactly-once-Kontext, der für eine Sitzung in den nächsten Agent-Durchlauf injiziert wird |
api.registerTrustedToolPolicy(...) |
Durch das Manifest kontrollierte, vertrauenswürdige Prä-Plugin-Tool-Richtlinie, die Tool-Parameter blockieren oder umschreiben kann |
api.registerToolMetadata(...) |
Anzeigemetadaten des Tool-Katalogs, ohne die Tool-Implementierung zu ändern |
api.registerCommand(...) |
Bereichsgebundene Plugin-Befehle; Befehlsergebnisse können continueAgent: true oder suppressReply: true setzen; native Discord-Befehle unterstützen descriptionLocalizations |
api.session.controls.registerControlUiDescriptor(...) |
Beitragsdeskriptoren für die Control UI für Sitzungs-, Tool-, Ausführungs-, Einstellungs- oder Registerkartenoberflächen |
api.lifecycle.registerRuntimeLifecycle(...) |
Bereinigungs-Callbacks für Plugin-eigene Laufzeitressourcen auf Pfaden zum Zurücksetzen, Löschen oder Neuladen |
api.agent.events.registerAgentEventSubscription(...) |
Bereinigte Ereignisabonnements für Workflow-Status und Überwachungen |
api.runContext.setRunContext(...) / getRunContext(...) / clearRunContext(...) |
Plugin-Arbeitsstatus pro Ausführung, der am Ende des Ausführungslebenszyklus gelöscht wird |
api.session.workflow.registerSessionSchedulerJob(...) |
Bereinigungsmetadaten für Plugin-eigene Scheduler-Aufträge; plant keine Arbeit und erstellt keine Aufgabeneinträge |
api.session.workflow.sendSessionAttachment(...) |
Nur für gebündelte Plugins verfügbare, vom Host vermittelte Zustellung von Dateianhängen an die aktive Route der direkt ausgehenden Sitzung |
api.session.workflow.scheduleSessionTurn(...) / unscheduleSessionTurnsByTag(...) |
Nur für gebündelte Plugins verfügbare, Cron-gestützte geplante Sitzungsdurchläufe sowie Tag-basierte Bereinigung |
api.session.controls.registerSessionAction(...) |
Typisierte Sitzungsaktionen, die Clients über den Gateway auslösen können |
Ein surface: "tab"-Deskriptor fügt der Control UI eine Registerkarte in der Seitenleiste hinzu. Die Registerkartendeskriptoren aktiver
Plugins werden Dashboard-Clients in der Gateway-Begrüßung
(controlUiTabs) bekannt gegeben, sodass die Registerkarte nur angezeigt wird, solange das Plugin aktiviert ist.
Gebündelte Plugins können eine vollwertige Dashboard-Ansicht für ihre Registerkarte bereitstellen; andere
Plugins können path auf eine Plugin-HTTP-Route setzen (siehe
api.registerHttpRoute(...)), die das Dashboard in einem Sandbox-Frame darstellt.
icon ist ein Hinweis auf den Namen eines Dashboard-Symbols, group wählt den Seitenleistenabschnitt
(control oder agent), order bestimmt die Reihenfolge unter den Plugin-Registerkarten und requiredScopes
blendet die Registerkarte für Verbindungen aus, denen diese Operator-Berechtigungsbereiche fehlen:
Registrieren Sie für eine durch den Gateway geschützte externe Registerkarte den Deskriptor path unter einer
HTTP-Route auth: "gateway" desselben Plugins. Nach dem authentifizierten Bootstrap erhält der Browser eine
kurzlebige, auf dieses Plugin und den Routenstamm beschränkte HttpOnly-Berechtigung, damit der
Sandbox-Frame geladen werden kann, ohne das Gateway-Bearer-Token in seine URL
oder sein JavaScript zu kopieren. Das authentifizierte übergeordnete Element erneuert die Berechtigung, solange die externe Registerkarte
aktiv ist, sowie vor ihrem Einhängen nach einer Navigation oder der Wiederaufnahme des Browsers. Es
prüft die Berechtigung außerdem aus derselben undurchsichtigen Sandbox, bevor es den Frame einhängt, sodass Browser-
Datenschutzmodi, die das Cookie blockieren, sicher geschlossen mit einem nicht verfügbaren Panel fehlschlagen.
Die Frame-Berechtigung akzeptiert nur GET und HEAD und enthält immer
operator.read; requiredScopes steuert die Sichtbarkeit der Registerkarte, erweitert jedoch niemals die
Cookie-Berechtigung. Änderungen verbleiben auf explizit durch den Gateway authentifizierten übergeordneten Oberflächen oder
Bearer-Oberflächen. Externe Registerkarten erfordern HTTPS/Tailscale Serve oder einen
vom Browser als vertrauenswürdig eingestuften Loopback-Ursprung; einfaches HTTP auf einem LAN-Host zeigt den
Fehler für einen unsicheren Kontext an, statt ein Panel einzuhängen, das sich nicht authentifizieren kann.
Eine vollständige Blockierung von Drittanbieter-Cookies macht durch den Gateway geschützte Registerkarten ebenfalls nicht verfügbar.
Wie bei allen nativen Plugin-Oberflächen verbleibt der Frame innerhalb der Vertrauensgrenze des installierten
Plugins; OpenClaw behandelt installierte Plugins nicht als gegenseitig
isolierte Browser-Sicherheitsprinzipale.
Cookie-Berechtigungen verwenden die Hostnamengrenze des Browsers, nicht dessen Portgrenze. Betreiben Sie
keine gegenseitig nicht vertrauenswürdigen Dienste gemeinsam unter dem Gateway-Hostnamen, auch nicht an anderen
Ports.
Registerkarten mit Plugin-verwalteter Authentifizierung behalten ihr direktes iframe-Verhalten bei und fordern oder
benötigen diese Gateway-Berechtigung nicht.
api.session.controls.registerControlUiDescriptor({ surface: "tab", id: "logbook", label: "Logbuch", description: "Ihr Tag als Zeitleiste, erstellt aus Bildschirmaufnahmen.", icon: "sun", group: "control", requiredScopes: ["operator.write"],});Verwenden Sie für neuen Plugin-Code die gruppierten Namensräume:
api.session.state.registerSessionExtension(...)api.session.workflow.enqueueNextTurnInjection(...)api.session.workflow.registerSessionSchedulerJob(...)api.session.workflow.sendSessionAttachment(...)api.session.workflow.scheduleSessionTurn(...)api.session.workflow.unscheduleSessionTurnsByTag(...)api.session.controls.registerSessionAction(...)api.session.controls.registerControlUiDescriptor(...)api.agent.events.registerAgentEventSubscription(...)api.agent.events.emitAgentEvent(...)api.runContext.setRunContext(...)/getRunContext(...)/clearRunContext(...)api.lifecycle.registerRuntimeLifecycle(...)
Die entsprechenden flachen Methoden bleiben als veraltete Kompatibilitäts-
Aliasse für vorhandene Plugins verfügbar. Fügen Sie keinen neuen Plugin-Code hinzu, der
api.registerSessionExtension, api.enqueueNextTurnInjection,
api.registerControlUiDescriptor, api.registerRuntimeLifecycle,
api.registerAgentEventSubscription, api.emitAgentEvent,
api.setRunContext, api.getRunContext, api.clearRunContext,
api.registerSessionSchedulerJob, api.registerSessionAction,
api.sendSessionAttachment, api.scheduleSessionTurn oder
api.unscheduleSessionTurnsByTag direkt aufruft.
scheduleSessionTurn(...) ist eine sitzungsgebundene Komfortfunktion über dem Gateway-
Cron-Scheduler. Cron ist für die Zeitplanung zuständig und erstellt den Hintergrund-Aufgabeneintrag, wenn der
Durchlauf ausgeführt wird; das Plugin SDK beschränkt lediglich die Zielsitzung, die Plugin-eigene
Benennung und die Bereinigung. Verwenden Sie api.runtime.tasks.managedFlows innerhalb des geplanten
Durchlaufs, wenn die Arbeit selbst dauerhaften mehrstufigen Task-Flow-Status benötigt.
Die Verträge trennen die Zuständigkeiten bewusst:
- Externe Plugins können Sitzungserweiterungen, UI-Deskriptoren, Befehle, Tool- Metadaten, Injektionen für den nächsten Durchlauf und normale Hooks verwalten.
- Vertrauenswürdige Tool-Richtlinien werden vor gewöhnlichen
before_tool_call-Hooks ausgeführt und sind vom Host als vertrauenswürdig eingestuft. Gebündelte Richtlinien werden zuerst ausgeführt; Richtlinien installierter Plugins erfordern eine explizite Aktivierung sowie ihre lokalen IDs incontracts.trustedToolPoliciesund werden anschließend in der Ladereihenfolge der Plugins ausgeführt. Richtlinien-IDs sind auf das registrierende Plugin beschränkt. - Die Eigentümerschaft reservierter Befehle ist ausschließlich gebündelten Plugins vorbehalten. Externe Plugins sollten ihre eigenen Befehlsnamen oder Aliasse verwenden.
allowPromptInjection=falsedeaktiviert Prompt-verändernde Hooks einschließlichagent_turn_prepare,before_prompt_build,heartbeat_prompt_contributionundenqueueNextTurnInjection.
Beispiele für Nicht-Plan-Nutzer:
| Plugin-Archetyp | Verwendete Hooks |
|---|---|
| Genehmigungsworkflow | Sitzungserweiterung, Befehlsfortsetzung, Injektion für den nächsten Durchlauf, UI-Deskriptor |
| Richtlinien-Gate für Budget/Arbeitsbereich | Vertrauenswürdige Tool-Richtlinie, Tool-Metadaten, Sitzungsprojektion |
| Hintergrund-Lebenszyklusüberwachung | Bereinigung des Laufzeitlebenszyklus, Abonnement von Agent-Ereignissen, Eigentümerschaft/Bereinigung des Sitzungsschedulers, Heartbeat-Prompt-Beitrag, UI-Deskriptor |
| Einrichtungs- oder Onboarding-Assistent | Sitzungserweiterung, bereichsgebundene Befehle, Control-UI-Deskriptor |
Wann Tool-Ergebnis-Middleware verwendet werden sollte
Gebündelte Plugins und explizit aktivierte installierte Plugins mit passenden
Manifestverträgen können api.registerAgentToolResultMiddleware(...) verwenden, wenn
sie ein Tool-Ergebnis nach der Ausführung und bevor die Laufzeit
dieses Ergebnis an das Modell zurückgibt, umschreiben müssen. Dies ist die vertrauenswürdige, laufzeitneutrale
Schnittstelle für asynchrone Ausgabereduzierer wie tokenjuice.
Plugins müssen contracts.agentToolResultMiddleware für jede vorgesehene
Laufzeit deklarieren, beispielsweise ["openclaw", "codex"]. Installierte Plugins ohne diesen
Vertrag oder ohne explizite Aktivierung können diese Middleware nicht registrieren; verwenden Sie
normale OpenClaw-Plugin-Hooks für Arbeit, die kein Tool-Ergebnis-Timing vor dem Modell
benötigt. Der alte
Registrierungspfad für Erweiterungsfabriken, der ausschließlich für eingebettete Runner vorgesehen war, wurde entfernt.
Registrierung der Gateway-Erkennung
api.registerGatewayDiscoveryService(...) ermöglicht einem Plugin, den aktiven
Gateway über einen lokalen Erkennungstransport wie mDNS/Bonjour bekannt zu geben. OpenClaw ruft den
Dienst während des Gateway-Starts auf, wenn die lokale Erkennung aktiviert ist, übergibt die
aktuellen Gateway-Ports und nicht geheimen TXT-Hinweisdaten und ruft den zurückgegebenen
stop-Handler während des Herunterfahrens des Gateways 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 bekannt gegebene TXT-Werte nicht als Geheimnisse oder Authentifizierung behandeln. Die Erkennung ist ein Routing-Hinweis; die Gateway-Authentifizierung und TLS-Pinning bleiben für das Vertrauen zuständig.
CLI-Registrierungsmetadaten
api.registerCli(registrar, opts?) akzeptiert zwei Arten von Befehlsmetadaten:
commands: explizite Befehlsnamen im Besitz des Registrierendendescriptors: Befehlsdeskriptoren für die Analysephase, die für CLI-Hilfe, Routing und verzögerte Plugin-CLI-Registrierung verwendet werdenparentPath: optionaler Pfad des übergeordneten Befehls für verschachtelte Befehlsgruppen, beispielsweise["nodes"]
Verwenden Sie für Funktionen gekoppelter Nodes vorzugsweise
api.registerNodeCliFeature(registrar, opts?). Es ist ein kleiner Wrapper um
api.registerCli(..., { parentPath: ["nodes"] }) und weist Befehle wie
openclaw nodes canvas explizit als Plugin-eigene Node-Funktionen aus.
Wenn ein Plugin-Befehl im normalen Stamm-CLI-Pfad verzögert geladen bleiben soll,
geben Sie descriptors an, die jeden von diesem
Registrierenden bereitgestellten Befehlsstamm der obersten Ebene abdecken.
api.registerCli( async ({ program }) => { const { registerMatrixCli } = await import("./src/cli.js"); registerMatrixCli({ program }); }, { descriptors: [ { name: "matrix", description: "Matrix-Konten, Verifizierung, Geräte und Profilstatus verwalten", hasSubcommands: true, }, ], },);Verschachtelte Befehle erhalten den aufgelösten übergeordneten Befehl als program:
api.registerCli( async ({ program }) => { const { registerNodesCanvasCommands } = await import("./src/cli.js"); registerNodesCanvasCommands(program); }, { parentPath: ["nodes"], descriptors: [ { name: "canvas", description: "Canvas-Inhalte von einem gekoppelten Node erfassen oder rendern", hasSubcommands: true, }, ], },);Verwenden Sie commands nur dann allein, wenn Sie keine verzögerte Registrierung der Root-CLI benötigen.
Dieser sofortige Kompatibilitätspfad wird weiterhin unterstützt, installiert jedoch keine
deskriptorbasierten Platzhalter für verzögertes Laden zur Parse-Zeit.
Registrierung von CLI-Backends
Mit api.registerCliBackend(...) kann ein Plugin die Standardkonfiguration für ein lokales
KI-CLI-Backend wie claude-cli oder my-cli bereitstellen.
- Die Backend-
idwird zum Provider-Präfix in Modellreferenzen wiemy-cli/gpt-5. - Die Backend-
configist der maßgebliche Befehlsadapter: argv, Umgebung, Parser-, Sitzungs-, Bild- und Zuverlässigkeitsverhalten befinden sich im Plugin-Code. - Benutzer wählen das Backend über Modellreferenzen oder modellbezogene
agentRuntime.idaus;openclaw.jsonschreibt den Adapter nicht um. - Verwenden Sie
normalizeConfig, wenn registrierte statische Felder einen laufzeitabhängigen Normalisierungsdurchlauf benötigen. - Verwenden Sie
resolveExecutionArgsfür anfragebezogene argv-Umschreibungen, die zum CLI-Dialekt gehören, etwa um OpenClaw-Denkstufen einem nativen Aufwands-Flag zuzuordnen. Der Hook erhältctx.executionMode; verwenden Sie"side-question", um Backend-native Isolations-Flags für kurzlebige/btw-Aufrufe hinzuzufügen. Wenn diese Flags native Tools für eine ansonsten stets aktive CLI zuverlässig deaktivieren, deklarieren Sie außerdemsideQuestionToolMode: "disabled". - Verwenden Sie
prepareExecutionfür Backend-eigene Startumgebungen oder temporäre Authentifizierungs-/Konfigurationsbrücken. Das zugehörigectx.contextTokenBudgetist das effektive Token-Limit, das für den Lauf ausgewählt wurde, sodass Backends mit nativer Compaction ihren eigenen Schwellenwert ohne providerspezifische Core-Verzweigungen abstimmen können. Es erhält außerdem die vom Core vorbereitetectx.env, wenn das Backend-Staging gebündelte MCP-Einstellungen erweitern muss. - Backends, die alle nativen Tools für einen bestimmten Lauf deaktivieren können, dürfen
nativeToolMode: "selectable"deklarieren. Eingeschränkte Aufrufe übergeben eine exaktectx.toolAvailability.native-Liste sowie kanonischectx.toolAvailability.openClaw-Namen. Deklarieren SietoolAvailabilityEnforcement: "execution-args"und setzen Sie den Vertrag in den endgültigen argv für neue oder fortgesetzte Sitzungen durch, oder deklarieren Sie"prepare-execution", setzen Sie ihn in der bereitgestellten Richtlinie durch und geben SietoolAvailabilityEnforced: truezurück. OpenClaw deaktiviert native Tools für Laufzeitbeschränkungen wie Cron-toolsAllowund schlägt geschlossen fehl, wenn der deklarierte Durchsetzungspfad unvollständig ist.
Eine vollständige Anleitung zur Erstellung finden Sie unter CLI-Backend-Plugins.
Exklusive Slots
| Methode | Registrierter Inhalt |
|---|---|
api.registerContextEngine(id, factory) |
Kontext-Engine (jeweils eine aktiv). Lebenszyklus-Callbacks erhalten runtimeSettings, wenn der Host Modell-/Provider-/Modusdiagnosen bereitstellen kann; ältere strikte Engines werden ohne diesen Schlüssel erneut aufgerufen. |
api.registerMemoryCapability(capability) |
Einheitliche Speicherfunktion |
Veraltete Adapter für Speicher-Embeddings
| Methode | Registrierter Inhalt |
|---|---|
api.registerMemoryEmbeddingProvider(adapter) |
Speicher-Embedding-Adapter für das aktive Plugin |
registerMemoryCapabilityist die exklusive Speicher-Plugin-API.registerMemoryCapabilitykann außerdempublicArtifacts.listArtifacts(...)für vom Host verwaltete Exporte bereitstellen. Begleit-Plugins, die diese deklarierten Artefakte auflisten, verwenden weiterhinlistActiveMemoryPublicArtifacts(...)aus der beibehaltenenopenclaw/plugin-sdk/memory-host-core-Fassade, bis eine gezielte öffentliche Verbraucher-API verfügbar ist; sie dürfen nicht auf die private Struktur eines anderen Plugins zugreifen.MemoryFlushPlan.modelkann den Flush-Durchlauf an eine exakteprovider/model- Referenz wieollama/qwen3:8bbinden, ohne die aktive Fallback-Kette zu übernehmen.registerMemoryEmbeddingProviderist veraltet. Neue Embedding-Provider solltenapi.registerEmbeddingProvider(...)undcontracts.embeddingProvidersverwenden.- Bestehende speicherspezifische Provider funktionieren während des Migrationszeitraums weiterhin, bei der Plugin-Inspektion wird dies für nicht gebündelte Plugins jedoch als Kompatibilitätsschuld ausgewiesen.
Ereignisse und Lebenszyklus
| Methode | Funktion |
|---|---|
api.on(hookName, handler, opts?) |
Typisierter Lebenszyklus-Hook |
api.onConversationBindingResolved(handler) |
Callback für Gesprächszuordnungen |
Beispiele, gängige Hook-Namen und Schutzsemantik finden Sie unter Plugin-Hooks.
Entscheidungssemantik von Hooks
before_install ist ein Lebenszyklus-Hook der Plugin-Laufzeit und nicht die
Installationsrichtlinienoberfläche für Betreiber. Verwenden Sie security.installPolicy, wenn eine Zulassen-/Blockieren-Entscheidung
CLI- und Gateway-gestützte Installations- oder Aktualisierungspfade abdecken muss.
before_tool_call: Die Rückgabe von{ block: true }ist endgültig. Sobald ein Handler diesen Wert setzt, werden Handler mit niedrigerer Priorität übersprungen.before_tool_call: Die Rückgabe von{ block: false }gilt als keine Entscheidung (wie das Auslassen vonblock), nicht als Überschreibung.before_install: Die Rückgabe von{ block: true }ist endgültig. Sobald ein Handler diesen Wert setzt, werden Handler mit niedrigerer Priorität übersprungen.before_install: Die Rückgabe von{ block: false }gilt als keine Entscheidung (wie das Auslassen vonblock), nicht als Überschreibung.reply_dispatch: Die Rückgabe von{ handled: true, ... }ist endgültig. Sobald ein Handler den Dispatch beansprucht, werden Handler mit niedrigerer Priorität und der standardmäßige Modell-Dispatch-Pfad übersprungen.message_sending: Die Rückgabe von{ cancel: true }ist endgültig. Sobald ein Handler diesen Wert setzt, werden Handler mit niedrigerer Priorität übersprungen.message_sending: Die Rückgabe von{ cancel: false }gilt als keine Entscheidung (wie das Auslassen voncancel), nicht als Überschreibung.message_received: Verwenden Sie das typisierte FeldthreadId, wenn Sie eingehendes Thread-/Themen-Routing benötigen. Behalten Siemetadatafür kanalspezifische Zusatzangaben bei.message_sending: Verwenden Sie die typisierten Routing-FelderreplyToId/threadId, bevor Sie auf das kanalspezifischemetadatazurückgreifen.gateway_start: Verwenden Siectx.config,ctx.workspaceDirundctx.getCron?.()für den Gateway-eigenen Startstatus, anstatt sich auf internegateway:startup-Hooks zu verlassen. Cron wird zu diesem Zeitpunkt möglicherweise noch geladen.cron_reconciled: Erstellen Sie nach dem Start oder dem erneuten Laden des Schedulers eine vollständige externe Cron-Projektion neu. Sie umfasstreasonund den effektivenenabled-Status einschließlichenabled: false, währendctx.getCron?.()den exakt abgeglichenen Scheduler zurückgibt. Übergeben Siectx.abortSignalan dauerhafte Projektionsarbeiten; der Vorgang wird abgebrochen, wenn dieser Scheduler-Snapshot ersetzt oder das Gateway geschlossen wird.cron_changed: Beobachten Sie Änderungen am Gateway-eigenen Cron-Lebenszyklus.scheduled- undremoved-Ereignisse sind Abgleichhinweise nach dem Commit und kein geordnetes Delta-Protokoll. Dasevent.nextRunAtMseines geplanten Ereignisses fehlt, wenn der Auftrag keinen nächsten Aktivierungszeitpunkt hat; ein Entfernungsereignis enthält weiterhin den Snapshot des gelöschten Auftrags.
Externe Aktivierungs-Scheduler sollten cron_changed-Ereignisse entprellen oder zusammenfassen
und anschließend die vollständige dauerhafte Ansicht aus dem zuletzt von
cron_reconciled erfassten Scheduler erneut lesen. Übernehmen Sie den Scheduler nicht aus einem cron_changed-Kontext:
Ein losgelöster Hinweis eines älteren Schedulers kann sich mit einem späteren Neuladen überschneiden.
Verwenden Sie cron_reconciled als Auslöser für vollständige Snapshots dauerhafter Zustände, die beim
Start des Gateways oder beim Ersetzen des Schedulers geladen werden. Bei einem reinen
Hot-Reload des Plugins wird er nicht erneut wiedergegeben. Beobachtungs-Handler werden parallel ausgeführt, und
Fire-and-forget-Dispatches können sich überschneiden, daher dürfen Verbraucher nicht von der Abschlussreihenfolge der Ereignisse abhängen.
Behalten Sie OpenClaw als maßgebliche Quelle für Fälligkeitsprüfungen und Ausführung bei.
Einen Single-Flight-Adapter mit dauerhafter Ersetzung, Wiederholungsversuchen/Backoff und sauberem Herunterfahren finden Sie unter Sichere externe Cron-Projektion.
Felder des API-Objekts
| 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-Laufzeit-Snapshot, sofern verfügbar) |
api.pluginConfig |
Record<string, unknown> |
Plugin-spezifische Konfiguration aus plugins.entries.<id>.config |
api.runtime |
PluginRuntime |
Laufzeit-Hilfsfunktionen |
api.logger |
PluginLogger |
Bereichsbezogener 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-Stammverzeichnis auflösen |
Konvention für interne Module
Verwenden Sie innerhalb Ihres Plugins lokale Barrel-Dateien für interne Importe:
my-plugin/ api.ts # Öffentliche Exporte für externe Verbraucher runtime-api.ts # Nur interne Laufzeitexporte index.ts # Plugin-Einstiegspunkt setup-entry.ts # Schlanker Einstieg nur für die Einrichtung (optional)Über Fassaden geladene öffentliche Schnittstellen gebündelter Plugins (api.ts, runtime-api.ts,
index.ts, setup-entry.ts und ähnliche öffentliche Einstiegspunktdateien) verwenden bevorzugt den
aktiven Snapshot der Laufzeitkonfiguration, wenn OpenClaw bereits ausgeführt wird. Wenn noch kein
Laufzeit-Snapshot vorhanden ist, greifen sie auf die aufgelöste Konfigurationsdatei auf dem Datenträger zurück.
Fassaden paketierter gebündelter Plugins sollten über die Plugin-Fassaden-Loader von OpenClaw
geladen werden; direkte Importe aus dist/extensions/... umgehen die Manifest-
und Laufzeit-Sidecar-Prüfungen, die paketierte Installationen für Plugin-eigenen Code verwenden.
Provider-Plugins können ein eng abgegrenztes, Plugin-lokales Vertrags-Barrel bereitstellen, wenn ein Hilfsprogramm bewusst Provider-spezifisch ist und noch nicht in einen generischen SDK- Unterpfad gehört. Gebündelte Beispiele:
- Anthropic: öffentliche
api.ts- /contract-api.ts-Schnittstelle für Claude- Beta-Header- undservice_tier-Stream-Hilfsprogramme. @openclaw/openai-provider:api.tsexportiert Provider-Builder, Hilfsprogramme für Standardmodelle und Echtzeit-Provider-Builder.@openclaw/openrouter-provider:api.tsexportiert den Provider-Builder sowie Hilfsprogramme für Onboarding und Konfiguration.
Verwandte Themen
Optionen für definePluginEntry und defineChannelPluginEntry.
Vollständige Referenz des api.runtime-Namensraums.
Paketierung, Manifeste und Konfigurationsschemas.
Testhilfsprogramme und Lint-Regeln.
Migration von veralteten Schnittstellen.
Detaillierte Architektur und Fähigkeitsmodell.