Lade-Pipeline
Beim Start macht OpenClaw ungefähr Folgendes:- Kandidaten für Plugin-Roots ermitteln
- native oder kompatible Bundle-Manifeste und Paketmetadaten lesen
- unsichere Kandidaten ablehnen
- Plugin-Konfiguration normalisieren (
plugins.enabled,allow,deny,entries,slots,load.paths) - Aktivierung für jeden Kandidaten entscheiden
- aktivierte native Module laden: gebaute gebündelte Module verwenden einen nativen Loader; lokaler TypeScript-Quellcode von Drittanbietern verwendet den Notfall-Fallback Jiti
- native
register(api)-Hooks aufrufen und Registrierungen in der Plugin-Registry sammeln - die Registry für Befehle/Runtime-Oberflächen bereitstellen
activate ist ein Legacy-Alias für register — der Loader löst auf, was vorhanden ist (def.register ?? def.activate), und ruft es an derselben Stelle auf. Alle gebündelten Plugins verwenden register; bevorzugen Sie register für neue Plugins.Manifest-zuerst-Verhalten
Das Manifest ist die maßgebliche Control-Plane-Quelle. OpenClaw verwendet es, um:- das Plugin zu identifizieren
- deklarierte Channels/Skills/Konfigurationsschemas oder Bundle-Capabilities zu ermitteln
plugins.entries.<id>.configzu validieren- Control-UI-Labels/Platzhalter zu ergänzen
- Installations-/Katalogmetadaten anzuzeigen
- günstige Aktivierungs- und Einrichtungsdeskriptoren zu erhalten, ohne die Plugin-Runtime zu laden
activation und setup bleiben auf der Control Plane.
Sie sind reine Metadaten-Deskriptoren für Aktivierungsplanung und Einrichtungserkennung;
sie ersetzen keine Runtime-Registrierung, register(...) oder setupEntry.
Die ersten Live-Aktivierungsnutzer verwenden jetzt Manifest-Hinweise zu Befehlen, Channels und Providern,
um das Laden von Plugins vor einer breiteren Registry-Materialisierung einzugrenzen:
- CLI-Laden wird auf Plugins eingegrenzt, denen der angeforderte primäre Befehl gehört
- Channel-Einrichtung/Plugin-Auflösung wird auf Plugins eingegrenzt, denen die angeforderte Channel-ID gehört
- explizite Provider-Einrichtung/Runtime-Auflösung wird auf Plugins eingegrenzt, denen die angeforderte Provider-ID gehört
- Gateway-Startplanung verwendet
activation.onStartupfür explizite Startimporte und Start-Opt-outs; Plugins ohne Startmetadaten laden nur über engere Aktivierungsauslöser
all anfordern, leiten weiterhin eine
explizite effektive Plugin-ID-Menge aus Konfiguration, Startplanung, konfigurierten
Channels, Slots und Auto-Enable-Regeln ab. Wenn diese abgeleitete Menge leer ist, lädt OpenClaw
eine leere Runtime-Registry, statt auf jedes auffindbare Plugin zu erweitern.
Der Aktivierungsplaner stellt sowohl eine Nur-IDs-API für bestehende Aufrufer als auch eine
Plan-API für neue Diagnosen bereit. Planeinträge melden, warum ein Plugin ausgewählt wurde,
und trennen explizite activation.*-Planerhinweise von Manifest-Eigentümer-Fallbacks wie
providers, channels, commandAliases, setup.providers,
contracts.tools und Hooks. Diese Aufteilung der Gründe ist die Kompatibilitätsgrenze:
bestehende Plugin-Metadaten funktionieren weiter, während neuer Code breite Hinweise
oder Fallback-Verhalten erkennen kann, ohne die Semantik des Runtime-Ladens zu ändern.
Die Einrichtungserkennung bevorzugt jetzt deskriptor-eigene IDs wie setup.providers und
setup.cliBackends, um Kandidaten-Plugins einzugrenzen, bevor sie auf
setup-api für Plugins zurückfällt, die weiterhin Runtime-Hooks zur Einrichtungszeit benötigen. Provider-
Einrichtungslisten verwenden Manifest-providerAuthChoices, aus Deskriptoren abgeleitete
Einrichtungsoptionen und Installationskatalog-Metadaten, ohne die Provider-Runtime zu laden. Explizites
setup.requiresRuntime: false ist eine reine Deskriptor-Grenze; ein ausgelassenes
requiresRuntime behält den Legacy-setup-api-Fallback zur Kompatibilität bei. Wenn mehr
als ein gefundenes Plugin dieselbe normalisierte Einrichtungs-Provider- oder CLI-
Backend-ID beansprucht, verweigert die Einrichtungssuche den mehrdeutigen Eigentümer, statt sich auf
die Erkennungsreihenfolge zu verlassen. Wenn die Einrichtungs-Runtime ausgeführt wird, melden Registry-Diagnosen
Abweichungen zwischen setup.providers / setup.cliBackends und den Providern oder CLI-
Backends, die von setup-api registriert wurden, ohne Legacy-Plugins zu blockieren.
Plugin-Cache-Grenze
OpenClaw cached Plugin-Erkennungsergebnisse oder direkte Manifest-Registry-Daten nicht hinter Zeitfenstern. Installationen, Manifest-Bearbeitungen und Änderungen an Ladepfaden müssen beim nächsten expliziten Metadatenlesen oder Snapshot-Neuaufbau sichtbar werden. Der Manifest-Dateiparser darf einen begrenzten Dateisignatur-Cache halten, der nach dem geöffneten Manifestpfad, Inode, Größe und Zeitstempeln indiziert ist; dieser Cache vermeidet nur das erneute Parsen unveränderter Bytes und darf keine Erkennungs-, Registry-, Eigentümer- oder Policy-Antworten cachen. Der sichere schnelle Metadatenpfad ist explizite Objekteigentümerschaft, kein versteckter Cache. Gateway-Start-Hot-Paths sollten den aktuellenPluginMetadataSnapshot, die
abgeleitete PluginLookUpTable oder eine explizite Manifest-Registry durch die Aufrufkette
reichen. Konfigurationsvalidierung, Start-Auto-Enable, Plugin-Bootstrap und Provider-
Auswahl können diese Objekte wiederverwenden, solange sie die aktuelle Konfiguration und das
Plugin-Inventar darstellen. Die Einrichtungssuche rekonstruiert Manifest-Metadaten weiterhin bei Bedarf,
sofern der konkrete Einrichtungspfad keine explizite Manifest-Registry erhält; behalten Sie dies
als Cold-Path-Fallback bei, statt versteckte Lookup-Caches hinzuzufügen. Wenn sich die Eingabe
ändert, bauen Sie den Snapshot neu auf und ersetzen Sie ihn, statt ihn zu mutieren oder
historische Kopien zu behalten.
Sichten auf die aktive Plugin-Registry und gebündelte Channel-Bootstrap-Helfer
sollten aus der aktuellen Registry/dem aktuellen Root neu berechnet werden. Kurzlebige Maps sind
innerhalb eines einzelnen Aufrufs in Ordnung, um Arbeit zu deduplizieren oder Wiedereintritt abzusichern; sie
dürfen nicht zu Prozess-Metadaten-Caches werden.
Beim Plugin-Laden ist die persistente Cache-Schicht das Runtime-Laden. Sie darf
Loader-Zustand wiederverwenden, wenn Code oder installierte Artefakte tatsächlich geladen werden, zum Beispiel:
PluginLoaderCacheStateund kompatible aktive Runtime-Registries- jiti-/Modul-Caches und Public-Surface-Loader-Caches, die verwendet werden, um zu vermeiden, dieselbe Runtime-Oberfläche wiederholt zu importieren
- Dateisystem-Caches für installierte Plugin-Artefakte
- kurzlebige Maps pro Aufruf für Pfadnormalisierung oder Duplikatauflösung
- Erkennungsergebnisse
- direkte Manifest-Registries
- Manifest-Registries, die aus dem installierten Plugin-Index rekonstruiert wurden
- Provider-Eigentümer-Lookup, Modellunterdrückung, Provider-Policy oder Metadaten zu öffentlichen Artefakten
- jede andere aus dem Manifest abgeleitete Antwort, bei der ein geändertes Manifest, ein installierter Index oder ein Ladepfad beim nächsten Metadatenlesen sichtbar sein sollte
Registry-Modell
Geladene Plugins mutieren keine beliebigen Core-Globals direkt. Sie registrieren sich in einer zentralen Plugin-Registry. Die Registry verfolgt:- Plugin-Datensätze (Identität, Quelle, Ursprung, Status, Diagnosen)
- Tools
- Legacy-Hooks und typisierte Hooks
- Channels
- Provider
- Gateway-RPC-Handler
- HTTP-Routen
- CLI-Registrare
- Hintergrunddienste
- Plugin-eigene Befehle
- Plugin-Modul -> Registry-Registrierung
- Core-Runtime -> Registry-Nutzung
Callbacks für Conversation Bindings
Plugins, die eine Conversation binden, können reagieren, wenn eine Genehmigung aufgelöst wird. Verwenden Sieapi.onConversationBindingResolved(...), um einen Callback zu erhalten, nachdem eine Bind-
Anforderung genehmigt oder abgelehnt wurde:
status:"approved"oder"denied"decision:"allow-once","allow-always"oder"deny"binding: das aufgelöste Binding für genehmigte Anforderungenrequest: die ursprüngliche Anforderungszusammenfassung, der Detach-Hinweis, die Sender-ID und Conversation-Metadaten
Provider-Runtime-Hooks
Provider-Plugins haben drei Schichten:- Manifest-Metadaten für günstige Pre-Runtime-Lookups:
setup.providers[].envVars, veraltete KompatibilitätproviderAuthEnvVars,providerAuthAliases,providerAuthChoicesundchannelEnvVars. - Konfigurationszeit-Hooks:
catalog(Legacy-discovery) plusapplyConfigDefaults. - Runtime-Hooks: mehr als 40 optionale Hooks für Authentifizierung, Modellauflösung, Stream-Wrapping, Thinking Levels, Replay-Policy und Nutzungsendpunkte. Siehe die vollständige Liste unter Hook-Reihenfolge und Nutzung.
setup.providers[].envVars, wenn der Provider umgebungsbasierte
Anmeldedaten hat, die generische Auth-/Status-/Modellpicker-Pfade sehen sollten, ohne
die Plugin-Runtime zu laden. Das veraltete providerAuthEnvVars wird während des
Deprecation-Fensters weiterhin vom Kompatibilitätsadapter gelesen, und nicht gebündelte Plugins,
die es verwenden, erhalten eine Manifest-Diagnose. Verwenden Sie Manifest-providerAuthAliases,
wenn eine Provider-ID die Umgebungsvariablen, Auth-Profile,
konfigurationsgestützte Authentifizierung und API-Key-Onboarding-Auswahl einer anderen Provider-ID wiederverwenden soll. Verwenden Sie Manifest-
providerAuthChoices, wenn Onboarding-/Auth-Choice-CLI-Oberflächen die
Choice-ID des Providers, Gruppenlabels und einfache One-Flag-Auth-Verdrahtung kennen sollen, ohne
die Provider-Runtime zu laden. Behalten Sie Provider-Runtime-
envVars für operatorseitige Hinweise wie Onboarding-Labels oder OAuth-
Client-ID-/Client-Secret-Setup-Variablen bei.
Verwenden Sie Manifest-channelEnvVars, wenn ein Channel umgebungsgetriebene Authentifizierung oder Einrichtung hat, die
generischer Shell-Env-Fallback, Konfigurations-/Statusprüfungen oder Einrichtungs-Prompts sehen sollten,
ohne die Channel-Runtime zu laden.
Hook-Reihenfolge und Nutzung
Für Modell-/Provider-Plugins ruft OpenClaw Hooks ungefähr in dieser Reihenfolge auf. Die Spalte „Wann verwenden“ ist die schnelle Entscheidungshilfe. Nur der Kompatibilität dienende Provider-Felder, die OpenClaw nicht mehr aufruft, wieProviderPlugin.capabilities und suppressBuiltInModel, sind hier absichtlich nicht
aufgeführt.
| # | Hook | Was er macht | Wann verwenden |
|---|---|---|---|
| 1 | catalog | Veröffentlicht Provider-Konfiguration während der models.json-Generierung in models.providers | Provider besitzt einen Katalog oder Standardwerte für die Basis-URL |
| 2 | applyConfigDefaults | Wendet Provider-eigene globale Konfigurationsstandardwerte während der Konfigurationsmaterialisierung an | Standardwerte hängen vom Auth-Modus, von der Umgebung oder von Provider-Modellfamilien-Semantik ab |
| — | (integrierte Modellsuche) | OpenClaw versucht zuerst den normalen Registry-/Katalogpfad | (kein Plugin-Hook) |
| 3 | normalizeModelId | Normalisiert Legacy- oder Preview-Modell-ID-Aliasse vor der Suche | Provider besitzt die Alias-Bereinigung vor der kanonischen Modellauflösung |
| 4 | normalizeTransport | Normalisiert Provider-Familien-api / baseUrl vor der generischen Modellzusammenstellung | Provider besitzt die Transportbereinigung für benutzerdefinierte Provider-IDs in derselben Transportfamilie |
| 5 | normalizeConfig | Normalisiert models.providers.<id> vor Runtime-/Provider-Auflösung | Provider benötigt Konfigurationsbereinigung, die beim Plugin liegen sollte; gebündelte Google-Familien-Helfer sichern außerdem unterstützte Google-Konfigurationseinträge ab |
| 6 | applyNativeStreamingUsageCompat | Wendet native Kompatibilitätsumschreibungen für Streaming-Nutzung auf Konfigurations-Provider an | Provider benötigt endpoint-gesteuerte Korrekturen für native Streaming-Nutzungsmetadaten |
| 7 | resolveConfigApiKey | Löst Env-Marker-Auth für Konfigurations-Provider vor dem Laden der Runtime-Auth auf | Provider stellen eigene Hooks zur API-Schlüssel-Auflösung über Env-Marker bereit |
| 8 | resolveSyntheticAuth | Macht lokale/self-hosted oder konfigurationsgestützte Auth sichtbar, ohne Klartext dauerhaft zu speichern | Provider kann mit einem synthetischen/lokalen Anmeldedaten-Marker arbeiten |
| 9 | resolveExternalAuthProfiles | Überlagert Provider-eigene externe Auth-Profile; Standard-persistence ist runtime-only für CLI-/App-eigene Anmeldedaten | Provider verwendet externe Auth-Anmeldedaten wieder, ohne kopierte Refresh-Token dauerhaft zu speichern; contracts.externalAuthProviders im Manifest deklarieren |
| 10 | shouldDeferSyntheticProfileAuth | Ordnet gespeicherte synthetische Profil-Platzhalter hinter env-/konfigurationsgestützter Auth ein | Provider speichert synthetische Platzhalterprofile, die keinen Vorrang erhalten sollten |
| 11 | resolveDynamicModel | Synchroner Fallback für Provider-eigene Modell-IDs, die noch nicht in der lokalen Registry sind | Provider akzeptiert beliebige Upstream-Modell-IDs |
| 12 | prepareDynamicModel | Asynchrones Warm-up, danach läuft resolveDynamicModel erneut | Provider benötigt Netzwerkmetadaten, bevor unbekannte IDs aufgelöst werden |
| 13 | normalizeResolvedModel | Finale Umschreibung, bevor der eingebettete Runner das aufgelöste Modell verwendet | Provider benötigt Transportumschreibungen, nutzt aber weiterhin einen Core-Transport |
| 14 | normalizeToolSchemas | Normalisiert Tool-Schemas, bevor der eingebettete Runner sie sieht | Provider benötigt Schema-Bereinigung für die Transportfamilie |
| 15 | inspectToolSchemas | Macht Provider-eigene Schema-Diagnosen nach der Normalisierung sichtbar | Provider möchte Keyword-Warnungen, ohne dem Core Provider-spezifische Regeln beizubringen |
| 16 | resolveReasoningOutputMode | Wählt nativen gegenüber getaggtem Reasoning-Output-Vertrag | Provider benötigt getaggtes Reasoning/finale Ausgabe statt nativer Felder |
| 17 | prepareExtraParams | Request-Parameter-Normalisierung vor generischen Stream-Options-Wrappern | Provider benötigt Standard-Request-Parameter oder Parameterbereinigung pro Provider |
| 18 | createStreamFn | Ersetzt den normalen Stream-Pfad vollständig durch einen benutzerdefinierten Transport | Provider benötigt ein benutzerdefiniertes Wire-Protokoll, nicht nur einen Wrapper |
| 20 | wrapStreamFn | Stream-Wrapper nach Anwendung generischer Wrapper | Provider benötigt Kompatibilitäts-Wrapper für Request-Header/-Body/-Modell ohne benutzerdefinierten Transport |
| 21 | resolveTransportTurnState | Hängt native Transport-Header oder Metadaten pro Turn an | Provider möchte, dass generische Transporte Provider-native Turn-Identität senden |
| 22 | resolveWebSocketSessionPolicy | Hängt native WebSocket-Header oder Session-Cool-down-Policy an | Provider möchte generische WS-Transporte für Session-Header oder Fallback-Policy abstimmen |
| 23 | formatApiKey | Auth-Profil-Formatter: gespeichertes Profil wird zur Runtime-apiKey-Zeichenfolge | Provider speichert zusätzliche Auth-Metadaten und benötigt eine benutzerdefinierte Runtime-Tokenform |
| 24 | refreshOAuth | OAuth-Refresh-Override für benutzerdefinierte Refresh-Endpunkte oder Refresh-Fehler-Policy | Provider passt nicht zu den gemeinsamen OpenClaw-Refreshern |
| 25 | buildAuthDoctorHint | Reparaturhinweis, der angehängt wird, wenn OAuth-Refresh fehlschlägt | Provider benötigt Provider-eigene Auth-Reparaturanleitung nach Refresh-Fehler |
| 26 | matchesContextOverflowError | Provider-eigener Matcher für Kontextfensterüberlauf | Provider hat rohe Überlauffehler, die generische Heuristiken übersehen würden |
| 27 | classifyFailoverReason | Provider-eigene Klassifizierung von Failover-Gründen | Provider kann rohe API-/Transportfehler auf Rate-Limit/Überlastung/usw. abbilden |
| 28 | isCacheTtlEligible | Prompt-Cache-Policy für Proxy-/Backhaul-Provider | Provider benötigt Proxy-spezifisches Gating für Cache-TTL |
| 29 | buildMissingAuthMessage | Ersatz für die generische Wiederherstellungsnachricht bei fehlender Auth | Provider benötigt einen Provider-spezifischen Wiederherstellungshinweis bei fehlender Auth |
| 30 | augmentModelCatalog | Synthetische/finale Katalogzeilen, die nach der Discovery angehängt werden | Provider benötigt synthetische Forward-Compat-Zeilen in models list und Auswahllisten |
| 31 | resolveThinkingProfile | Modellspezifische /think-Levelmenge, Anzeigelabels und Standardwert | Provider stellt eine benutzerdefinierte Thinking-Leiter oder ein binäres Label für ausgewählte Modelle bereit |
| 32 | isBinaryThinking | Kompatibilitäts-Hook für Ein/Aus-Reasoning-Umschalter | Provider stellt nur binäres Thinking ein/aus bereit |
| 33 | supportsXHighThinking | Kompatibilitäts-Hook für xhigh-Reasoning-Unterstützung | Provider möchte xhigh nur für eine Teilmenge von Modellen |
| 34 | resolveDefaultThinkingLevel | Kompatibilitäts-Hook für Standard-/think-Level | Provider besitzt die Standard-/think-Policy für eine Modellfamilie |
| 35 | isModernModelRef | Matcher für moderne Modelle für Live-Profilfilter und Smoke-Auswahl | Provider besitzt Matching für bevorzugte Live-/Smoke-Modelle |
| 36 | prepareRuntimeAuth | Tauscht konfigurierte Anmeldedaten unmittelbar vor der Inferenz gegen das tatsächliche Runtime-Token/den tatsächlichen Runtime-Schlüssel | Provider benötigt einen Token-Austausch oder kurzlebige Request-Anmeldedaten |
| 37 | resolveUsageAuth | Löst Nutzungs-/Abrechnungsanmeldedaten für /usage und verwandte Statusoberflächen auf | Provider benötigt benutzerdefiniertes Parsen von Nutzungs-/Kontingent-Token oder andere Nutzungsanmeldedaten |
| 38 | fetchUsageSnapshot | Provider-spezifische Nutzungs-/Kontingent-Snapshots abrufen und normalisieren, nachdem die Authentifizierung aufgelöst wurde | Provider benötigt einen Provider-spezifischen Nutzungsendpunkt oder Payload-Parser |
| 39 | createEmbeddingProvider | Einen Provider-eigenen Embedding-Adapter für Memory/Suche erstellen | Memory-Embedding-Verhalten gehört zum Provider-Plugin |
| 40 | buildReplayPolicy | Eine Replay-Richtlinie zurückgeben, die die Transkriptverarbeitung für den Provider steuert | Provider benötigt eine benutzerdefinierte Transkript-Richtlinie (zum Beispiel Entfernen von Thinking-Blöcken) |
| 41 | sanitizeReplayHistory | Replay-Verlauf nach generischer Transkriptbereinigung umschreiben | Provider benötigt Provider-spezifische Replay-Umschreibungen über gemeinsame Compaction-Hilfsfunktionen hinaus |
| 42 | validateReplayTurns | Abschließende Validierung oder Umformung von Replay-Turns vor dem eingebetteten Runner | Provider-Transport benötigt strengere Turn-Validierung nach generischer Bereinigung |
| 43 | onModelSelected | Provider-eigene Nebeneffekte nach der Auswahl ausführen | Provider benötigt Telemetrie oder Provider-eigenen Zustand, wenn ein Modell aktiv wird |
normalizeModelId, normalizeTransport und normalizeConfig prüfen zuerst das
übereinstimmende Provider-Plugin und fallen dann auf andere hook-fähige
Provider-Plugins zurück, bis eines tatsächlich die Modell-ID oder
Transport/Konfiguration ändert. Dadurch funktionieren
Alias-/Kompatibilitäts-Provider-Shims weiter, ohne dass der Aufrufer wissen muss,
welches gebündelte Plugin die Umschreibung besitzt. Wenn kein Provider-Hook einen
unterstützten Konfigurationseintrag der Google-Familie umschreibt, wendet der
gebündelte Google-Konfigurationsnormalisierer diese Kompatibilitätsbereinigung
weiterhin an.
Wenn der Provider ein vollständig eigenes Wire-Protokoll oder einen eigenen
Request-Executor benötigt, ist das eine andere Klasse von Erweiterung. Diese
Hooks sind für Provider-Verhalten gedacht, das weiterhin in OpenClaws normalem
Inference-Loop läuft.
resolveUsageAuth entscheidet, ob OpenClaw fetchUsageSnapshot aufrufen oder
für Nutzungs-/Status-Oberflächen auf die generische Anmeldedatenauflösung
zurückfallen soll. Geben Sie { token, accountId? } zurück, wenn der Provider
Nutzungsanmeldedaten hat, geben Sie { handled: true } zurück, wenn
provider-eigene Nutzungsauthentifizierung die Anfrage verarbeitet hat und den
generischen API-Key-/OAuth-Fallback unterdrücken muss, und geben Sie null oder
undefined zurück, wenn der Provider die Nutzungsauthentifizierung nicht
verarbeitet hat.
Provider-Beispiel
Integrierte Beispiele
Gebündelte Provider-Plugins kombinieren die oben genannten Hooks, um zu Katalog, Authentifizierung, Thinking, Replay und Nutzungsanforderungen der jeweiligen Anbieter zu passen. Der maßgebliche Hook-Satz liegt bei jedem Plugin unterextensions/; diese Seite veranschaulicht die Formen, statt die Liste zu
spiegeln.
Pass-through catalog providers
Pass-through catalog providers
OpenRouter, Kilocode, Z.AI, xAI registrieren
catalog plus
resolveDynamicModel / prepareDynamicModel, damit sie Upstream-Modell-IDs
vor OpenClaws statischem Katalog verfügbar machen können.OAuth and usage endpoint providers
OAuth and usage endpoint providers
GitHub Copilot, Gemini CLI, ChatGPT Codex, MiniMax, Xiaomi, z.ai kombinieren
prepareRuntimeAuth oder formatApiKey mit resolveUsageAuth +
fetchUsageSnapshot, um Token-Austausch und /usage-Integration zu besitzen.Replay and transcript cleanup families
Replay and transcript cleanup families
Gemeinsame benannte Familien (
google-gemini, passthrough-gemini,
anthropic-by-model, hybrid-anthropic-openai) ermöglichen Providern, sich
über buildReplayPolicy in Transcript-Richtlinien einzuklinken, statt dass
jedes Plugin die Bereinigung neu implementiert.Catalog-only providers
Catalog-only providers
byteplus, cloudflare-ai-gateway, huggingface, kimi-coding, nvidia,
qianfan, synthetic, together, venice, vercel-ai-gateway und
volcengine registrieren nur catalog und nutzen den gemeinsamen
Inference-Loop.Anthropic-specific stream helpers
Anthropic-specific stream helpers
Beta-Header,
/fast / serviceTier und context1m liegen in der öffentlichen
api.ts- / contract-api.ts-Seam des Anthropic-Plugins
(wrapAnthropicProviderStream, resolveAnthropicBetas,
resolveAnthropicFastMode, resolveAnthropicServiceTier) statt im
generischen SDK.Runtime-Helfer
Plugins können überapi.runtime auf ausgewählte Core-Helfer zugreifen. Für TTS:
textToSpeechgibt die normale Core-TTS-Ausgabe-Payload für Datei-/Sprachnotiz-Oberflächen zurück.- Verwendet Core-Konfiguration
messages.ttsund Provider-Auswahl. - Gibt PCM-Audiopuffer + Abtastrate zurück. Plugins müssen für Provider resamplen/encodieren.
listVoicesist pro Provider optional. Verwenden Sie es für anbieter-eigene Sprachauswahlen oder Setup-Flows.- Sprachlisten können reichere Metadaten wie Locale, Geschlecht und Persönlichkeits-Tags für provider-bewusste Auswahlen enthalten.
- OpenAI und ElevenLabs unterstützen heute Telefonie. Microsoft nicht.
api.registerSpeechProvider(...) registrieren.
- Belassen Sie TTS-Richtlinie, Fallback und Antwortzustellung im Core.
- Verwenden Sie Speech-Provider für anbieter-eigenes Syntheseverhalten.
- Legacy-Microsoft-
edge-Eingabe wird auf die Provider-IDmicrosoftnormalisiert. - Das bevorzugte Besitzmodell ist unternehmensorientiert: Ein Anbieter-Plugin kann Text-, Speech-, Image- und künftige Media-Provider besitzen, während OpenClaw diese Capability-Verträge hinzufügt.
- Belassen Sie Orchestrierung, Fallback, Konfiguration und Channel-Verdrahtung im Core.
- Belassen Sie anbieter-spezifisches Verhalten im Provider-Plugin.
- Additive Erweiterungen sollten typisiert bleiben: neue optionale Methoden, neue optionale Ergebnisfelder, neue optionale Capabilities.
- Videoerzeugung folgt bereits demselben Muster:
- Core besitzt den Capability-Vertrag und Runtime-Helfer
- Anbieter-Plugins registrieren
api.registerVideoGenerationProvider(...) - Feature-/Channel-Plugins verwenden
api.runtime.videoGeneration.*
api.runtime.mediaUnderstanding.*ist die bevorzugte gemeinsame Oberfläche für Bild-/Audio-/Video-Verstehen.extractStructuredWithModel(...)ist die plugin-seitige Seam für begrenzte, provider-eigene, image-first Extraktion. Fügen Sie mindestens eine Bildeingabe hinzu; Texteingaben sind ergänzender Kontext. Produkt-Plugins besitzen ihre Routen und Schemas, während OpenClaw die Provider-/Runtime-Grenze besitzt.- Verwendet Core-Media-Understanding-Audiokonfiguration (
tools.media.audio) und Provider-Fallback-Reihenfolge. - Gibt
{ text: undefined }zurück, wenn keine Transkriptionsausgabe erzeugt wird (zum Beispiel übersprungene/nicht unterstützte Eingabe). api.runtime.stt.transcribeAudioFile(...)bleibt als Kompatibilitätsalias erhalten.
api.runtime.subagent starten:
providerundmodelsind optionale Overrides pro Lauf, keine persistenten Sitzungsänderungen.- OpenClaw berücksichtigt diese Override-Felder nur für vertrauenswürdige Aufrufer.
- Für plugin-eigene Fallback-Läufe müssen Operatoren mit
plugins.entries.<id>.subagent.allowModelOverride: truezustimmen. - Verwenden Sie
plugins.entries.<id>.subagent.allowedModels, um vertrauenswürdige Plugins auf bestimmte kanonischeprovider/model-Ziele zu beschränken, oder"*", um jedes Ziel ausdrücklich zu erlauben. - Subagent-Läufe nicht vertrauenswürdiger Plugins funktionieren weiterhin, aber Override-Anfragen werden abgelehnt, statt stillschweigend zurückzufallen.
- Von Plugins erstellte Subagent-Sitzungen werden mit der ID des erstellenden Plugins getaggt. Fallback
api.runtime.subagent.deleteSession(...)darf nur diese eigenen Sitzungen löschen; beliebiges Löschen von Sitzungen erfordert weiterhin eine admin-skopierte Gateway-Anfrage.
api.registerWebSearchProvider(...) registrieren.
Hinweise:
- Belassen Sie Provider-Auswahl, Anmeldedatenauflösung und gemeinsame Request-Semantik im Core.
- Verwenden Sie Websuche-Provider für anbieter-spezifische Suchtransporte.
api.runtime.webSearch.*ist die bevorzugte gemeinsame Oberfläche für Feature-/Channel-Plugins, die Suchverhalten benötigen, ohne vom Agent-Tool-Wrapper abzuhängen.
api.runtime.imageGeneration
generate(...): Erzeugt ein Bild mithilfe der konfigurierten Image-Generation-Provider-Kette.listProviders(...): Listet verfügbare Image-Generation-Provider und ihre Capabilities auf.
Gateway-HTTP-Routen
Plugins können HTTP-Endpunkte mitapi.registerHttpRoute(...) verfügbar machen.
path: Routenpfad unter dem Gateway-HTTP-Server.auth: erforderlich. Verwenden Sie"gateway", um normale Gateway-Authentifizierung zu verlangen, oder"plugin"für Plugin-verwaltete Authentifizierung/Webhook-Verifizierung.match: optional."exact"(Standard) oder"prefix".replaceExisting: optional. Erlaubt demselben Plugin, seine eigene bestehende Routenregistrierung zu ersetzen.handler: gibttruezurück, wenn die Route die Anfrage verarbeitet hat.
api.registerHttpHandler(...)wurde entfernt und führt zu einem Plugin-Ladefehler. Verwenden Sie stattdessenapi.registerHttpRoute(...).- Plugin-Routen müssen
authausdrücklich deklarieren. - Exakte Konflikte bei
path + matchwerden abgelehnt, außer beireplaceExisting: true; ein Plugin kann die Route eines anderen Plugins nicht ersetzen. - Überlappende Routen mit unterschiedlichen
auth-Stufen werden abgelehnt. Behalten Sieexact/prefix-Fallthrough-Ketten nur auf derselben Authentifizierungsstufe. - Routen mit
auth: "plugin"erhalten nicht automatisch Operator-Laufzeitbereiche. Sie sind für Plugin-verwaltete Webhooks/Signaturverifizierung gedacht, nicht für privilegierte Gateway-Hilfsaufrufe. - Routen mit
auth: "gateway"laufen innerhalb eines Gateway-Anfrage-Laufzeitbereichs, aber dieser Bereich ist absichtlich konservativ:- Shared-Secret-Bearer-Authentifizierung (
gateway.auth.mode = "token"/"password") hält Laufzeitbereiche von Plugin-Routen aufoperator.writefixiert, selbst wenn der Aufruferx-openclaw-scopessendet - vertrauenswürdige identitätstragende HTTP-Modi (zum Beispiel
trusted-proxyodergateway.auth.mode = "none"auf einem privaten Ingress) berücksichtigenx-openclaw-scopesnur, wenn der Header ausdrücklich vorhanden ist - fehlt
x-openclaw-scopesbei diesen identitätstragenden Plugin-Routen-Anfragen, fällt der Laufzeitbereich aufoperator.writezurück
- Shared-Secret-Bearer-Authentifizierung (
- Praktische Regel: Gehen Sie nicht davon aus, dass eine Gateway-authentifizierte Plugin-Route implizit eine Admin-Oberfläche ist. Wenn Ihre Route nur Admin-Verhalten benötigt, verlangen Sie einen identitätstragenden Authentifizierungsmodus und dokumentieren Sie den ausdrücklichen Header-Vertrag für
x-openclaw-scopes.
Plugin-SDK-Importpfade
Verwenden Sie beim Erstellen neuer Plugins schmale SDK-Unterpfade statt des monolithischen Root-Barrelsopenclaw/plugin-sdk.
Kern-Unterpfade:
| Unterpfad | Zweck |
|---|---|
openclaw/plugin-sdk/plugin-entry | Primitive für die Plugin-Registrierung |
openclaw/plugin-sdk/channel-core | Hilfen für Channel-Einstieg und -Erstellung |
openclaw/plugin-sdk/core | Generische gemeinsame Hilfen und Rahmenvertrag |
openclaw/plugin-sdk/config-schema | Zod-Schema für Root-openclaw.json (OpenClawSchema) |
channel-setup,
setup-runtime, setup-tools, channel-pairing,
channel-contract, channel-feedback, channel-inbound, channel-outbound,
command-auth, secret-input, webhook-ingress,
channel-targets und channel-actions. Genehmigungsverhalten sollte auf einem
einzigen approvalCapability-Vertrag konsolidiert werden, statt über nicht
zusammenhängende Plugin-Felder gemischt zu werden. Siehe Channel-Plugins.
Laufzeit- und Konfigurationshilfen liegen unter passenden fokussierten
*-runtime-Unterpfaden (approval-runtime, agent-runtime, lazy-runtime,
directory-runtime, text-runtime, runtime-store, system-event-runtime,
heartbeat-runtime, channel-activity-runtime usw.). Bevorzugen Sie
config-contracts, plugin-config-runtime, runtime-config-snapshot und
config-mutation statt des breiten Kompatibilitäts-Barrels config-runtime.
openclaw/plugin-sdk/channel-runtime, openclaw/plugin-sdk/channel-lifecycle,
kleine Channel-Hilfsfassaden, openclaw/plugin-sdk/outbound-runtime,
openclaw/plugin-sdk/outbound-send-deps, openclaw/plugin-sdk/config-runtime
und openclaw/plugin-sdk/infra-runtime sind veraltete Kompatibilitäts-Shims für
ältere Plugins. Neuer Code sollte stattdessen schmalere generische Primitive importieren.index.js— Einstieg für gebündelte Pluginsapi.js— Barrel für Hilfen/Typenruntime-api.js— nur Laufzeit-Barrelsetup-entry.js— Setup-Plugin-Einstieg
openclaw/plugin-sdk/*-Unterpfade importieren. Importieren Sie niemals src/* eines anderen Plugin-Pakets aus Core oder aus einem anderen Plugin.
Über Fassaden geladene Einstiegspunkte bevorzugen den aktiven Laufzeit-Konfigurations-Snapshot, wenn einer
existiert, und fallen danach auf die aufgelöste Konfigurationsdatei auf der Festplatte zurück.
Fähigkeitsspezifische Unterpfade wie image-generation, media-understanding
und speech existieren, weil gebündelte Plugins sie heute verwenden. Sie sind
nicht automatisch langfristig eingefrorene externe Verträge — prüfen Sie die relevante SDK-Referenzseite, wenn Sie sich auf sie verlassen.
Nachrichtentool-Schemas
Plugins sollten Channel-spezifische Schema-Beiträge fürdescribeMessageTool(...) für Nicht-Nachrichten-Primitive wie Reaktionen,
Lesebestätigungen und Umfragen besitzen. Gemeinsame Sende-Präsentation sollte
den generischen MessagePresentation-Vertrag verwenden statt Provider-nativer
Button-, Komponenten-, Block- oder Kartenfelder. Siehe
Nachrichtenpräsentation für den Vertrag,
Fallback-Regeln, Provider-Zuordnung und die Checkliste für Plugin-Autoren.
Sendefähige Plugins deklarieren über Nachrichtenfähigkeiten, was sie darstellen können:
presentationfür semantische Präsentationsblöcke (text,context,divider,buttons,select)delivery-pinfür Anfragen zu angehefteter Zustellung
Auflösung von Channel-Zielen
Channel-Plugins sollten Channel-spezifische Zielsemantik besitzen. Halten Sie den gemeinsamen Outbound-Host generisch und verwenden Sie die Messaging-Adapter-Oberfläche für Provider-Regeln:messaging.inferTargetChatType({ to })entscheidet vor der Verzeichnissuche, ob ein normalisiertes Ziel alsdirect,groupoderchannelbehandelt werden soll.messaging.targetResolver.looksLikeId(raw, normalized)teilt Core mit, ob eine Eingabe direkt zur ID-artigen Auflösung gehen soll, statt eine Verzeichnissuche zu verwenden.messaging.targetResolver.reservedLiteralslistet einfache Wörter auf, die Channel-/Sitzungsreferenzen für diesen Provider sind. Die Auflösung bewahrt konfigurierte Verzeichniseinträge, bevor reservierte Literale abgelehnt werden, und schlägt dann bei einem Verzeichnisfehler geschlossen fehl.messaging.targetResolver.resolveTarget(...)ist der Plugin-Fallback, wenn Core nach der Normalisierung oder nach einem Verzeichnisfehler eine abschließende Provider-eigene Auflösung benötigt.messaging.resolveOutboundSessionRoute(...)besitzt die Provider-spezifische Konstruktion der Sitzungsroute, sobald ein Ziel aufgelöst ist.
- Verwenden Sie
inferTargetChatTypefür Kategorieentscheidungen, die vor der Suche nach Peers/Gruppen stattfinden sollten. - Verwenden Sie
looksLikeIdfür Prüfungen nach dem Muster „dies als explizite/native Ziel-ID behandeln“. - Verwenden Sie
resolveTargetfür Provider-spezifischen Normalisierungs-Fallback, nicht für breite Verzeichnissuche. - Halten Sie Provider-native IDs wie Chat-IDs, Thread-IDs, JIDs, Handles und Raum-IDs
innerhalb von
target-Werten oder Provider-spezifischen Parametern, nicht in generischen SDK-Feldern.
Konfigurationsgestützte Verzeichnisse
Plugins, die Verzeichniseinträge aus der Konfiguration ableiten, sollten diese Logik im Plugin halten und die gemeinsamen Hilfen ausopenclaw/plugin-sdk/directory-runtime wiederverwenden.
Verwenden Sie dies, wenn ein Channel konfigurationsgestützte Peers/Gruppen benötigt, etwa:
- durch Allowlist gesteuerte DM-Peers
- konfigurierte Channel-/Gruppen-Zuordnungen
- kontobezogene statische Verzeichnis-Fallbacks
directory-runtime behandeln nur generische Vorgänge:
- Abfragefilterung
- Anwendung von Limits
- Hilfen für Deduplizierung/Normalisierung
- Erstellen von
ChannelDirectoryEntry[]
Provider-Kataloge
Provider-Plugins können Modellkataloge für Inferenz mitregisterProvider({ catalog: { run(...) { ... } } }) definieren.
catalog.run(...) gibt dieselbe Form zurück, die OpenClaw in
models.providers schreibt:
{ provider }für einen Provider-Eintrag{ providers }für mehrere Provider-Einträge
catalog, wenn das Plugin Provider-spezifische Modell-IDs,
Standardwerte für Basis-URLs oder authentifizierungsgeschützte Modellmetadaten besitzt.
catalog.order steuert, wann der Katalog eines Plugins relativ zu den
eingebauten impliziten Providern von OpenClaw zusammengeführt wird:
simple: einfache API-Key- oder env-gesteuerte Providerprofile: Provider, die erscheinen, wenn Auth-Profile existierenpaired: Provider, die mehrere zusammengehörige Provider-Einträge synthetisierenlate: letzter Durchlauf, nach anderen impliziten Providern
api.registerModelCatalogProvider({ provider, kinds, staticCatalog, liveCatalog }) veröffentlichen. Dies ist der künftige Pfad für Listen-/Hilfe-/Auswahloberflächen und unterstützt
text-, image_generation-, video_generation- und music_generation-Zeilen.
Provider-Plugins besitzen weiterhin Live-Endpunktaufrufe, Token-Austausch und
Zuordnung von Vendor-Antworten; Core besitzt die gemeinsame Zeilenform,
Quellenlabels und Formatierung der Medientool-Hilfe. Registrierungen von
Mediengenerierungs-Providern synthetisieren automatisch statische Katalogzeilen
aus defaultModel, models und capabilities.
Kompatibilität:
discoveryfunktioniert weiterhin als Legacy-Alias, gibt aber eine Veraltungswarnung aus- wenn sowohl
catalogals auchdiscoveryregistriert sind, verwendet OpenClawcatalog augmentModelCatalogist veraltet; gebündelte Provider sollten ergänzende Zeilen überregisterModelCatalogProviderveröffentlichen
Schreibgeschützte Channel-Prüfung
Wenn Ihr Plugin einen Channel registriert, implementieren Sie bevorzugtplugin.config.inspectAccount(cfg, accountId) neben resolveAccount(...).
Warum:
resolveAccount(...)ist der Laufzeitpfad. Er darf annehmen, dass Zugangsdaten vollständig materialisiert sind, und kann schnell fehlschlagen, wenn erforderliche Secrets fehlen.- Schreibgeschützte Befehlspfade wie
openclaw status,openclaw status --all,openclaw channels status,openclaw channels resolvesowie Doctor-/Konfigurations- Reparaturabläufe sollten keine Laufzeit-Zugangsdaten materialisieren müssen, nur um Konfiguration zu beschreiben.
inspectAccount(...):
- Geben Sie nur beschreibenden Kontostatus zurück.
- Bewahren Sie
enabledundconfigured. - Fügen Sie bei Bedarf Felder für Quelle/Status von Zugangsdaten hinzu, etwa:
tokenSource,tokenStatusbotTokenSource,botTokenStatusappTokenSource,appTokenStatussigningSecretSource,signingSecretStatus
- Sie müssen keine rohen Token-Werte zurückgeben, nur um schreibgeschützte
Verfügbarkeit zu melden.
tokenStatus: "available"(und das passende Quellenfeld) reicht für Statusbefehle aus. - Verwenden Sie
configured_unavailable, wenn Zugangsdaten per SecretRef konfiguriert, aber im aktuellen Befehlspfad nicht verfügbar sind.
Paket-Packs
Ein Plugin-Verzeichnis kann einepackage.json mit openclaw.extensions enthalten:
name/<fileBase>.
Wenn Ihr Plugin npm-Abhängigkeiten importiert, installieren Sie sie in diesem Verzeichnis, damit
node_modules verfügbar ist (npm install / pnpm install).
Sicherheitsleitplanke: Jeder openclaw.extensions-Eintrag muss nach der Symlink-Auflösung innerhalb des Plugin-
Verzeichnisses bleiben. Einträge, die aus dem Paketverzeichnis ausbrechen, werden
abgelehnt.
Sicherheitshinweis: openclaw plugins install installiert Plugin-Abhängigkeiten mit einem
projektlokalen npm install --omit=dev --ignore-scripts (keine Lifecycle-Skripte,
keine Entwicklungsabhängigkeiten zur Laufzeit) und ignoriert geerbte globale npm-Installationseinstellungen.
Halten Sie Plugin-Abhängigkeitsbäume “reine JS/TS” und vermeiden Sie Pakete, die
postinstall-Builds erfordern.
Optional: openclaw.setupEntry kann auf ein leichtgewichtiges, nur für die Einrichtung bestimmtes Modul verweisen.
Wenn OpenClaw Einrichtungsoberflächen für ein deaktiviertes Kanal-Plugin benötigt oder
wenn ein Kanal-Plugin aktiviert, aber noch nicht konfiguriert ist, lädt es setupEntry
anstelle des vollständigen Plugin-Einstiegs. Dadurch bleiben Start und Einrichtung schlanker,
wenn Ihr Haupt-Plugin-Einstieg auch Tools, Hooks oder anderen nur zur Laufzeit benötigten
Code verdrahtet.
Optional: openclaw.startup.deferConfiguredChannelFullLoadUntilAfterListen
kann ein Kanal-Plugin während der Pre-Listen-Startphase des Gateway in denselben
setupEntry-Pfad aufnehmen, auch wenn der Kanal bereits konfiguriert ist.
Verwenden Sie dies nur, wenn setupEntry die Startoberfläche vollständig abdeckt, die vorhanden sein muss,
bevor der Gateway zu lauschen beginnt. In der Praxis bedeutet das, dass der Einrichtungseinstieg
jede kanalverwaltete Capability registrieren muss, von der der Start abhängt, zum Beispiel:
- die Kanalregistrierung selbst
- alle HTTP-Routen, die verfügbar sein müssen, bevor der Gateway zu lauschen beginnt
- alle Gateway-Methoden, Tools oder Dienste, die in demselben Zeitfenster vorhanden sein müssen
singleAccountKeysToMovenamedAccountPromotionKeysresolveSingleAccountPromotionTarget(...)
channels.<id>.accounts.* überführt werden muss, ohne den vollständigen Plugin-Einstieg zu laden.
Matrix ist das aktuelle gebündelte Beispiel: Es verschiebt nur Authentifizierungs-/Bootstrap-Schlüssel in ein
benanntes promotetes Konto, wenn bereits benannte Konten existieren, und kann einen
konfigurierten nicht kanonischen Standardkonto-Schlüssel beibehalten, statt immer
accounts.default zu erstellen.
Diese Einrichtungs-Patch-Adapter halten die Erkennung gebündelter Vertragsoberflächen lazy. Die Importzeit
bleibt gering; die Promotionsoberfläche wird erst bei der ersten Verwendung geladen, statt
beim Modulimport erneut in den Start des gebündelten Kanals einzutreten.
Wenn diese Startoberflächen Gateway-RPC-Methoden enthalten, halten Sie sie unter einem
Plugin-spezifischen Präfix. Core-Administrationsnamespaces (config.*,
exec.approvals.*, wizard.*, update.*) bleiben reserviert und werden immer
zu operator.admin aufgelöst, selbst wenn ein Plugin einen engeren Scope anfordert.
Beispiel:
Kanal-Katalogmetadaten
Kanal-Plugins können Einrichtungs-/Erkennungsmetadaten überopenclaw.channel und
Installationshinweise über openclaw.install bekanntgeben. Dadurch bleibt der Core-Katalog datenfrei.
Beispiel:
openclaw.channel-Felder über das Minimalbeispiel hinaus:
detailLabel: sekundäres Label für reichhaltigere Katalog-/StatusoberflächendocsLabel: Linktext für den Dokumentationslink überschreibenpreferOver: niedriger priorisierte Plugin-/Kanal-IDs, die dieser Katalogeintrag übertreffen sollselectionDocsPrefix,selectionDocsOmitLabel,selectionExtras: Kopiersteuerungen für AuswahloberflächenmarkdownCapable: markiert den Kanal für ausgehende Formatierungsentscheidungen als Markdown-fähigexposure.configured: blendet den Kanal aus Oberflächen mit konfigurierten Kanallisten aus, wenn auffalsegesetztexposure.setup: blendet den Kanal aus interaktiven Einrichtungs-/Konfigurationsauswahlen aus, wenn auffalsegesetztexposure.docs: markiert den Kanal für Dokumentationsnavigationsoberflächen als intern/privatshowConfigured/showInSetup: Legacy-Aliasse, die aus Kompatibilitätsgründen weiterhin akzeptiert werden; bevorzugen SieexposurequickstartAllowFrom: nimmt den Kanal in den standardmäßigen Quickstart-allowFrom-Flow aufforceAccountBinding: erfordert eine explizite Kontobindung, auch wenn nur ein Konto existiertpreferSessionLookupForAnnounceTarget: bevorzugt die Sitzungssuche beim Auflösen von Ankündigungszielen
~/.openclaw/mpm/plugins.json~/.openclaw/mpm/catalog.json~/.openclaw/plugins/catalog.json
OPENCLAW_PLUGIN_CATALOG_PATHS (oder OPENCLAW_MPM_CATALOG_PATHS) auf
eine oder mehrere JSON-Dateien (durch Komma/Semikolon/PATH getrennt). Jede Datei sollte
{ "entries": [ { "name": "@scope/pkg", "openclaw": { "channel": {...}, "install": {...} } } ] } enthalten. Der Parser akzeptiert außerdem "packages" oder "plugins" als Legacy-Aliasse für den Schlüssel "entries".
Generierte Kanalkatalogeinträge und Provider-Installationskatalogeinträge stellen
normalisierte Fakten zur Installationsquelle neben dem rohen openclaw.install-Block bereit. Die
normalisierten Fakten identifizieren, ob die npm-Spezifikation eine exakte Version oder ein gleitender
Selektor ist, ob erwartete Integritätsmetadaten vorhanden sind und ob auch ein lokaler
Quellpfad verfügbar ist. Wenn die Katalog-/Paketidentität bekannt ist, warnen die
normalisierten Fakten, falls der geparste npm-Paketname von dieser Identität abweicht.
Sie warnen außerdem, wenn defaultChoice ungültig ist oder auf eine Quelle verweist, die
nicht verfügbar ist, sowie wenn npm-Integritätsmetadaten ohne gültige npm-
Quelle vorhanden sind. Konsumenten sollten installSource als additives optionales Feld behandeln, damit
manuell erstellte Einträge und Katalog-Shims es nicht synthetisieren müssen.
Dadurch können Onboarding und Diagnose den Zustand der Source-Plane erklären, ohne
Plugin-Laufzeit zu importieren.
Offizielle externe npm-Einträge sollten eine exakte npmSpec plus
expectedIntegrity bevorzugen. Reine Paketnamen und Dist-Tags funktionieren aus
Kompatibilitätsgründen weiterhin, erzeugen aber Source-Plane-Warnungen, damit der Katalog sich
in Richtung gepinnter, integritätsgeprüfter Installationen bewegen kann, ohne bestehende Plugins zu beschädigen.
Wenn Onboarding aus einem lokalen Katalogpfad installiert, zeichnet es einen verwalteten Plugin-
Plugin-Indexeintrag mit source: "path" und, wenn möglich, einem workspace-relativen
sourcePath auf. Der absolute operative Ladepfad bleibt in
plugins.load.paths; der Installationsdatensatz vermeidet es, lokale Workstation-
Pfade in langlebige Konfiguration zu duplizieren. Dadurch bleiben lokale Entwicklungsinstallationen für
Source-Plane-Diagnosen sichtbar, ohne eine zweite rohe Offenlegungsoberfläche für Dateisystempfade
hinzuzufügen. Die persistierte SQLite-Zeile installed_plugin_index ist die
maßgebliche Installationsquelle und kann aktualisiert werden, ohne Plugin-Laufzeitmodule zu laden.
Ihre installRecords-Map ist dauerhaft, auch wenn ein Plugin-Manifest fehlt oder
ungültig ist; ihre plugins-Nutzlast ist eine neu aufbaubare Manifestansicht.
Kontext-Engine-Plugins
Kontext-Engine-Plugins besitzen die Sitzungs-Kontextorchestrierung für Ingest, Assembly und Compaction. Registrieren Sie sie aus Ihrem Plugin mitapi.registerContextEngine(id, factory) und wählen Sie anschließend die aktive Engine mit
plugins.slots.contextEngine aus.
Verwenden Sie dies, wenn Ihr Plugin die Standard-Kontextpipeline ersetzen oder erweitern muss,
statt nur Speichersuche oder Hooks hinzuzufügen.
ctx stellt optionale Werte config, agentDir und workspaceDir
für die Initialisierung zur Konstruktionszeit bereit.
assemble() kann contextProjection zurückgeben, wenn das aktive Harness einen
persistenten Backend-Thread hat. Lassen Sie es für die Legacy-Projektion pro Turn weg. Geben Sie
{ mode: "thread_bootstrap", epoch } zurück, wenn der zusammengestellte Kontext einmal
in einen Backend-Thread injiziert und wiederverwendet werden soll, bis sich die Epoche ändert. Ändern Sie
die Epoche, nachdem sich der semantische Kontext der Engine geändert hat, etwa nach einem
Engine-eigenen Compaction-Durchlauf. Hosts können Tool-Call-Metadaten, Eingabeform
und redigierte Tool-Ergebnisse in einer Thread-Bootstrap-Projektion beibehalten, damit frische
Backend-Threads Tool-Kontinuität erhalten, ohne rohe geheimnistragende
Nutzlasten zu kopieren.
Wenn Ihre Engine den Compaction-Algorithmus nicht besitzt, halten Sie compact()
implementiert und delegieren Sie ihn explizit:
Eine neue Capability hinzufügen
Wenn ein Plugin Verhalten benötigt, das nicht zur aktuellen API passt, umgehen Sie das Plugin-System nicht mit einem privaten Zugriff. Fügen Sie die fehlende Capability hinzu. Empfohlene Reihenfolge:- Core-Vertrag definieren Entscheiden Sie, welches gemeinsame Verhalten Core besitzen soll: Policy, Fallback, Konfigurationszusammenführung, Lifecycle, kanalbezogene Semantik und Form von Laufzeit-Hilfsfunktionen.
- typisierte Plugin-Registrierungs-/Laufzeitoberflächen hinzufügen
Erweitern Sie
OpenClawPluginApiund/oderapi.runtimeum die kleinste nützliche typisierte Capability-Oberfläche. - Core + Kanal-/Feature-Konsumenten verdrahten Kanäle und Feature-Plugins sollten die neue Capability über Core konsumieren, nicht durch direkten Import einer Vendor-Implementierung.
- Vendor-Implementierungen registrieren Vendor-Plugins registrieren dann ihre Backends für die Capability.
- Vertragsabdeckung hinzufügen Fügen Sie Tests hinzu, damit Besitz und Registrierungsform über die Zeit explizit bleiben.
Capability-Checkliste
Wenn Sie eine neue Capability hinzufügen, sollte die Implementierung diese Oberflächen normalerweise gemeinsam berühren:- Core-Vertragstypen in
src/<capability>/types.ts - Core-Runner-/Laufzeit-Hilfsfunktion in
src/<capability>/runtime.ts - Plugin-API-Registrierungsoberfläche in
src/plugins/types.ts - Plugin-Registry-Verdrahtung in
src/plugins/registry.ts - Plugin-Laufzeit-Exponierung in
src/plugins/runtime/*, wenn Feature-/Kanal- Plugins sie konsumieren müssen - Erfassungs-/Test-Hilfsfunktionen in
src/test-utils/plugin-registration.ts - Besitz-/Vertragsassertionen in
src/plugins/contracts/registry.ts - Operator-/Plugin-Dokumentation in
docs/
Capability-Vorlage
Minimales Muster:- Core besitzt den Capability-Vertrag und die Orchestrierung
- Vendor-Plugins besitzen Vendor-Implementierungen
- Feature-/Kanal-Plugins nutzen Runtime-Hilfsfunktionen
- Vertragstests halten die Zuständigkeit explizit
Verwandt
- Plugin-Architektur — öffentliches Capability-Modell und Formen
- Plugin-SDK-Subpaths
- Plugin-SDK-Einrichtung
- Plugins erstellen