Building plugins

Tworzenie pluginów

Pluginy rozszerzają OpenClaw bez zmieniania rdzenia. Plugin może dodać kanał komunikacyjny, dostawcę modelu, lokalny backend CLI, narzędzie agenta, hook, dostawcę multimediów lub inną funkcję należącą do pluginu.

Nie trzeba dodawać zewnętrznego pluginu do repozytorium OpenClaw. Należy opublikować pakiet w ClawHub, a użytkownicy zainstalują go za pomocą:

bash
openclaw plugins install clawhub:<package-name>

Podczas przejścia związanego z uruchomieniem specyfikacje pakietów bez prefiksu nadal są instalowane z npm. Należy użyć prefiksu clawhub:, aby skorzystać z rozwiązywania przez ClawHub.

Wymagania

  • Node 22.22.3+, Node 24.15+ lub Node 25.9+ oraz npm albo pnpm.
  • Moduły TypeScript ESM.
  • W przypadku pracy nad dołączonym do repozytorium pluginem należy sklonować repozytorium i uruchomić pnpm install. Rozwój pluginów w kopii kodu źródłowego wymaga wyłącznie pnpm, ponieważ OpenClaw wykrywa dołączone pluginy w pakietach przestrzeni roboczej extensions/*.

Wybór postaci pluginu

Szybki start

Minimalny plugin narzędzi można utworzyć, rejestrując jedno wymagane narzędzie agenta. Jest to najkrótsza użyteczna postać pluginu, obejmująca pakiet, manifest, punkt wejścia i lokalną weryfikację.

  • Utworzenie metadanych pakietu

    package.json
    {"name": "@myorg/openclaw-my-plugin","version": "1.0.0","type": "module","dependencies": {"typebox": "1.1.39"},"peerDependencies": {"openclaw": ">=2026.3.24-beta.2"},"openclaw": {"extensions": ["./index.ts"],"compat": {"pluginApi": ">=2026.3.24-beta.2","minGatewayVersion": "2026.3.24-beta.2"},"build": {"openclawVersion": "2026.3.24-beta.2","pluginSdkVersion": "2026.3.24-beta.2"}}}
    openclaw.plugin.json
    {"id": "my-plugin","name": "My Plugin","description": "Adds a custom tool to OpenClaw","contracts": {"tools": ["my_tool"]},"activation": {"onStartup": true},"configSchema": {"type": "object","additionalProperties": false}}

    Opublikowane zewnętrzne pluginy powinny wskazywać jako wpisy środowiska uruchomieniowego skompilowane pliki JavaScript. Pełny kontrakt punktu wejścia opisano w sekcji Punkty wejścia SDK.

    Każdy plugin wymaga manifestu, nawet jeśli nie ma konfiguracji. Narzędzia środowiska uruchomieniowego muszą znajdować się w contracts.tools, aby OpenClaw mógł wykryć ich właściciela bez zachłannego ładowania środowiska uruchomieniowego każdego pluginu. Wartość activation.onStartup należy ustawić świadomie; ten przykład ładuje się podczas uruchamiania Gateway.

    Powierzchnie pluginów zaufane przez hosta również podlegają kontroli manifestu i wymagają jawnej deklaracji w przypadku zainstalowanych pluginów: api.registerAgentToolResultMiddleware(...) wymaga umieszczenia każdego docelowego środowiska uruchomieniowego w contracts.agentToolResultMiddleware, a api.registerTrustedToolPolicy(...) wymaga każdego identyfikatora zasad w contracts.trustedToolPolicies. Deklaracje te zapewniają zgodność między kontrolą podczas instalacji a rejestracją w środowisku uruchomieniowym.

    Wszystkie pola manifestu opisano w sekcji Manifest pluginu.

  • Rejestracja narzędzia

    index.ts
    import { Type } from "typebox";import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry"; export default definePluginEntry({  id: "my-plugin",  name: "My Plugin",  description: "Adds a custom tool to OpenClaw",  register(api) {    api.registerTool({      name: "my_tool",      description: "Echo one input value",      parameters: Type.Object({ input: Type.String() }),      async execute(_id, params) {        return {          content: [{ type: "text", text: `Got: ${params.input}` }],        };      },    });  },});

    W przypadku pluginów innych niż kanałowe należy użyć definePluginEntry. Pluginy kanałowe używają zamiast tego defineChannelPluginEntry z openclaw/plugin-sdk/core.

  • Testowanie środowiska uruchomieniowego

    W przypadku zainstalowanego lub zewnętrznego pluginu należy sprawdzić załadowane środowisko uruchomieniowe:

    bash
    openclaw plugins inspect my-plugin --runtime --json

    Jeśli plugin rejestruje polecenie CLI, należy również je uruchomić i potwierdzić wynik, na przykład openclaw demo-plugin ping.

    W przypadku pluginu dołączonego do tego repozytorium OpenClaw wykrywa pakiety pluginów w kopii kodu źródłowego w przestrzeni roboczej extensions/*. Należy uruchomić najbliższy test ukierunkowany:

    bash
    pnpm test extensions/my-plugin/pnpm check
  • Testowanie instalacji pakietu

    Przed opublikowaniem pluginu gotowego do spakowania należy przetestować tę samą postać instalacji, którą otrzymają użytkownicy. Najpierw należy dodać etap kompilacji, skierować wpisy środowiska uruchomieniowego, takie jak openclaw.extensions, na skompilowany JavaScript, na przykład ./dist/index.js, i upewnić się, że npm pack zawiera wynik dist/. Wpisy źródłowe TypeScript są przeznaczone wyłącznie dla kopii kodu źródłowego i lokalnych ścieżek programistycznych.

    Następnie należy spakować plugin i zainstalować archiwum tar za pomocą npm-pack::

    bash
    npm pack --pack-destination /tmpopenclaw plugins install npm-pack:/tmp/<plugin-package>.tgz --forceopenclaw plugins inspect my-plugin --runtime --json

    npm-pack: używa zarządzanego przez OpenClaw projektu npm dla każdego pluginu, dzięki czemu wykrywa błędy zależności środowiska uruchomieniowego, które testowanie kopii kodu źródłowego może ukryć. Potwierdza postać pakietu i zależności, a nie oficjalny status zaufania powiązany z katalogiem. Importy środowiska uruchomieniowego muszą znajdować się w dependencies lub optionalDependencies; zależności pozostawione wyłącznie w devDependencies nie zostaną zainstalowane w zarządzanym projekcie środowiska uruchomieniowego.

    Nie należy używać instalacji z surowego archiwum ani ścieżki jako ostatecznego potwierdzenia oficjalnego lub uprzywilejowanego działania pluginu. Surowe źródła są przydatne podczas lokalnego debugowania, ale nie potwierdzają tej samej ścieżki zależności co instalacje z npm lub ClawHub. Jeśli plugin korzysta z zaufanego statusu oficjalnego pluginu, należy dodać drugą weryfikację za pomocą oficjalnej instalacji wspieranej przez katalog lub ścieżki opublikowanego pakietu, która rejestruje oficjalny status zaufania. Szczegóły dotyczące katalogu głównego instalacji i własności zależności opisano w sekcji Rozwiązywanie zależności pluginów.

  • Publikowanie

    Przed publikacją należy zweryfikować pakiet:

    bash
    clawhub package publish your-org/your-plugin --dry-runclawhub package publish your-org/your-plugin

    Kanoniczne fragmenty pakietów ClawHub znajdują się w docs/snippets/plugin-publish/.

  • Instalacja

    Opublikowany pakiet należy zainstalować za pośrednictwem ClawHub:

    bash
    openclaw plugins install clawhub:your-org/your-plugin
  • Rejestrowanie narzędzi

    Narzędzia mogą być wymagane lub opcjonalne. Wymagane narzędzia są zawsze dostępne, gdy plugin jest włączony. Opcjonalne narzędzia wymagają jawnej zgody użytkownika, zanim OpenClaw załaduje środowisko uruchomieniowe pluginu będącego ich właścicielem.

    Fabryki narzędzi otrzymują zaufany kontekst środowiska uruchomieniowego, w tym deliveryContext, nativeChannelId dla aktywnej konwersacji na platformie, jeśli jest dostępna, oraz requesterSenderId.

    typescript
    register(api) {  api.registerTool(    {      name: "workflow_tool",      description: "Run a workflow",      parameters: Type.Object({ pipeline: Type.String() }),      async execute(_id, params) {        return { content: [{ type: "text", text: params.pipeline }] };      },    },    { optional: true },  );}

    Każde narzędzie zarejestrowane za pomocą api.registerTool(...) musi być również zadeklarowane w manifeście pluginu:

    json
    {  "contracts": {    "tools": ["workflow_tool"]  },  "toolMetadata": {    "workflow_tool": {      "optional": true    }  }}

    Użytkownicy włączają je za pomocą tools.allow:

    json5
    {  tools: { allow: ["workflow_tool"] }, // or ["my-plugin"] for every tool from one plugin}

    Narzędzia opcjonalne określają, czy narzędzie jest udostępniane modelowi. Należy użyć żądań uprawnień pluginu, gdy narzędzie lub hook powinien poprosić o zatwierdzenie po wybraniu go przez model, ale przed wykonaniem działania.

    Narzędzi opcjonalnych należy używać w przypadku skutków ubocznych, nietypowych plików binarnych lub funkcji, które nie powinny być domyślnie udostępniane. Nazwy narzędzi nie mogą kolidować z nazwami narzędzi rdzenia; konflikty są pomijane i zgłaszane w diagnostyce pluginów. Nieprawidłowe rejestracje są pomijane i zgłaszane w ten sam sposób: brak niepustej wartości name, wartość execute, która nie jest funkcją, lub deskryptor narzędzia bez obiektu parameters.

    Fabryki narzędzi otrzymują obiekt kontekstu dostarczany przez środowisko uruchomieniowe. Należy użyć ctx.activeModel, gdy narzędzie musi rejestrować, wyświetlać lub dostosowywać się do aktywnego modelu dla bieżącej tury; może on zawierać provider, modelId i modelRef. Należy traktować go jako informacyjne metadane środowiska uruchomieniowego, a nie granicę bezpieczeństwa chroniącą przed lokalnym operatorem, kodem zainstalowanego pluginu lub zmodyfikowanym środowiskiem uruchomieniowym OpenClaw. Wrażliwe narzędzia lokalne powinny nadal wymagać jawnego włączenia przez plugin lub operatora i odmawiać działania, gdy metadane aktywnego modelu są niedostępne lub nieodpowiednie.

    Manifest deklaruje własność i wykrywanie; wykonanie nadal wywołuje aktywną zarejestrowaną implementację narzędzia. Należy zachować zgodność toolMetadata.<tool>.optional: true z api.registerTool(..., { optional: true }), aby OpenClaw mógł uniknąć ładowania środowiska uruchomieniowego tego pluginu, dopóki narzędzie nie zostanie jawnie dodane do listy dozwolonych.

    Konwencje importowania

    Należy importować z wyspecjalizowanych podścieżek SDK:

    typescript
      

    Nie należy importować z przestarzałego głównego pliku zbiorczego:

    typescript
     

    W pakiecie pluginu należy używać lokalnych plików zbiorczych, takich jak api.ts i runtime-api.ts, do importów wewnętrznych. Nie należy importować własnego pluginu za pośrednictwem ścieżki SDK. Pomocnicze funkcje specyficzne dla dostawcy powinny pozostać w jego pakiecie, chyba że punkt integracji jest rzeczywiście ogólny.

    Niestandardowe metody RPC Gateway są zaawansowanym punktem wejścia. Należy umieścić je pod prefiksem właściwym dla pluginu; administracyjne przestrzenie nazw rdzenia, takie jak config.*, exec.approvals.*, operator.admin.*, wizard.* i update.*, pozostają zastrzeżone i są rozwiązywane do operator.admin. Most openclaw/plugin-sdk/gateway-method-runtime jest zastrzeżony dla tras HTTP pluginu, które deklarują contracts.gatewayMethodDispatch: ["authenticated-request"].

    Pełną mapę importów zawiera Omówienie SDK pluginów.

    Lista kontrolna przed przesłaniem

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s Plik package.json zawiera prawidłowe metadane openclaw OPENCLAW_DOCS_MARKER:calloutClose:

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s Manifest openclaw.plugin.json jest obecny i prawidłowy OPENCLAW_DOCS_MARKER:calloutClose:

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s Punkt wejścia używa defineChannelPluginEntry lub definePluginEntry OPENCLAW_DOCS_MARKER:calloutClose:

    OPENCLAW_DOCS_MARKER:calloutOpen:Q2hlY2s Wszystkie importy używają wyspecjalizowanych ścieżek plugin-sdk/<subpath> OPENCLAW_DOCS_MARKER:calloutClose:

    Was this useful?
    On this page

    On this page