defineToolPlugin tworzy plugin, który dodaje wyłącznie narzędzia wywoływane przez agenta: bez
kanału, dostawcy modeli, haka, usługi ani zaplecza konfiguracji. Generuje
metadane manifestu potrzebne OpenClaw do wykrywania narzędzi bez ładowania
kodu środowiska uruchomieniowego pluginu.
W przypadku pluginów dostawców, kanałów, haków, usług lub pluginów o mieszanych możliwościach należy zamiast tego zacząć od
Tworzenie pluginów, Pluginy kanałów
lub Pluginy dostawców.
Wymagania
- Node 22.22.3+, Node 24.15+ lub Node 25.9+.
- Pakiet wynikowy TypeScript ESM.
typeboxwdependencies(nie tylkodevDependencies— wygenerowany plugin importuje go w czasie działania).openclaw >=2026.5.17, pierwsza wersja eksportującaopenclaw/plugin-sdk/tool-plugin.- Katalog główny pakietu zawierający
dist/,openclaw.plugin.jsonorazpackage.json.
Szybki start
plugins init tworzy szkielet:
npm run plugin:build uruchamia npm run build (tsc), a następnie
openclaw plugins build --entry ./dist/index.js. npm run plugin:validate
ponownie wykonuje kompilację i uruchamia openclaw plugins validate --entry ./dist/index.js.
Pomyślna walidacja wyświetla:
openclaw plugins init <id>:
Tworzenie narzędzia
defineToolPlugin przyjmuje tożsamość pluginu, opcjonalny schemat konfiguracji oraz
statyczną listę narzędzi. Typy parametrów i konfiguracji są wywnioskowywane ze
schematów TypeBox.
Narzędzia opcjonalne i fabryczne
Ustawoptional: true, gdy użytkownicy powinni jawnie dodać narzędzie do listy dozwolonych, zanim
zostanie ono wysłane do modelu. openclaw plugins build zapisuje odpowiedni
wpis manifestu toolMetadata.<tool>.optional, dzięki czemu OpenClaw może rozpoznać, że
narzędzie jest opcjonalne, bez ładowania kodu środowiska uruchomieniowego pluginu.
factory, gdy narzędzie wymaga kontekstu narzędzia środowiska uruchomieniowego, zanim będzie mogło zostać
utworzone — aby zrezygnować z niego dla konkretnego uruchomienia, sprawdzić stan piaskownicy lub powiązać
funkcje pomocnicze środowiska uruchomieniowego. Metadane pozostają statyczne, mimo że konkretne narzędzie jest tworzone
w czasie działania.
definePluginEntry,
gdy plugin dynamicznie oblicza nazwy narzędzi lub łączy narzędzia
z hakami, usługami, dostawcami albo poleceniami.
Wartości zwracane
defineToolPlugin opakowuje zwykłe wartości zwracane w format wyniku narzędzia
OpenClaw:
- Zwróć ciąg znaków, gdy model powinien zobaczyć dokładnie ten tekst.
- Zwróć wartość zgodną z JSON, gdy model powinien zobaczyć sformatowany JSON,
a OpenClaw ma zachować oryginalną wartość w
details.
AgentToolResult lub gdy ma zostać ponownie użyta
istniejąca implementacja api.registerTool.
Konfiguracja
configSchema jest opcjonalny. Jeśli zostanie pominięty, OpenClaw zastosuje ścisły schemat pustego obiektu;
wygenerowany manifest nadal będzie zawierał configSchema.
configSchema typ drugiego argumentu execute jest z niego wywnioskowywany:
Wygenerowane metadane
OpenClaw musi odczytać manifest pluginu przed zaimportowaniem kodu jego środowiska uruchomieniowego.defineToolPlugin udostępnia w tym celu statyczne metadane, a
openclaw plugins build zapisuje je w pakiecie. Generator należy uruchomić ponownie po
zmianie identyfikatora, nazwy, opisu, schematu konfiguracji, aktywacji lub nazw
narzędzi pluginu:
contracts.tools jest istotnym kontraktem wykrywania: informuje OpenClaw, który
plugin jest właścicielem każdego narzędzia, bez ładowania środowiska uruchomieniowego wszystkich zainstalowanych pluginów. Nieaktualny
manifest może spowodować brak narzędzia w wynikach wykrywania lub przypisanie błędu
rejestracji niewłaściwemu pluginowi.
Metadane pakietu
openclaw plugins build dostosowuje również package.json do wybranego punktu wejścia
środowiska uruchomieniowego:
./dist/index.js), a nie punkt wejścia kodu źródłowego TypeScript.
Punkty wejścia kodu źródłowego działają tylko podczas programowania lokalnie w obszarze roboczym.
Walidacja w CI
plugins build --check kończy się niepowodzeniem bez przepisywania plików, gdy wygenerowane metadane
są nieaktualne:
plugins validate sprawdza, czy:
openclaw.plugin.jsonistnieje i przechodzi standardowe ładowanie manifestu.- Bieżący punkt wejścia eksportuje metadane
defineToolPlugin. - Pola wygenerowanego manifestu odpowiadają metadanym punktu wejścia.
contracts.toolsodpowiada zadeklarowanym nazwom narzędzi.package.jsonwskazuje za pomocąopenclaw.extensionswybrany punkt wejścia środowiska uruchomieniowego.
Instalacja i lokalna inspekcja
W osobnym repozytorium roboczym OpenClaw lub za pomocą zainstalowanego CLI zainstaluj pakiet ze ścieżki:Publikowanie
Gdy pakiet będzie gotowy, opublikuj go za pośrednictwem ClawHub.clawhub package publish
przyjmuje źródło: folder lokalny, repozytorium GitHub (owner/repo[@ref]) lub
adres URL archiwum tar.
Rozwiązywanie problemów
plugin entry not found: ./dist/index.js
Wybrany plik punktu wejścia nie istnieje. Uruchom npm run build, a następnie ponownie
openclaw plugins build --entry ./dist/index.js lub
openclaw plugins validate --entry ./dist/index.js.
plugin entry does not expose defineToolPlugin metadata
Punkt wejścia nie wyeksportował wartości utworzonej przez defineToolPlugin. Upewnij się, że
domyślnym eksportem modułu jest wynik defineToolPlugin(...), lub przekaż
właściwy punkt wejścia za pomocą --entry.
openclaw.plugin.json generated metadata is stale
Manifest nie odpowiada już metadanym punktu wejścia. Uruchom:
openclaw.plugin.json, jak i package.json.
package.json openclaw.extensions must include ./dist/index.js
Metadane pakietu wskazują inny punkt wejścia środowiska uruchomieniowego. Uruchom
openclaw plugins build --entry ./dist/index.js, aby generator dostosował
metadane pakietu do punktu wejścia, który ma zostać dostarczony.
Cannot find package 'typebox'
Skompilowany plugin importuje typebox w czasie działania. Pozostaw go w dependencies,
zainstaluj ponownie, ponownie skompiluj i uruchom walidację.
Narzędzie nie pojawia się po instalacji
Sprawdź kolejno:openclaw plugins inspect <plugin-id> --runtimeopenclaw plugins validate --root <plugin-root> --entry ./dist/index.jsopenclaw.plugin.jsonmacontracts.toolsz oczekiwanymi nazwami narzędzi.package.jsonmaopenclaw.extensions: ["./dist/index.js"].- Gateway został ponownie uruchomiony lub przeładowany po zainstalowaniu pluginu.