Przejdź do głównej treści

Tworzenie wtyczek

Wtyczki rozszerzają OpenClaw o nowe możliwości: kanały, providerów modeli, mowę, transkrypcję w czasie rzeczywistym, głos w czasie rzeczywistym, rozumienie mediów, generowanie obrazów, generowanie wideo, pobieranie treści z internetu, wyszukiwanie w internecie, narzędzia agenta lub dowolną kombinację tych elementów. Nie musisz dodawać swojej wtyczki do repozytorium OpenClaw. Opublikuj ją w ClawHub lub npm, a użytkownicy zainstalują ją za pomocą openclaw plugins install <package-name>. OpenClaw najpierw próbuje użyć ClawHub, a następnie automatycznie przechodzi do npm.

Wymagania wstępne

  • Node >= 22 i menedżer pakietów (npm lub pnpm)
  • Znajomość TypeScript (ESM)
  • Dla wtyczek w repozytorium: sklonowane repozytorium i wykonane pnpm install

Jaki rodzaj wtyczki?

Wtyczka kanału

Połącz OpenClaw z platformą komunikacyjną (Discord, IRC itp.)

Wtyczka providera

Dodaj providera modeli (LLM, proxy lub niestandardowy endpoint)

Wtyczka narzędzia / hooka

Rejestruj narzędzia agenta, hooki zdarzeń lub usługi — czytaj dalej poniżej
Jeśli wtyczka kanału jest opcjonalna i może nie być zainstalowana podczas uruchamiania onboardingu/konfiguracji, użyj createOptionalChannelSetupSurface(...) z openclaw/plugin-sdk/channel-setup. Tworzy ona parę adaptera konfiguracji i kreatora, która informuje o wymaganiu instalacji i bezpiecznie blokuje rzeczywiste zapisy konfiguracji, dopóki wtyczka nie zostanie zainstalowana.

Szybki start: wtyczka narzędzia

Ten przewodnik tworzy minimalną wtyczkę, która rejestruje narzędzie agenta. Wtyczki kanałów i providerów mają osobne przewodniki, do których prowadzą linki powyżej.
1

Utwórz pakiet i manifest

{
  "name": "@myorg/openclaw-my-plugin",
  "version": "1.0.0",
  "type": "module",
  "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"
    }
  }
}
Każda wtyczka potrzebuje manifestu, nawet jeśli nie ma konfiguracji. Zobacz Manifest, aby poznać pełny schemat. Kanoniczne fragmenty publikowania do ClawHub znajdują się w docs/snippets/plugin-publish/.
2

Napisz punkt wejścia

// index.ts
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
import { Type } from "@sinclair/typebox";

export default definePluginEntry({
  id: "my-plugin",
  name: "My Plugin",
  description: "Adds a custom tool to OpenClaw",
  register(api) {
    api.registerTool({
      name: "my_tool",
      description: "Do a thing",
      parameters: Type.Object({ input: Type.String() }),
      async execute(_id, params) {
        return { content: [{ type: "text", text: `Got: ${params.input}` }] };
      },
    });
  },
});
definePluginEntry służy do wtyczek innych niż kanały. Dla kanałów użyj defineChannelPluginEntry — zobacz Wtyczki kanałów. Pełne opcje punktów wejścia znajdziesz w Punktach wejścia.
3

Przetestuj i opublikuj

Wtyczki zewnętrzne: zweryfikuj i opublikuj za pomocą ClawHub, a następnie zainstaluj:
clawhub package publish your-org/your-plugin --dry-run
clawhub package publish your-org/your-plugin
openclaw plugins install clawhub:@myorg/openclaw-my-plugin
OpenClaw sprawdza też ClawHub przed npm dla zwykłych specyfikacji pakietów, takich jak @myorg/openclaw-my-plugin.Wtyczki w repozytorium: umieść je w drzewie workspace wtyczek dołączonych do projektu — zostaną wykryte automatycznie.
pnpm test -- <bundled-plugin-root>/my-plugin/

Możliwości wtyczek

Pojedyncza wtyczka może zarejestrować dowolną liczbę możliwości za pomocą obiektu api:
MożliwośćMetoda rejestracjiSzczegółowy przewodnik
Inferencja tekstu (LLM)api.registerProvider(...)Wtyczki providerów
Backend inferencji CLIapi.registerCliBackend(...)Backendy CLI
Kanał / komunikacjaapi.registerChannel(...)Wtyczki kanałów
Mowa (TTS/STT)api.registerSpeechProvider(...)Wtyczki providerów
Transkrypcja w czasie rzeczywistymapi.registerRealtimeTranscriptionProvider(...)Wtyczki providerów
Głos w czasie rzeczywistymapi.registerRealtimeVoiceProvider(...)Wtyczki providerów
Rozumienie mediówapi.registerMediaUnderstandingProvider(...)Wtyczki providerów
Generowanie obrazówapi.registerImageGenerationProvider(...)Wtyczki providerów
Generowanie wideoapi.registerVideoGenerationProvider(...)Wtyczki providerów
Pobieranie treści z internetuapi.registerWebFetchProvider(...)Wtyczki providerów
Wyszukiwanie w internecieapi.registerWebSearchProvider(...)Wtyczki providerów
Narzędzia agentaapi.registerTool(...)Poniżej
Polecenia niestandardoweapi.registerCommand(...)Punkty wejścia
Hooki zdarzeńapi.registerHook(...)Punkty wejścia
Trasy HTTPapi.registerHttpRoute(...)Elementy wewnętrzne
Podpolecenia CLIapi.registerCli(...)Punkty wejścia
Pełne API rejestracji znajdziesz w Przeglądzie SDK. Jeśli Twoja wtyczka rejestruje niestandardowe metody gateway RPC, zachowaj dla nich prefiks specyficzny dla wtyczki. Podstawowe przestrzenie nazw administracyjnych (config.*, exec.approvals.*, wizard.*, update.*) pozostają zarezerwowane i zawsze są rozwiązywane do operator.admin, nawet jeśli wtyczka prosi o węższy zakres. Semantyka ochrony hooków, o której warto pamiętać:
  • before_tool_call: { block: true } jest terminalne i zatrzymuje handlery o niższym priorytecie.
  • before_tool_call: { block: false } jest traktowane jak brak decyzji.
  • before_tool_call: { requireApproval: true } wstrzymuje wykonanie agenta i prosi użytkownika o zatwierdzenie przez nakładkę zatwierdzania wykonania, przyciski Telegram, interakcje Discord lub polecenie /approve na dowolnym kanale.
  • before_install: { block: true } jest terminalne i zatrzymuje handlery o niższym priorytecie.
  • before_install: { block: false } jest traktowane jak brak decyzji.
  • message_sending: { cancel: true } jest terminalne i zatrzymuje handlery o niższym priorytecie.
  • message_sending: { cancel: false } jest traktowane jak brak decyzji.
Polecenie /approve obsługuje zarówno zatwierdzenia wykonania, jak i zatwierdzenia wtyczek z ograniczonym fallbackiem: gdy identyfikator zatwierdzenia wykonania nie zostanie znaleziony, OpenClaw ponawia próbę z tym samym identyfikatorem w zatwierdzeniach wtyczek. Przekazywanie zatwierdzeń wtyczek można konfigurować niezależnie przez approvals.plugin w konfiguracji. Jeśli niestandardowa logika zatwierdzania musi wykrywać ten sam przypadek ograniczonego fallbacku, użyj isApprovalNotFoundError z openclaw/plugin-sdk/error-runtime zamiast ręcznie dopasowywać ciągi dotyczące wygaśnięcia zatwierdzenia. Szczegóły znajdziesz w sekcji Semantyka decyzji hooków w przeglądzie SDK.

Rejestrowanie narzędzi agenta

Narzędzia to typowane funkcje, które może wywołać LLM. Mogą być wymagane (zawsze dostępne) albo opcjonalne (wymagają zgody użytkownika):
register(api) {
  // Required tool — always available
  api.registerTool({
    name: "my_tool",
    description: "Do a thing",
    parameters: Type.Object({ input: Type.String() }),
    async execute(_id, params) {
      return { content: [{ type: "text", text: params.input }] };
    },
  });

  // Optional tool — user must add to allowlist
  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 },
  );
}
Użytkownicy włączają opcjonalne narzędzia w konfiguracji:
{
  tools: { allow: ["workflow_tool"] },
}
  • Nazwy narzędzi nie mogą kolidować z podstawowymi narzędziami (konflikty są pomijane)
  • Użyj optional: true dla narzędzi z efektami ubocznymi lub dodatkowymi wymaganiami binarnymi
  • Użytkownicy mogą włączyć wszystkie narzędzia z wtyczki, dodając identyfikator wtyczki do tools.allow

Konwencje importu

Zawsze importuj z ukierunkowanych ścieżek openclaw/plugin-sdk/<subpath>:
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";

// Wrong: monolithic root (deprecated, will be removed)
import { ... } from "openclaw/plugin-sdk";
Pełne odniesienie do ścieżek podrzędnych znajdziesz w Przeglądzie SDK. W obrębie swojej wtyczki używaj lokalnych plików barrel (api.ts, runtime-api.ts) do importów wewnętrznych — nigdy nie importuj własnej wtyczki przez jej ścieżkę SDK. W przypadku wtyczek providerów trzymaj helpery specyficzne dla providera w tych barrelach w katalogu głównym pakietu, chyba że dany interfejs jest naprawdę ogólny. Obecne przykłady dołączone do projektu:
  • Anthropic: wrappery strumieni Claude oraz helpery service_tier / beta
  • OpenAI: kreatory providerów, helpery modeli domyślnych, providery realtime
  • OpenRouter: kreator providera oraz helpery onboardingu/konfiguracji
Jeśli helper jest przydatny tylko wewnątrz jednego dołączonego pakietu providera, pozostaw go na tym interfejsie w katalogu głównym pakietu zamiast przenosić go do openclaw/plugin-sdk/*. Niektóre generowane interfejsy helperów openclaw/plugin-sdk/<bundled-id> nadal istnieją do utrzymania dołączonych wtyczek i zgodności, na przykład plugin-sdk/feishu-setup lub plugin-sdk/zalo-setup. Traktuj je jako powierzchnie zarezerwowane, a nie jako domyślny wzorzec dla nowych wtyczek zewnętrznych.

Lista kontrolna przed zgłoszeniem

package.json ma poprawne metadane openclaw
Manifest openclaw.plugin.json jest obecny i prawidłowy
Punkt wejścia używa defineChannelPluginEntry lub definePluginEntry
Wszystkie importy używają ukierunkowanych ścieżek plugin-sdk/<subpath>
Importy wewnętrzne używają lokalnych modułów, a nie samoodwołań przez SDK
Testy przechodzą (pnpm test -- <bundled-plugin-root>/my-plugin/)
pnpm check przechodzi (dla wtyczek w repozytorium)

Testowanie wydań beta

  1. Obserwuj tagi wydań GitHub w openclaw/openclaw i subskrybuj przez Watch > Releases. Tagi beta mają postać v2026.3.N-beta.1. Możesz też włączyć powiadomienia dla oficjalnego konta OpenClaw na X @openclaw, aby otrzymywać informacje o wydaniach.
  2. Przetestuj swoją wtyczkę z tagiem beta, gdy tylko się pojawi. Okno przed wydaniem stabilnym zwykle trwa tylko kilka godzin.
  3. Po testach napisz w wątku swojej wtyczki na kanale Discord plugin-forum, wpisując all good albo opisując, co się zepsuło. Jeśli nie masz jeszcze wątku, utwórz go.
  4. Jeśli coś się zepsuje, otwórz lub zaktualizuj issue o tytule Beta blocker: <plugin-name> - <summary> i nadaj mu etykietę beta-blocker. Umieść link do issue w swoim wątku.
  5. Otwórz PR do main o tytule fix(<plugin-id>): beta blocker - <summary> i dodaj link do issue zarówno w PR, jak i w swoim wątku na Discordzie. Współtwórcy nie mogą nadawać etykiet PR-om, więc tytuł jest sygnałem po stronie PR dla maintainerów i automatyzacji. Blokery z PR są scalane; blokery bez PR mogą mimo to zostać wydane. Maintainerzy obserwują te wątki podczas testów beta.
  6. Cisza oznacza zielone światło. Jeśli przegapisz okno, poprawka najpewniej trafi do następnego cyklu.

Następne kroki

Wtyczki kanałów

Zbuduj wtyczkę kanału komunikacyjnego

Wtyczki providerów

Zbuduj wtyczkę providera modeli

Przegląd SDK

Mapa importów i dokumentacja API rejestracji

Helpery runtime

TTS, wyszukiwanie, subagent przez api.runtime

Testowanie

Narzędzia i wzorce testowe

Manifest wtyczki

Pełna dokumentacja schematu manifestu

Powiązane