Plugins
Punkty wejścia Plugin
Każdy plugin eksportuje domyślny obiekt wejściowy. SDK udostępnia trzy pomocniki do ich tworzenia.
W przypadku zainstalowanych pluginów package.json powinien kierować ładowanie
runtime na zbudowany JavaScript, gdy jest dostępny:
{
"openclaw": {
"extensions": ["./src/index.ts"],
"runtimeExtensions": ["./dist/index.js"],
"setupEntry": "./src/setup-entry.ts",
"runtimeSetupEntry": "./dist/setup-entry.js"
}
}
extensions i setupEntry pozostają prawidłowymi wpisami źródłowymi dla pracy
w workspace i checkoutach git. runtimeExtensions i runtimeSetupEntry są preferowane,
gdy OpenClaw ładuje zainstalowany pakiet, i pozwalają pakietom npm uniknąć
kompilacji TypeScript w runtime. Jawne wpisy runtime są wymagane: runtimeSetupEntry
wymaga setupEntry, a brak artefaktów runtimeExtensions lub runtimeSetupEntry
powoduje niepowodzenie instalacji/wykrywania zamiast cichego powrotu do źródeł. Jeśli
zainstalowany pakiet deklaruje tylko wpis źródłowy TypeScript, OpenClaw użyje
pasującego zbudowanego odpowiednika dist/*.js, gdy taki istnieje, a następnie wróci
do źródła TypeScript.
Wszystkie ścieżki wpisów muszą pozostać wewnątrz katalogu pakietu pluginu. Wpisy runtime
i wywnioskowane zbudowane odpowiedniki JavaScript nie sprawiają, że wychodząca poza katalog
ścieżka źródłowa extensions lub setupEntry staje się prawidłowa.
definePluginEntry
Import: openclaw/plugin-sdk/plugin-entry
Dla pluginów dostawców, pluginów narzędzi, pluginów hooków i wszystkiego, co nie jest kanałem wiadomości.
export default definePluginEntry({
id: "my-plugin",
name: "My Plugin",
description: "Short summary",
register(api) {
api.registerProvider({
/* ... */
});
api.registerTool({
/* ... */
});
},
});
| Pole | Typ | Wymagane | Domyślnie |
|---|---|---|---|
id |
string |
Tak | - |
name |
string |
Tak | - |
description |
string |
Tak | - |
kind |
string |
Nie | - |
configSchema |
OpenClawPluginConfigSchema | () => OpenClawPluginConfigSchema |
Nie | Schemat pustego obiektu |
register |
(api: OpenClawPluginApi) => void |
Tak | - |
idmusi odpowiadać manifestowiopenclaw.plugin.json.kindsłuży do slotów wyłącznych:"memory"lub"context-engine".configSchemamoże być funkcją do leniwej ewaluacji.- OpenClaw rozwiązuje i memoizuje ten schemat przy pierwszym dostępie, więc kosztowne konstruktory schematów uruchamiają się tylko raz.
defineChannelPluginEntry
Import: openclaw/plugin-sdk/channel-core
Opakowuje definePluginEntry okablowaniem specyficznym dla kanału. Automatycznie wywołuje
api.registerChannel({ plugin }), udostępnia opcjonalny seam metadanych CLI pomocy głównej
i bramkuje registerFull według trybu rejestracji.
export default defineChannelPluginEntry({
id: "my-channel",
name: "My Channel",
description: "Short summary",
plugin: myChannelPlugin,
setRuntime: setMyRuntime,
registerCliMetadata(api) {
api.registerCli(/* ... */);
},
registerFull(api) {
api.registerGatewayMethod(/* ... */);
},
});
| Pole | Typ | Wymagane | Domyślnie |
|---|---|---|---|
id |
string |
Tak | - |
name |
string |
Tak | - |
description |
string |
Tak | - |
plugin |
ChannelPlugin |
Tak | - |
configSchema |
OpenClawPluginConfigSchema | () => OpenClawPluginConfigSchema |
Nie | Schemat pustego obiektu |
setRuntime |
(runtime: PluginRuntime) => void |
Nie | - |
registerCliMetadata |
(api: OpenClawPluginApi) => void |
Nie | - |
registerFull |
(api: OpenClawPluginApi) => void |
Nie | - |
setRuntimejest wywoływane podczas rejestracji, aby można było przechować referencję runtime (zwykle przezcreatePluginRuntimeStore). Jest pomijane podczas przechwytywania metadanych CLI.registerCliMetadatadziała podczasapi.registrationMode === "cli-metadata",api.registrationMode === "discovery"orazapi.registrationMode === "full". Używaj go jako kanonicznego miejsca dla należących do kanału deskryptorów CLI, aby pomoc główna pozostawała nieaktywująca, snapshoty wykrywania obejmowały statyczne metadane poleceń, a normalna rejestracja poleceń CLI pozostała zgodna z pełnymi ładowaniami pluginów.- Rejestracja wykrywania jest nieaktywująca, ale nie wolna od importów. OpenClaw może
ewaluować zaufany wpis pluginu i moduł pluginu kanału, aby zbudować
snapshot, więc utrzymuj importy najwyższego poziomu bez efektów ubocznych i umieszczaj gniazda,
klientów, workery oraz usługi za ścieżkami tylko dla
"full". registerFulldziała tylko wtedy, gdyapi.registrationMode === "full". Jest pomijane podczas ładowania tylko konfiguracji.- Podobnie jak
definePluginEntry,configSchemamoże być leniwą fabryką, a OpenClaw memoizuje rozwiązany schemat przy pierwszym dostępie. - W przypadku należących do pluginu głównych poleceń CLI preferuj
api.registerCli(..., { descriptors: [...] }), gdy chcesz, aby polecenie pozostało leniwie ładowane bez znikania z głównego drzewa parsowania CLI. W przypadku pluginów kanałów preferuj rejestrowanie tych deskryptorów zregisterCliMetadata(...)i utrzymujregisterFull(...)skoncentrowane na pracy tylko runtime. - Jeśli
registerFull(...)rejestruje również metody RPC Gateway, utrzymuj je pod prefiksem specyficznym dla pluginu. Zarezerwowane przestrzenie nazw administracji rdzenia (config.*,exec.approvals.*,wizard.*,update.*) są zawsze wymuszane jakooperator.admin.
defineSetupPluginEntry
Import: openclaw/plugin-sdk/channel-core
Dla lekkiego pliku setup-entry.ts. Zwraca tylko { plugin } bez
okablowania runtime ani CLI.
export default defineSetupPluginEntry(myChannelPlugin);
OpenClaw ładuje to zamiast pełnego wpisu, gdy kanał jest wyłączony, nieskonfigurowany lub gdy włączone jest odroczone ładowanie. Zobacz Konfiguracja i ustawienia, aby dowiedzieć się, kiedy ma to znaczenie.
W praktyce łącz defineSetupPluginEntry(...) z wąskimi rodzinami pomocników konfiguracji:
openclaw/plugin-sdk/setup-runtimedla bezpiecznych runtime pomocników konfiguracji, takich jak bezpieczne dla importu adaptery łatek konfiguracji, wyjście notatek wyszukiwania,promptResolvedAllowFrom,splitSetupEntriesoraz delegowane proxy konfiguracjiopenclaw/plugin-sdk/channel-setupdla powierzchni konfiguracji instalacji opcjonalnejopenclaw/plugin-sdk/setup-toolsdla pomocników CLI/archiwum/dokumentacji konfiguracji/instalacji
Ciężkie SDK, rejestrację CLI i długotrwałe usługi runtime trzymaj w pełnym wpisie.
Dołączone kanały workspace, które rozdzielają powierzchnie konfiguracji i runtime, mogą zamiast tego użyć
defineBundledChannelSetupEntry(...) z
openclaw/plugin-sdk/channel-entry-contract. Ten kontrakt pozwala
wpisowi konfiguracji zachować bezpieczne dla konfiguracji eksporty pluginu/sekretów, jednocześnie nadal udostępniając
setter runtime:
export default defineBundledChannelSetupEntry({
importMetaUrl: import.meta.url,
plugin: {
specifier: "./channel-plugin-api.js",
exportName: "myChannelPlugin",
},
runtime: {
specifier: "./runtime-api.js",
exportName: "setMyChannelRuntime",
},
});
Używaj tego dołączonego kontraktu tylko wtedy, gdy przepływy konfiguracji naprawdę potrzebują lekkiego settera runtime przed załadowaniem pełnego wpisu kanału.
Tryb rejestracji
api.registrationMode informuje plugin, w jaki sposób został załadowany:
| Tryb | Kiedy | Co rejestrować |
|---|---|---|
"full" |
Normalny start gatewaya | Wszystko |
"discovery" |
Wykrywanie możliwości tylko do odczytu | Rejestracja kanału plus statyczne deskryptory CLI; kod wpisu może się załadować, ale pomijaj gniazda, workery, klientów i usługi |
"setup-only" |
Wyłączony/nieskonfigurowany kanał | Tylko rejestracja kanału |
"setup-runtime" |
Przepływ konfiguracji z dostępnym runtime | Rejestracja kanału plus tylko lekki runtime potrzebny przed załadowaniem pełnego wpisu |
"cli-metadata" |
Pomoc główna / przechwytywanie metadanych CLI | Tylko deskryptory CLI |
defineChannelPluginEntry obsługuje ten podział automatycznie. Jeśli używasz
definePluginEntry bezpośrednio dla kanału, samodzielnie sprawdź tryb:
register(api) {
if (
api.registrationMode === "cli-metadata" ||
api.registrationMode === "discovery" ||
api.registrationMode === "full"
) {
api.registerCli(/* ... */);
if (api.registrationMode === "cli-metadata") return;
}
api.registerChannel({ plugin: myPlugin });
if (api.registrationMode !== "full") return;
// Heavy runtime-only registrations
api.registerService(/* ... */);
}
Tryb wykrywania buduje nieaktywujący snapshot rejestru. Nadal może ewaluować wpis pluginu i obiekt pluginu kanału, aby OpenClaw mógł zarejestrować możliwości kanału oraz statyczne deskryptory CLI. Traktuj ewaluację modułu podczas wykrywania jako zaufaną, ale lekką: bez klientów sieciowych, podprocesów, listenerów, połączeń z bazą danych, workerów w tle, odczytów poświadczeń ani innych aktywnych efektów ubocznych runtime na najwyższym poziomie.
Traktuj "setup-runtime" jako okno, w którym powierzchnie startowe tylko konfiguracji muszą
istnieć bez ponownego wchodzenia w pełny runtime dołączonego kanału. Dobrymi dopasowaniami są
rejestracja kanału, bezpieczne dla konfiguracji trasy HTTP, bezpieczne dla konfiguracji metody gatewaya oraz
delegowane pomocniki konfiguracji. Ciężkie usługi w tle, rejestratory CLI i
bootstrapy SDK dostawców/klientów nadal należą do "full".
W przypadku rejestratorów CLI konkretnie:
- używaj
descriptors, gdy rejestrator posiada jedno lub więcej głównych poleceń i chcesz, aby OpenClaw leniwie ładował rzeczywisty moduł CLI przy pierwszym wywołaniu - upewnij się, że te deskryptory obejmują każdy rdzeń polecenia najwyższego poziomu udostępniany przez rejestrator
- ogranicz nazwy poleceń deskryptorów do liter, cyfr, dywizu i podkreślenia, zaczynając od litery lub cyfry; OpenClaw odrzuca nazwy deskryptorów spoza tego kształtu i usuwa terminalowe sekwencje sterujące z opisów przed renderowaniem pomocy
- używaj samego
commandstylko dla ścieżek zgodności ładowanych zachłannie
Kształty pluginów
OpenClaw klasyfikuje załadowane pluginy według sposobu ich rejestracji:
| Kształt | Opis |
|---|---|
| plain-capability | Jeden typ możliwości (np. tylko dostawca) |
| hybrid-capability | Wiele typów możliwości (np. dostawca + mowa) |
| hook-only | Tylko hooki, bez możliwości |
| non-capability | Narzędzia/polecenia/usługi, ale bez możliwości |
Użyj openclaw plugins inspect <id>, aby zobaczyć kształt pluginu.
Powiązane
- Omówienie SDK - API rejestracji i odniesienie do podścieżek
- Pomocniki środowiska wykonawczego -
api.runtimeicreatePluginRuntimeStore - Konfiguracja i ustawienia - manifest, wpis konfiguracji, odroczone ładowanie
- Pluginy kanałów - budowanie obiektu
ChannelPlugin - Pluginy dostawców - rejestracja dostawcy i hooki