chore(i18n): refresh pl translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-04-15 19:51:10 +00:00
parent d40312a564
commit 14c98fc84d
9 changed files with 1742 additions and 1532 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +1,14 @@
---
read_when:
- Edytowanie tekstu promptu systemowego, listy narzędzi lub sekcji czasu/Heartbeat
- Zmiana zachowania bootstrapu obszaru roboczego lub wstrzykiwania Skills
- Zmiana zachowania bootstrapu przestrzeni roboczej lub wstrzykiwania Skills
summary: Co zawiera prompt systemowy OpenClaw i jak jest składany
title: Prompt systemowy
x-i18n:
generated_at: "2026-04-12T09:33:35Z"
generated_at: "2026-04-15T19:41:38Z"
model: gpt-5.4
provider: openai
source_hash: 057f01aac51f7737b5223f61f5d55e552d9011232aebb130426e269d8f6c257f
source_hash: c740e4646bc4980567338237bfb55126af0df72499ca00a48e4848d9a3608ab4
source_path: concepts/system-prompt.md
workflow: 15
---
@ -20,85 +20,84 @@ OpenClaw tworzy niestandardowy prompt systemowy dla każdego uruchomienia agenta
Prompt jest składany przez OpenClaw i wstrzykiwany do każdego uruchomienia agenta.
Pluginy dostawców mogą wnosić wskazówki do promptu uwzględniające cache bez zastępowania
całego promptu należącego do OpenClaw. Runtime dostawcy może:
pełnego promptu należącego do OpenClaw. Runtime dostawcy może:
- zastąpić niewielki zestaw nazwanych sekcji rdzeniowych (`interaction_style`,
- zastąpić mały zestaw nazwanych sekcji rdzeniowych (`interaction_style`,
`tool_call_style`, `execution_bias`)
- wstrzyknąć **stabilny prefiks** powyżej granicy cache promptu
- wstrzyknąć **dynamiczny sufiks** poniżej granicy cache promptu
Używaj wkładów należących do dostawcy do strojenia specyficznego dla rodziny modeli. Zachowaj starszą
mutację promptu `before_prompt_build` dla kompatybilności lub rzeczywiście globalnych zmian promptu,
a nie dla zwykłego zachowania dostawcy.
Używaj wkładów należących do dostawcy do dostrajania specyficznego dla rodziny modeli. Zachowaj starszą
mutację promptu `before_prompt_build` dla zgodności lub rzeczywiście globalnych zmian promptu, a nie dla zwykłego zachowania dostawcy.
## Struktura
Prompt jest celowo zwięzły i używa stałych sekcji:
- **Narzędzia**: przypomnienie o źródle prawdy dla narzędzi strukturalnych oraz wskazówki dotyczące użycia narzędzi w runtime.
- **Bezpieczeństwo**: krótkie przypomnienie o zabezpieczeniach, aby unikać zachowań dążących do zdobycia władzy lub obchodzenia nadzoru.
- **Skills** (gdy dostępne): informuje model, jak ładować instrukcje Skills na żądanie.
- **Samodzielna aktualizacja OpenClaw**: jak bezpiecznie sprawdzać konfigurację za pomocą
`config.schema.lookup`, poprawiać konfigurację za pomocą `config.patch`, zastępować całą
konfigurację za pomocą `config.apply` oraz uruchamiać `update.run` wyłącznie na wyraźne żądanie
użytkownika. Narzędzie `gateway`, dostępne tylko dla właściciela, również odmawia przepisywania
- **Tooling**: przypomnienie o źródle prawdy dla narzędzi strukturalnych oraz wskazówki dotyczące użycia narzędzi w runtime.
- **Safety**: krótkie przypomnienie o zabezpieczeniach, aby unikać zachowań dążących do przejęcia kontroli lub omijania nadzoru.
- **Skills** (gdy dostępne): informuje model, jak na żądanie ładować instrukcje umiejętności.
- **OpenClaw Self-Update**: jak bezpiecznie sprawdzać konfigurację za pomocą
`config.schema.lookup`, modyfikować konfigurację za pomocą `config.patch`, zastępować pełną
konfigurację za pomocą `config.apply` i uruchamiać `update.run` tylko na wyraźną
prośbę użytkownika. Narzędzie `gateway`, dostępne tylko dla właściciela, również odmawia przepisywania
`tools.exec.ask` / `tools.exec.security`, w tym starszych aliasów `tools.bash.*`,
które normalizują się do tych chronionych ścieżek exec.
- **Obszar roboczy**: katalog roboczy (`agents.defaults.workspace`).
- **Dokumentacja**: lokalna ścieżka do dokumentacji OpenClaw (repozytorium lub pakiet npm) oraz kiedy ją czytać.
- **Pliki obszaru roboczego (wstrzyknięte)**: wskazuje, że pliki bootstrapu są dołączone poniżej.
- **Sandbox** (gdy włączony): wskazuje runtime w piaskownicy, ścieżki sandboxa i to, czy dostępne jest podwyższone exec.
- **Bieżąca data i godzina**: lokalny czas użytkownika, strefa czasowa i format czasu.
- **Tagi odpowiedzi**: opcjonalna składnia tagów odpowiedzi dla obsługiwanych dostawców.
- **Heartbeat**: prompt Heartbeat i zachowanie potwierdzeń, gdy Heartbeat jest włączony dla domyślnego agenta.
- **Runtime**: host, system operacyjny, node, model, katalog główny repozytorium (jeśli wykryto), poziom myślenia (jedna linia).
- **Rozumowanie**: bieżący poziom widoczności + wskazówka przełączania `/reasoning`.
które są normalizowane do tych chronionych ścieżek exec.
- **Workspace**: katalog roboczy (`agents.defaults.workspace`).
- **Documentation**: lokalna ścieżka do dokumentacji OpenClaw (repozytorium lub pakiet npm) i kiedy ją czytać.
- **Workspace Files (injected)**: wskazuje, że pliki bootstrap są dołączone poniżej.
- **Sandbox** (gdy włączony): wskazuje środowisko sandbox, ścieżki sandboxa i to, czy podwyższony exec jest dostępny.
- **Current Date & Time**: lokalny czas użytkownika, strefa czasowa i format czasu.
- **Reply Tags**: opcjonalna składnia tagów odpowiedzi dla obsługiwanych dostawców.
- **Heartbeats**: prompt heartbeat i zachowanie potwierdzenia, gdy heartbeat jest włączony dla domyślnego agenta.
- **Runtime**: host, system operacyjny, node, model, katalog główny repozytorium (gdy wykryty), poziom myślenia (jedna linia).
- **Reasoning**: bieżący poziom widoczności + podpowiedź przełączania `/reasoning`.
Sekcja Narzędzia zawiera również wskazówki runtime dotyczące długotrwałej pracy:
Sekcja Tooling zawiera również wskazówki runtime dla długotrwałej pracy:
- używaj Cron do przyszłych działań następczych (`check back later`, przypomnienia, zadania cykliczne)
zamiast pętli `sleep` w `exec`, sztuczek opóźniających `yieldMs` lub powtarzanego
odpytywania `process`
- używaj `exec` / `process` tylko do poleceń, które uruchamiają się teraz i nadal działają
zamiast pętli uśpienia `exec`, trików opóźnień `yieldMs` lub powtarzanego odpytywania `process`
- używaj `exec` / `process` tylko dla poleceń, które uruchamiają się teraz i nadal działają
w tle
- gdy włączone jest automatyczne wybudzanie po zakończeniu, uruchom polecenie tylko raz i polegaj na
ścieżce wybudzania opartej na push, gdy zwróci dane wyjściowe lub zakończy się błędem
- gdy włączone jest automatyczne wybudzanie po zakończeniu, uruchom polecenie raz i polegaj na
mechanizmie wybudzania opartym na push, gdy wygeneruje wynik lub zakończy się błędem
- używaj `process` do logów, statusu, wejścia lub interwencji, gdy musisz
sprawdzić działające polecenie
- jeśli zadanie jest większe, preferuj `sessions_spawn`; zakończenie podagenta jest
oparte na push i jest automatycznie anonsowane z powrotem do zlecającego
- nie odpytywaj w pętli `subagents list` / `sessions_list` tylko po to, aby czekać na
- jeśli zadanie jest większe, preferuj `sessions_spawn`; zakończenie sub-agentów działa
w oparciu o push i jest automatycznie ogłaszane z powrotem do żądającego
- nie odpytywuj `subagents list` / `sessions_list` w pętli tylko po to, by czekać na
zakończenie
Gdy eksperymentalne narzędzie `update_plan` jest włączone, sekcja Narzędzia mówi również
modelowi, aby używał go tylko do nietrywialnej pracy wieloetapowej, utrzymywał dokładnie jeden krok
`in_progress` i unikał powtarzania całego planu po każdej aktualizacji.
Gdy eksperymentalne narzędzie `update_plan` jest włączone, Tooling informuje również model,
aby używać go tylko do nietrywialnej pracy wieloetapowej, utrzymywać dokładnie jeden krok
`in_progress` i unikać powtarzania całego planu po każdej aktualizacji.
Zabezpieczenia bezpieczeństwa w prompcie systemowym mają charakter doradczy. Kierują zachowaniem modelu, ale nie egzekwują zasad. Do twardego egzekwowania używaj polityki narzędzi, zatwierdzeń exec, sandboxingu i list dozwolonych kanałów; operatorzy mogą je celowo wyłączyć.
Zabezpieczenia bezpieczeństwa w prompcie systemowym mają charakter doradczy. Kierują zachowaniem modelu, ale nie wymuszają polityki. Do twardego egzekwowania używaj polityki narzędzi, zatwierdzeń exec, sandboxingu i list dozwolonych kanałów; operatorzy mogą je celowo wyłączyć.
W kanałach z natywnymi kartami/przyciskami zatwierdzeń prompt runtime instruuje teraz
agenta, aby najpierw polegał na tym natywnym interfejsie zatwierdzania. Powinien dołączać ręczne
polecenie `/approve` tylko wtedy, gdy wynik narzędzia mówi, że zatwierdzenia na czacie są niedostępne
albo ręczne zatwierdzenie jest jedyną ścieżką.
Na kanałach z natywnymi kartami/przyciskami zatwierdzania prompt runtime informuje teraz
agenta, aby najpierw polegał na tym natywnym interfejsie zatwierdzania. Powinien uwzględniać ręczne
polecenie `/approve` tylko wtedy, gdy wynik narzędzia mówi, że zatwierdzenia w czacie są niedostępne lub
ręczne zatwierdzenie jest jedyną drogą.
## Tryby promptu
OpenClaw może renderować mniejsze prompty systemowe dla podagentów. Runtime ustawia
OpenClaw może renderować mniejsze prompty systemowe dla sub-agentów. Runtime ustawia
`promptMode` dla każdego uruchomienia (nie jest to konfiguracja widoczna dla użytkownika):
- `full` (domyślnie): zawiera wszystkie sekcje powyżej.
- `minimal`: używany dla podagentów; pomija **Skills**, **Przywoływanie pamięci**, **Samodzielną aktualizację OpenClaw**, **Aliasy modeli**, **Tożsamość użytkownika**, **Tagi odpowiedzi**,
**Wiadomości**, **Ciche odpowiedzi** i **Heartbeat**. Narzędzia, **Bezpieczeństwo**,
Obszar roboczy, Sandbox, Bieżąca data i godzina (gdy znane), Runtime oraz wstrzyknięty
- `full` (domyślnie): zawiera wszystkie powyższe sekcje.
- `minimal`: używany dla sub-agentów; pomija **Skills**, **Memory Recall**, **OpenClaw
Self-Update**, **Model Aliases**, **User Identity**, **Reply Tags**,
**Messaging**, **Silent Replies** i **Heartbeats**. Tooling, **Safety**,
Workspace, Sandbox, Current Date & Time (gdy znane), Runtime i wstrzyknięty
kontekst pozostają dostępne.
- `none`: zwraca tylko bazową linię tożsamości.
- `none`: zwraca tylko podstawową linię tożsamości.
Gdy `promptMode=minimal`, dodatkowe wstrzyknięte prompty są oznaczane jako **Kontekst
podagenta** zamiast **Kontekst czatu grupowego**.
Gdy `promptMode=minimal`, dodatkowe wstrzyknięte prompty są oznaczane jako **Subagent
Context** zamiast **Group Chat Context**.
## Wstrzykiwanie bootstrapu obszaru roboczego
## Wstrzykiwanie bootstrapu przestrzeni roboczej
Pliki bootstrapu są przycinane i dołączane w sekcji **Kontekst projektu**, aby model widział kontekst tożsamości i profilu bez potrzeby jawnego odczytu:
Pliki bootstrap są przycinane i dołączane w sekcji **Project Context**, aby model widział kontekst tożsamości i profilu bez potrzeby ich jawnego odczytu:
- `AGENTS.md`
- `SOUL.md`
@ -106,68 +105,68 @@ Pliki bootstrapu są przycinane i dołączane w sekcji **Kontekst projektu**, ab
- `IDENTITY.md`
- `USER.md`
- `HEARTBEAT.md`
- `BOOTSTRAP.md` (tylko w zupełnie nowych obszarach roboczych)
- `MEMORY.md` jeśli istnieje, w przeciwnym razie `memory.md` jako zapasowy wariant małymi literami
- `BOOTSTRAP.md` (tylko w zupełnie nowych przestrzeniach roboczych)
- `MEMORY.md`, jeśli istnieje, w przeciwnym razie `memory.md` jako zapasowy wariant pisany małymi literami
Wszystkie te pliki są **wstrzykiwane do okna kontekstowego** przy każdej turze, chyba że
obowiązuje bramka specyficzna dla pliku. `HEARTBEAT.md` jest pomijany przy zwykłych uruchomieniach, gdy
Heartbeat jest wyłączony dla domyślnego agenta albo
obowiązuje bramka specyficzna dla danego pliku. `HEARTBEAT.md` jest pomijany przy zwykłych uruchomieniach, gdy
heartbeat jest wyłączony dla domyślnego agenta lub
`agents.defaults.heartbeat.includeSystemPromptSection` ma wartość false. Utrzymuj wstrzykiwane
pliki zwięzłe — szczególnie `MEMORY.md`, który może z czasem rosnąć i prowadzić do
nieoczekiwanie wysokiego użycia kontekstu oraz częstszej Compaction.
> **Uwaga:** dzienne pliki `memory/*.md` **nie** są częścią zwykłego bootstrapowego
> Kontekstu projektu. W zwykłych turach są dostępne na żądanie przez narzędzia
> `memory_search` i `memory_get`, więc nie zajmują miejsca w oknie
> kontekstowym, chyba że model jawnie je odczyta. Wyjątkiem są zwykłe tury `/new` i
> `/reset`: runtime może dodać na początku ostatnią dzienną pamięć jako jednorazowy blok
> **Uwaga:** codzienne pliki `memory/*.md` **nie** są częścią zwykłego bootstrapowego
> Project Context. W zwykłych turach są odczytywane na żądanie przez
> narzędzia `memory_search` i `memory_get`, więc nie liczą się do
> okna kontekstowego, chyba że model jawnie je odczyta. Wyjątkiem są zwykłe tury `/new` i
> `/reset`: runtime może dołączyć ostatnią codzienną pamięć jako jednorazowy blok
> kontekstu startowego dla tej pierwszej tury.
Duże pliki są obcinane ze znacznikiem. Maksymalny rozmiar na plik jest kontrolowany przez
`agents.defaults.bootstrapMaxChars` (domyślnie: 20000). Całkowita wstrzyknięta zawartość bootstrapu
Duże pliki są przycinane z markerem. Maksymalny rozmiar na plik jest kontrolowany przez
`agents.defaults.bootstrapMaxChars` (domyślnie: 20000). Łączna wstrzyknięta zawartość bootstrapu
we wszystkich plikach jest ograniczona przez `agents.defaults.bootstrapTotalMaxChars`
(domyślnie: 150000). Brakujące pliki wstrzykują krótki znacznik brakującego pliku. Gdy dochodzi do obcięcia,
OpenClaw może wstrzyknąć blok ostrzeżenia w Kontekście projektu; kontroluje to
(domyślnie: 150000). Brakujące pliki wstrzykują krótki znacznik brakującego pliku. Gdy dochodzi do przycięcia,
OpenClaw może wstrzyknąć blok ostrzeżenia w Project Context; kontroluje się to przez
`agents.defaults.bootstrapPromptTruncationWarning` (`off`, `once`, `always`;
domyślnie: `once`).
Sesje podagentów wstrzykują tylko `AGENTS.md` i `TOOLS.md` (pozostałe pliki bootstrapu
są odfiltrowywane, aby zachować mały kontekst podagenta).
Sesje sub-agentów wstrzykują tylko `AGENTS.md` i `TOOLS.md` (pozostałe pliki bootstrap
są odfiltrowywane, aby zachować mały kontekst sub-agenta).
Wewnętrzne hooki mogą przechwycić ten krok przez `agent:bootstrap`, aby modyfikować lub zastępować
wstrzykiwane pliki bootstrapu (na przykład zamieniając `SOUL.md` na alternatywną personę).
Wewnętrzne hooki mogą przechwycić ten krok przez `agent:bootstrap`, aby mutować lub zastępować
wstrzyknięte pliki bootstrap (na przykład zamieniając `SOUL.md` na alternatywną personę).
Jeśli chcesz, aby agent brzmiał mniej generycznie, zacznij od
[Przewodnika osobowości SOUL.md](/pl/concepts/soul).
Aby sprawdzić, jaki wkład ma każdy wstrzyknięty plik (surowy vs wstrzyknięty, obcięcie oraz narzut schematu narzędzi), użyj `/context list` lub `/context detail`. Zobacz [Kontekst](/pl/concepts/context).
Aby sprawdzić, jaki wkład ma każdy wstrzyknięty plik (surowy vs wstrzyknięty, przycięcie oraz narzut schematu narzędzi), użyj `/context list` lub `/context detail`. Zobacz [Context](/pl/concepts/context).
## Obsługa czasu
Prompt systemowy zawiera dedykowaną sekcję **Bieżąca data i godzina**, gdy znana jest
strefa czasowa użytkownika. Aby zachować stabilność cache promptu, zawiera ona teraz tylko
Prompt systemowy zawiera dedykowaną sekcję **Current Date & Time**, gdy znana jest
strefa czasowa użytkownika. Aby zachować stabilność cache promptu, zawiera teraz tylko
**strefę czasową** (bez dynamicznego zegara ani formatu czasu).
Użyj `session_status`, gdy agent potrzebuje bieżącego czasu; karta statusu
zawiera wiersz ze znacznikiem czasu. To samo narzędzie może opcjonalnie ustawić zastąpienie modelu
dla sesji (`model=default` je czyści).
zawiera wiersz znacznika czasu. To samo narzędzie może opcjonalnie ustawić
nadpisanie modelu dla sesji (`model=default` je czyści).
Skonfiguruj za pomocą:
Konfiguracja:
- `agents.defaults.userTimezone`
- `agents.defaults.timeFormat` (`auto` | `12` | `24`)
Pełne szczegóły zachowania znajdziesz w [Data i czas](/pl/date-time).
Pełne szczegóły zachowania znajdziesz w [Date & Time](/pl/date-time).
## Skills
Gdy istnieją kwalifikujące się Skills, OpenClaw wstrzykuje zwartą **listę dostępnych Skills**
(`formatSkillsForPrompt`), która zawiera **ścieżkę do pliku** dla każdej Skills. Prompt
instruuje model, aby użył `read` do wczytania SKILL.md w podanej lokalizacji
(obszar roboczy, zarządzane lub dołączone). Jeśli nie ma kwalifikujących się Skills, sekcja
(`formatSkillsForPrompt`), która zawiera **ścieżkę pliku** dla każdego Skill. Prompt
nakazuje modelowi użyć `read`, aby wczytać SKILL.md z podanej
lokalizacji (przestrzeń robocza, zarządzana lub dołączona). Jeśli nie ma kwalifikujących się Skills, sekcja
Skills jest pomijana.
Kwalifikacja obejmuje bramki metadanych Skills, kontrole środowiska/runtime i konfiguracji
Kwalifikacja obejmuje bramki metadanych Skill, kontrole środowiska runtime/konfiguracji
oraz efektywną listę dozwolonych Skills agenta, gdy skonfigurowano `agents.defaults.skills` lub
`agents.list[].skills`.
@ -181,13 +180,26 @@ oraz efektywną listę dozwolonych Skills agenta, gdy skonfigurowano `agents.def
</available_skills>
```
Pozwala to zachować mały bazowy prompt, a jednocześnie nadal umożliwia ukierunkowane użycie Skills.
Pozwala to zachować mały podstawowy prompt, a jednocześnie umożliwia ukierunkowane użycie Skills.
## Dokumentacja
Budżet listy Skills należy do podsystemu Skills:
Gdy jest dostępna, prompt systemowy zawiera sekcję **Dokumentacja**, która wskazuje
lokalny katalog dokumentacji OpenClaw (albo `docs/` w obszarze roboczym repozytorium, albo dokumentację dołączonego
pakietu npm) i wspomina również o publicznym mirrorze, źródłowym repozytorium, społecznościowym Discordzie oraz
ClawHub ([https://clawhub.ai](https://clawhub.ai)) do odkrywania Skills. Prompt instruuje model, aby najpierw sprawdzał lokalną dokumentację
w sprawach zachowania OpenClaw, poleceń, konfiguracji lub architektury oraz aby
sam uruchamiał `openclaw status`, gdy to możliwe (prosząc użytkownika tylko wtedy, gdy nie ma dostępu).
- Globalna wartość domyślna: `skills.limits.maxSkillsPromptChars`
- Nadpisanie dla agenta: `agents.list[].skillsLimits.maxSkillsPromptChars`
Ogólne ograniczone fragmenty runtime używają innej powierzchni:
- `agents.defaults.contextLimits.*`
- `agents.list[].contextLimits.*`
Ten podział utrzymuje rozmiar Skills oddzielnie od rozmiaru odczytu/wstrzykiwania runtime, takiego jak
`memory_get`, wyniki narzędzi na żywo i odświeżenia AGENTS.md po Compaction.
## Documentation
Gdy to możliwe, prompt systemowy zawiera sekcję **Documentation**, która wskazuje
lokalny katalog dokumentacji OpenClaw (albo `docs/` w przestrzeni roboczej repozytorium, albo dokumentację
dołączonego pakietu npm) oraz wspomina też o publicznym mirrorze, repozytorium źródłowym, społecznościowym Discordzie i
ClawHub ([https://clawhub.ai](https://clawhub.ai)) do odkrywania Skills. Prompt instruuje model, aby najpierw konsultował lokalną dokumentację
w sprawach zachowania, poleceń, konfiguracji lub architektury OpenClaw oraz aby
samodzielnie uruchamiał `openclaw status`, kiedy to możliwe (prosząc użytkownika tylko wtedy, gdy nie ma dostępu).

File diff suppressed because it is too large Load Diff

View File

@ -1,89 +1,91 @@
---
read_when:
- Tworzysz nowy Plugin kanału wiadomości.
- Chcesz połączyć OpenClaw z platformą komunikacyjną.
- Musisz zrozumieć powierzchnię adaptera ChannelPlugin.
- Tworzysz nowy Plugin kanału komunikatora
- Chcesz połączyć OpenClaw z platformą komunikacyjną
- Musisz zrozumieć powierzchnię adaptera ChannelPlugin
sidebarTitle: Channel Plugins
summary: Przewodnik krok po kroku dotyczący tworzenia Pluginu kanału wiadomości dla OpenClaw
summary: Przewodnik krok po kroku dotyczący tworzenia Pluginu kanału komunikatora dla OpenClaw
title: Tworzenie Pluginów kanałów
x-i18n:
generated_at: "2026-04-15T09:51:14Z"
generated_at: "2026-04-15T19:41:36Z"
model: gpt-5.4
provider: openai
source_hash: a7f4c746fe3163a8880e14c433f4db4a1475535d91716a53fb879551d8d62f65
source_hash: 80e47e61d1e47738361692522b79aff276544446c58a7b41afe5296635dfad4b
source_path: plugins/sdk-channel-plugins.md
workflow: 15
---
# Tworzenie Pluginów kanałów
Ten przewodnik krok po kroku pokazuje, jak zbudować Plugin kanału, który łączy OpenClaw z platformą komunikacyjną. Po jego ukończeniu będziesz mieć działający kanał z zabezpieczeniami DM, parowaniem, wątkowaniem odpowiedzi oraz wiadomościami wychodzącymi.
Ten przewodnik przeprowadzi Cię przez tworzenie Pluginu kanału, który łączy OpenClaw z platformą komunikacyjną. Na końcu będziesz mieć działający kanał z zabezpieczeniami DM, parowaniem, wątkowaniem odpowiedzi i wiadomościami wychodzącymi.
<Info>
Jeśli nie zbudowano jeszcze żadnego Pluginu OpenClaw, najpierw przeczytaj
Jeśli nie tworzyłeś wcześniej żadnego Pluginu OpenClaw, najpierw przeczytaj
[Pierwsze kroki](/pl/plugins/building-plugins), aby poznać podstawową strukturę
pakietu i konfigurację manifestu.
</Info>
## Jak działają Pluginy kanałów
Pluginy kanałów nie potrzebują własnych narzędzi do wysyłania/edytowania/reakcji. OpenClaw utrzymuje jedno współdzielone narzędzie `message` w rdzeniu. Twój Plugin odpowiada za:
Pluginy kanałów nie potrzebują własnych narzędzi do wysyłania/edycji/reakcji. OpenClaw utrzymuje jedno współdzielone narzędzie `message` w rdzeniu. Twój Plugin odpowiada za:
- **Config** — rozpoznawanie kont i kreator konfiguracji
- **Security** — politykę DM i listy dozwolonych
- **Pairing** — przepływ zatwierdzania DM
- **Session grammar** — sposób, w jaki identyfikatory rozmów specyficzne dla dostawcy mapują się na bazowe czaty, identyfikatory wątków i rezerwy nadrzędne
- **Outbound** — wysyłanie tekstu, multimediów i ankiet na platformę
- **Threading** — sposób wątkowania odpowiedzi
- **Konfigurację** — rozpoznawanie konta i kreator konfiguracji
- **Bezpieczeństwo** — zasady DM i listy dozwolonych
- **Parowanie** — przepływ zatwierdzania DM
- **Gramatykę sesji** — sposób, w jaki identyfikatory konwersacji specyficzne dla dostawcy są mapowane na czaty bazowe, identyfikatory wątków i zapasowe elementy nadrzędne
- **Ruch wychodzący** — wysyłanie tekstu, multimediów i ankiet na platformę
- **Wątkowanie** — sposób wątkowania odpowiedzi
Rdzeń odpowiada za współdzielone narzędzie wiadomości, połączenia z promptami, zewnętrzny kształt klucza sesji, ogólne księgowanie `:thread:` oraz dyspozycję.
Rdzeń odpowiada za współdzielone narzędzie wiadomości, połączenie promptów, zewnętrzny kształt klucza sesji, ogólne księgowanie `:thread:` i dyspozycję.
Jeśli Twój kanał dodaje parametry narzędzia wiadomości, które przenoszą źródła multimediów, ujawnij nazwy tych parametrów przez `describeMessageTool(...).mediaSourceParams`. Rdzeń używa tej jawnej listy do normalizacji ścieżek w sandboxie i polityki dostępu do multimediów wychodzących, więc Pluginy nie potrzebują wyjątków specyficznych dla dostawcy we współdzielonym rdzeniu dla parametrów awatara, załączników lub obrazów okładki.
Preferuj zwracanie mapy kluczowanej akcjami, takiej jak
`{ "set-profile": ["avatarUrl", "avatarPath"] }`, aby niezwiązane akcje nie dziedziczyły argumentów multimedialnych innej akcji. Płaska tablica nadal działa dla parametrów, które celowo są współdzielone przez każdą ujawnioną akcję.
Jeśli Twój kanał dodaje parametry narzędzia wiadomości, które przenoszą źródła multimediów, udostępnij te nazwy parametrów przez `describeMessageTool(...).mediaSourceParams`. Rdzeń używa tej jawnej listy do normalizacji ścieżek sandboxa i zasad dostępu do multimediów wychodzących, więc Pluginy nie potrzebują wyjątków w współdzielonym rdzeniu dla parametrów awatarów, załączników lub obrazów okładek specyficznych dla dostawcy.
Preferuj zwracanie mapy kluczowanej akcją, takiej jak
`{ "set-profile": ["avatarUrl", "avatarPath"] }`, aby niezwiązane akcje nie dziedziczyły argumentów multimediów innej akcji. Płaska tablica nadal działa dla parametrów, które celowo są współdzielone przez każdą udostępnioną akcję.
Jeśli Twoja platforma przechowuje dodatkowy zakres w identyfikatorach rozmów, pozostaw to parsowanie w Pluginie za pomocą `messaging.resolveSessionConversation(...)`. To kanoniczny hak do mapowania `rawId` na bazowy identyfikator rozmowy, opcjonalny identyfikator wątku, jawne `baseConversationId` oraz wszelkie `parentConversationCandidates`.
Gdy zwracasz `parentConversationCandidates`, zachowaj ich kolejność od najwęższego rodzica do najszerszej/bazowej rozmowy.
Jeśli Twoja platforma przechowuje dodatkowy zakres wewnątrz identyfikatorów konwersacji, zachowaj to parsowanie w Pluginie za pomocą `messaging.resolveSessionConversation(...)`. To jest kanoniczny hook do mapowania `rawId` na bazowy identyfikator konwersacji, opcjonalny identyfikator wątku, jawny `baseConversationId` i wszelkie `parentConversationCandidates`.
Gdy zwracasz `parentConversationCandidates`, zachowaj ich kolejność od najbardziej zawężonego elementu nadrzędnego do najszerszej/bazowej konwersacji.
Bundlowane Pluginy, które potrzebują tego samego parsowania przed uruchomieniem rejestru kanałów, mogą t udostępniać plik najwyższego poziomu `session-key-api.ts` z pasującym eksportem `resolveSessionConversation(...)`. Rdzeń używa tej bezpiecznej dla bootstrapu powierzchni tylko wtedy, gdy rejestr Pluginów runtime nie jest jeszcze dostępny.
Bundlowane Pluginy, które potrzebują tego samego parsowania przed uruchomieniem rejestru kanałów, mogą także udostępniać plik najwyższego poziomu `session-key-api.ts` z pasującym eksportem `resolveSessionConversation(...)`. Rdzeń używa tej bezpiecznej dla bootstrapu powierzchni tylko wtedy, gdy rejestr Pluginów środowiska uruchomieniowego nie jest jeszcze dostępny.
`messaging.resolveParentConversationCandidates(...)` pozostaje dostępne jako starsza rezerwa zgodności, gdy Plugin potrzebuje jedynie rezerw nadrzędnych ponad ogólnym/surowym identyfikatorem. Jeśli istnieją oba haki, rdzeń najpierw używa `resolveSessionConversation(...).parentConversationCandidates`, a do `resolveParentConversationCandidates(...)` wraca tylko wtedy, gdy kanoniczny hak ich nie zwraca.
`messaging.resolveParentConversationCandidates(...)` pozostaje dostępne jako starszy, zgodnościowy mechanizm zapasowy, gdy Plugin potrzebuje jedynie zapasowych elementów nadrzędnych ponad ogólnym/nieprzetworzonym identyfikatorem. Jeśli istnieją oba hooki, rdzeń najpierw używa
`resolveSessionConversation(...).parentConversationCandidates`, a do
`resolveParentConversationCandidates(...)` wraca tylko wtedy, gdy kanoniczny hook ich nie zwraca.
## Zatwierdzenia i możliwości kanału
Większość Pluginów kanałów nie potrzebuje kodu specyficznego dla zatwierdzeń.
- Rdzeń odpowiada za `/approve` w tym samym czacie, współdzielone ładunki przycisków zatwierdzania oraz ogólne dostarczanie rezerwowe.
- Preferuj pojedynczy obiekt `approvalCapability` w Pluginie kanału, gdy kanał potrzebuje zachowania specyficznego dla zatwierdzeń.
- `ChannelPlugin.approvals` zostało usunięte. Umieść fakty dotyczące dostarczania/natywnego/renderowania/uwierzytelniania zatwierdzeń w `approvalCapability`.
- `plugin.auth` służy tylko do logowania/wylogowania; rdzeń nie odczytuje już haków uwierzytelniania zatwierdzeń z tego obiektu.
- Rdzeń odpowiada za `/approve` w tym samym czacie, współdzielone payloady przycisków zatwierdzeń i ogólne dostarczanie zapasowe.
- Preferuj pojedynczy obiekt `approvalCapability` na Pluginie kanału, gdy kanał potrzebuje zachowania specyficznego dla zatwierdzeń.
- `ChannelPlugin.approvals` zostało usunięte. Umieść fakty dotyczące dostarczania/natywności/renderowania/uwierzytelniania zatwierdzeń w `approvalCapability`.
- `plugin.auth` służy tylko do logowania/wylogowania; rdzeń nie odczytuje już hooków uwierzytelniania zatwierdzeń z tego obiektu.
- `approvalCapability.authorizeActorAction` i `approvalCapability.getActionAvailabilityState` to kanoniczna powierzchnia uwierzytelniania zatwierdzeń.
- Używaj `approvalCapability.getActionAvailabilityState` dla dostępności uwierzytelniania zatwierdzeń w tym samym czacie.
- Jeśli Twój kanał udostępnia natywne zatwierdzenia exec, użyj `approvalCapability.getExecInitiatingSurfaceState` dla stanu powierzchni inicjującej/klienta natywnego, gdy różni się on od uwierzytelniania zatwierdzeń w tym samym czacie. Rdzeń używa tego haka specyficznego dla exec, aby rozróżnić `enabled` i `disabled`, zdecydować, czy kanał inicjujący obsługuje natywne zatwierdzenia exec, oraz uwzględnić ten kanał w wskazówkach dotyczących rezerwy klienta natywnego. `createApproverRestrictedNativeApprovalCapability(...)` wypełnia to dla typowego przypadku.
- Używaj `outbound.shouldSuppressLocalPayloadPrompt` lub `outbound.beforeDeliverPayload` do zachowań cyklu życia ładunku specyficznych dla kanału, takich jak ukrywanie zduplikowanych lokalnych promptów zatwierdzeń lub wysyłanie wskaźników pisania przed dostarczeniem.
- Używaj `approvalCapability.delivery` tylko do natywnego routingu zatwierdzeń lub wyciszania rezerwy.
- Używaj `approvalCapability.nativeRuntime` dla faktów natywnych zatwierdzeń należących do kanału. Zachowaj leniwe ładowanie na gorących punktach wejścia kanału za pomocą `createLazyChannelApprovalNativeRuntimeAdapter(...)`, które może importować moduł runtime na żądanie, a jednocześnie pozwala rdzeniowi składać cykl życia zatwierdzeń.
- Używaj `approvalCapability.render` tylko wtedy, gdy kanał naprawdę potrzebuje niestandardowych ładunków zatwierdzeń zamiast współdzielonego renderera.
- Używaj `approvalCapability.describeExecApprovalSetup`, gdy kanał chce, aby odpowiedź dla ścieżki wyłączonej wyjaśniała dokładne pokrętła konfiguracji potrzebne do włączenia natywnych zatwierdzeń exec. Hak otrzymuje `{ channel, channelLabel, accountId }`; kanały z nazwanymi kontami powinny renderować ścieżki z zakresem konta, takie jak `channels.<channel>.accounts.<id>.execApprovals.*`, zamiast domyślnych ścieżek najwyższego poziomu.
- Jeśli kanał może wnioskować o stabilnych tożsamościach DM podobnych do właściciela na podstawie istniejącej konfiguracji, użyj `createResolvedApproverActionAuthAdapter` z `openclaw/plugin-sdk/approval-runtime`, aby ograniczyć `/approve` w tym samym czacie bez dodawania logiki specyficznej dla zatwierdzeń do rdzenia.
- Jeśli kanał potrzebuje natywnego dostarczania zatwierdzeń, skup kod kanału na normalizacji celu oraz faktach transportu/prezentacji. Użyj `createChannelExecApprovalProfile`, `createChannelNativeOriginTargetResolver`, `createChannelApproverDmTargetResolver` i `createApproverRestrictedNativeApprovalCapability` z `openclaw/plugin-sdk/approval-runtime`. Umieść fakty specyficzne dla kanału za `approvalCapability.nativeRuntime`, najlepiej przez `createChannelApprovalNativeRuntimeAdapter(...)` lub `createLazyChannelApprovalNativeRuntimeAdapter(...)`, aby rdzeń mógł złożyć obsługę i przejąć filtrowanie żądań, routing, usuwanie duplikatów, wygaśnięcie, subskrypcję Gateway oraz powiadomienia o przekierowaniu. `nativeRuntime` jest podzielone na kilka mniejszych powierzchni:
- Użyj `approvalCapability.getActionAvailabilityState` do dostępności uwierzytelniania zatwierdzeń w tym samym czacie.
- Jeśli Twój kanał udostępnia natywne zatwierdzenia exec, użyj `approvalCapability.getExecInitiatingSurfaceState` dla stanu powierzchni inicjującej/klienta natywnego, gdy różni się on od uwierzytelniania zatwierdzeń w tym samym czacie. Rdzeń używa tego hooka specyficznego dla exec, aby odróżniać `enabled` od `disabled`, zdecydować, czy kanał inicjujący obsługuje natywne zatwierdzenia exec, i uwzględnić kanał we wskazówkach zapasowych dla klienta natywnego. `createApproverRestrictedNativeApprovalCapability(...)` wypełnia to dla typowego przypadku.
- Użyj `outbound.shouldSuppressLocalPayloadPrompt` lub `outbound.beforeDeliverPayload` dla zachowań cyklu życia payloadu specyficznych dla kanału, takich jak ukrywanie zduplikowanych lokalnych promptów zatwierdzeń lub wysyłanie wskaźników pisania przed dostarczeniem.
- Użyj `approvalCapability.delivery` tylko do natywnego trasowania zatwierdzeń lub wyłączania mechanizmu zapasowego.
- Użyj `approvalCapability.nativeRuntime` dla natywnych faktów zatwierdzeń należących do kanału. Zachowaj leniwe ładowanie dla gorących entrypointów kanału za pomocą `createLazyChannelApprovalNativeRuntimeAdapter(...)`, które może importować moduł runtime na żądanie, jednocześnie pozwalając rdzeniowi złożyć cykl życia zatwierdzenia.
- Użyj `approvalCapability.render` tylko wtedy, gdy kanał naprawdę potrzebuje niestandardowych payloadów zatwierdzeń zamiast współdzielonego renderera.
- Użyj `approvalCapability.describeExecApprovalSetup`, gdy kanał chce, aby odpowiedź na ścieżce wyłączonej wyjaśniała dokładne przełączniki konfiguracyjne potrzebne do włączenia natywnych zatwierdzeń exec. Hook otrzymuje `{ channel, channelLabel, accountId }`; kanały z nazwanymi kontami powinny renderować ścieżki o zakresie konta, takie jak `channels.<channel>.accounts.<id>.execApprovals.*`, zamiast domyślnych ścieżek najwyższego poziomu.
- Jeśli kanał może wywnioskować stabilne tożsamości typu właściciela DM z istniejącej konfiguracji, użyj `createResolvedApproverActionAuthAdapter` z `openclaw/plugin-sdk/approval-runtime`, aby ograniczyć `/approve` w tym samym czacie bez dodawania logiki specyficznej dla zatwierdzeń w rdzeniu.
- Jeśli kanał potrzebuje natywnego dostarczania zatwierdzeń, utrzymuj kod kanału skupiony na normalizacji celu oraz faktach dotyczących transportu/prezentacji. Użyj `createChannelExecApprovalProfile`, `createChannelNativeOriginTargetResolver`, `createChannelApproverDmTargetResolver` i `createApproverRestrictedNativeApprovalCapability` z `openclaw/plugin-sdk/approval-runtime`. Umieść fakty specyficzne dla kanału za `approvalCapability.nativeRuntime`, najlepiej przez `createChannelApprovalNativeRuntimeAdapter(...)` lub `createLazyChannelApprovalNativeRuntimeAdapter(...)`, aby rdzeń mógł złożyć handler i przejąć filtrowanie żądań, trasowanie, deduplikację, wygasanie, subskrypcję Gateway oraz powiadomienia o przekierowaniu gdzie indziej. `nativeRuntime` jest podzielone na kilka mniejszych powierzchni:
- `availability` — czy konto jest skonfigurowane i czy żądanie powinno zostać obsłużone
- `presentation` — mapowanie współdzielonego modelu widoku zatwierdzenia na oczekujące/rozwiązane/wygasłe ładunki natywne lub działania końcowe
- `transport` — przygotowanie celów oraz wysyłanie/aktualizowanie/usuwanie natywnych wiadomości zatwierdzeń
- `interactions` — opcjonalne haki bind/unbind/clear-action dla natywnych przycisków lub reakcji
- `observe` — opcjonalne haki diagnostyki dostarczania
- Jeśli kanał potrzebuje obiektów należących do runtime, takich jak klient, token, aplikacja Bolt lub odbiornik Webhook, zarejestruj je przez `openclaw/plugin-sdk/channel-runtime-context`. Ogólny rejestr kontekstu runtime pozwala rdzeniowi bootstrapować handlery sterowane możliwościami na podstawie stanu uruchomienia kanału bez dodawania kleju opakowującego specyficznego dla zatwierdzeń.
- Sięgaj po niższopoziomowe `createChannelApprovalHandler` lub `createChannelNativeApprovalRuntime` tylko wtedy, gdy powierzchnia sterowana możliwościami nie jest jeszcze wystarczająco ekspresyjna.
- Kanały natywnych zatwierdzeń muszą routować zarówno `accountId`, jak i `approvalKind` przez te helpery. `accountId` utrzymuje politykę zatwierdzeń dla wielu kont w zakresie właściwego konta bota, a `approvalKind` zachowuje dla kanału dostępność zachowania zatwierdzeń exec vs Plugin bez zakodowanych na sztywno gałęzi w rdzeniu.
- Rdzeń odpowiada teraz także za powiadomienia o przekierowaniu zatwierdzeń. Pluginy kanałów nie powinny wysyłać własnych wiadomości uzupełniających typu „zatwierdzenie trafiło do DM / innego kanału” z `createChannelNativeApprovalRuntime`; zamiast tego ujawnij dokładny routing źródła i DM zatwierdzającego przez współdzielone helpery możliwości zatwierdzeń i pozwól rdzeniowi agregować rzeczywiste dostarczenia przed opublikowaniem powiadomienia z powrotem do czatu inicjującego.
- Zachowuj rodzaj identyfikatora dostarczonego zatwierdzenia od początku do końca. Klienci natywni nie powinni zgadywać ani przepisywać routingu zatwierdzeń exec vs Plugin na podstawie lokalnego stanu kanału.
- Różne rodzaje zatwierdzeń mogą celowo ujawniać różne powierzchnie natywne.
- `presentation` — mapowanie współdzielonego modelu widoku zatwierdzenia na oczekujące/rozwiązane/wygasłe natywne payloady lub działania końcowe
- `transport` — przygotowywanie celów oraz wysyłanie/aktualizowanie/usuwanie natywnych wiadomości zatwierdzeń
- `interactions` — opcjonalne hooki bind/unbind/clear-action dla natywnych przycisków lub reakcji
- `observe` — opcjonalne hooki diagnostyki dostarczeń
- Jeśli kanał potrzebuje obiektów należących do runtime, takich jak klient, token, aplikacja Bolt lub odbiornik Webhooków, zarejestruj je przez `openclaw/plugin-sdk/channel-runtime-context`. Ogólny rejestr kontekstu runtime pozwala rdzeniowi uruchamiać handlery sterowane możliwościami na podstawie stanu uruchomienia kanału bez dodawania kodu opakowującego specyficznego dla zatwierdzeń.
- Sięgaj po niższopoziomowe `createChannelApprovalHandler` lub `createChannelNativeApprovalRuntime` tylko wtedy, gdy powierzchnia oparta na możliwościach nie jest jeszcze wystarczająco ekspresyjna.
- Kanały natywnych zatwierdzeń muszą trasować zarówno `accountId`, jak i `approvalKind` przez te helpery. `accountId` utrzymuje zasady zatwierdzeń wielu kont w odpowiednim zakresie konta bota, a `approvalKind` utrzymuje zachowanie zatwierdzeń exec vs Plugin dostępne dla kanału bez zakodowanych na sztywno rozgałęzień w rdzeniu.
- Rdzeń odpowiada teraz również za powiadomienia o przekierowaniu zatwierdzeń. Pluginy kanałów nie powinny wysyłać własnych wiadomości uzupełniających typu „zatwierdzenie trafiło do DM / innego kanału” z `createChannelNativeApprovalRuntime`; zamiast tego udostępnij dokładne trasowanie pochodzenia + DM osoby zatwierdzającej przez współdzielone helpery możliwości zatwierdzeń i pozwól rdzeniowi agregować rzeczywiste dostarczenia przed opublikowaniem powiadomienia z powrotem do czatu inicjującego.
- Zachowuj typ identyfikatora dostarczonego zatwierdzenia od początku do końca. Klienci natywni nie powinni zgadywać ani przepisywać trasowania zatwierdzeń exec vs Plugin na podstawie lokalnego stanu kanału.
- Różne typy zatwierdzeń mogą celowo udostępniać różne powierzchnie natywne.
Obecne przykłady bundlowane:
- Slack zachowuje dostępny natywny routing zatwierdzeń zarówno dla identyfikatorów exec, jak i Plugin.
- Matrix zachowuje ten sam natywny routing DM/kanału i UX reakcji dla zatwierdzeń exec i Plugin, nadal pozwalając, by uwierzytelnianie różniło się zależnie od rodzaju zatwierdzenia.
- `createApproverRestrictedNativeApprovalAdapter` nadal istnieje jako opakowanie zgodności, ale nowy kod powinien preferować kreator możliwości i ujawniać `approvalCapability` w Pluginie.
- Slack zachowuje natywne trasowanie zatwierdzeń dostępne zarówno dla identyfikatorów exec, jak i Plugin.
- Matrix zachowuje to samo natywne trasowanie DM/kanału i UX reakcji dla zatwierdzeń exec i Plugin, jednocześnie nadal pozwalając, by uwierzytelnianie różniło się w zależności od typu zatwierdzenia.
- `createApproverRestrictedNativeApprovalAdapter` nadal istnieje jako opakowanie zgodnościowe, ale nowy kod powinien preferować konstruktor możliwości i udostępniać `approvalCapability` w Pluginie.
Dla gorących punktów wejścia kanału preferuj węższe podścieżki runtime, gdy potrzebujesz tylko jednej części tej rodziny:
Dla gorących entrypointów kanału preferuj węższe podścieżki runtime, gdy potrzebujesz tylko jednej części tej rodziny:
- `openclaw/plugin-sdk/approval-auth-runtime`
- `openclaw/plugin-sdk/approval-client-runtime`
@ -99,87 +101,89 @@ Podobnie preferuj `openclaw/plugin-sdk/setup-runtime`,
`openclaw/plugin-sdk/setup-adapter-runtime`,
`openclaw/plugin-sdk/reply-runtime`,
`openclaw/plugin-sdk/reply-dispatch-runtime`,
`openclaw/plugin-sdk/reply-reference` oraz
`openclaw/plugin-sdk/reply-chunking`, gdy nie potrzebujesz szerszej powierzchni parasolowej.
`openclaw/plugin-sdk/reply-reference` i
`openclaw/plugin-sdk/reply-chunking`, gdy nie potrzebujesz szerszej, zbiorczej
powierzchni.
W przypadku konfiguracji w szczególności:
Konkretnie dla konfiguracji:
- `openclaw/plugin-sdk/setup-runtime` obejmuje bezpieczne dla runtime helpery konfiguracji:
bezpieczne dla importu adaptery łatania konfiguracji (`createPatchedAccountSetupAdapter`,
adaptery patchowania konfiguracji bezpieczne importowo (`createPatchedAccountSetupAdapter`,
`createEnvPatchedAccountSetupAdapter`,
`createSetupInputPresenceValidator`), wyjście notatek wyszukiwania,
`promptResolvedAllowFrom`, `splitSetupEntries` oraz delegowane
kreatory proxy konfiguracji
- `openclaw/plugin-sdk/setup-adapter-runtime` to wąska, świadoma środowiska powierzchnia
adaptera dla `createEnvPatchedAccountSetupAdapter`
- `openclaw/plugin-sdk/channel-setup` obejmuje kreatory konfiguracji opcjonalnej instalacji
`promptResolvedAllowFrom`, `splitSetupEntries` i delegowane
konstruktory proxy konfiguracji
- `openclaw/plugin-sdk/setup-adapter-runtime` to wąska powierzchnia adaptera świadoma env
dla `createEnvPatchedAccountSetupAdapter`
- `openclaw/plugin-sdk/channel-setup` obejmuje konstruktory konfiguracji opcjonalnej instalacji
oraz kilka prymitywów bezpiecznych dla konfiguracji:
`createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`,
Jeśli Twój kanał obsługuje konfigurację lub uwierzytelnianie sterowane środowiskiem i ogólne przepływy uruchamiania/konfiguracji powinny znać te nazwy zmiennych środowiskowych przed załadowaniem runtime, zadeklaruj je w manifeście Pluginu za pomocą `channelEnvVars`. Zachowaj runtime `envVars` kanału lub lokalne stałe tylko dla kopii skierowanej do operatora.
Jeśli Twój kanał obsługuje konfigurację lub uwierzytelnianie sterowane przez env i ogólne przepływy uruchamiania/konfiguracji powinny znać te nazwy env jeszcze przed załadowaniem runtime, zadeklaruj je w manifeście Pluginu za pomocą `channelEnvVars`. Zachowaj `envVars` runtime kanału lub lokalne stałe tylko dla kopii przeznaczonej dla operatora.
`createOptionalChannelSetupWizard`, `DEFAULT_ACCOUNT_ID`,
`createTopLevelChannelDmPolicy`, `setSetupChannelEnabled` oraz
`createTopLevelChannelDmPolicy`, `setSetupChannelEnabled` i
`splitSetupEntries`
- używaj szerszej powierzchni `openclaw/plugin-sdk/setup` tylko wtedy, gdy potrzebujesz również
cięższych współdzielonych helperów konfiguracji/ustawień, takich jak
`moveSingleAccountChannelSectionToDefaultAccount(...)`
Jeśli Twój kanał chce jedynie reklamować „najpierw zainstaluj ten Plugin” w powierzchniach konfiguracji, preferuj `createOptionalChannelSetupSurface(...)`. Wygenerowany adapter/kreator domyślnie odmawia zapisów konfiguracji i finalizacji oraz ponownie wykorzystuje ten sam komunikat o wymaganej instalacji w walidacji, finalizacji i treści linku do dokumentacji.
Jeśli Twój kanał chce jedynie komunikować na powierzchniach konfiguracji „najpierw zainstaluj ten Plugin”, preferuj `createOptionalChannelSetupSurface(...)`. Wygenerowany adapter/kreator domyślnie odmawia zapisu konfiguracji i finalizacji, a także ponownie wykorzystuje ten sam komunikat wymagający instalacji w walidacji, finalizacji i treści z linkiem do dokumentacji.
Dla innych gorących ścieżek kanału preferuj wąskie helpery zamiast szerszych starszych powierzchni:
- `openclaw/plugin-sdk/account-core`,
`openclaw/plugin-sdk/account-id`,
`openclaw/plugin-sdk/account-resolution` oraz
`openclaw/plugin-sdk/account-resolution` i
`openclaw/plugin-sdk/account-helpers` dla konfiguracji wielu kont i
rezerwy konta domyślnego
- `openclaw/plugin-sdk/inbound-envelope` oraz
`openclaw/plugin-sdk/inbound-reply-dispatch` dla routingu/koperty wejściowej oraz
połączeń rejestrowania i dyspozycji
zapasowego przejścia do konta domyślnego
- `openclaw/plugin-sdk/inbound-envelope` i
`openclaw/plugin-sdk/inbound-reply-dispatch` dla tras/kopert przychodzących oraz
połączenia zapisywania i dyspozycji
- `openclaw/plugin-sdk/messaging-targets` dla parsowania/dopasowywania celów
- `openclaw/plugin-sdk/outbound-media` oraz
- `openclaw/plugin-sdk/outbound-media` i
`openclaw/plugin-sdk/outbound-runtime` dla ładowania multimediów oraz delegatów
tożsamości/wysyłania wychodzącego
tożsamości/wysyłki ruchu wychodzącego
- `openclaw/plugin-sdk/thread-bindings-runtime` dla cyklu życia powiązań wątków
i rejestracji adapterów
- `openclaw/plugin-sdk/agent-media-payload` tylko wtedy, gdy nadal wymagany jest
starszy układ pól ładunku agent/media
- `openclaw/plugin-sdk/telegram-command-config` dla normalizacji niestandardowych komend Telegram,
walidacji duplikatów/konfliktów oraz stabilnego dla rezerw kontraktu konfiguracji komend
starszy układ pól payloadu agenta/multimediów
- `openclaw/plugin-sdk/telegram-command-config` dla normalizacji niestandardowych poleceń Telegram,
walidacji duplikatów/konfliktów oraz kontraktu konfiguracji poleceń
stabilnego względem mechanizmu zapasowego
Kanały tylko z uwierzytelnianiem zwykle mogą zatrzymać się na ścieżce domyślnej: rdzeń obsługuje zatwierdzenia, a Plugin jedynie udostępnia możliwości outbound/auth. Kanały natywnych zatwierdzeń, takie jak Matrix, Slack, Telegram i niestandardowe transporty czatu, powinny używać współdzielonych helperów natywnych zamiast implementować własny cykl życia zatwierdzeń.
Kanały tylko z uwierzytelnianiem zwykle mogą zakończyć na ścieżce domyślnej: rdzeń obsługuje zatwierdzenia, a Plugin jedynie udostępnia możliwości ruchu wychodzącego/uwierzytelniania. Kanały natywnych zatwierdzeń, takie jak Matrix, Slack, Telegram i niestandardowe transporty czatu, powinny używać współdzielonych helperów natywnych zamiast implementować własny cykl życia zatwierdzeń.
## Zasady wzmianek przychodzących
Obsługę wzmianek przychodzących utrzymuj w podziale na dwie warstwy:
Obsługę wzmianek przychodzących utrzymuj podzieloną na dwie warstwy:
- gromadzenie danych należące do Pluginu
- współdzielona ocena zasad
- współdzielone ocenianie zasad
Dla warstwy współdzielonej używaj `openclaw/plugin-sdk/channel-inbound`.
Dla warstwy współdzielonej użyj `openclaw/plugin-sdk/channel-inbound`.
Dobre dopasowanie do logiki lokalnej dla Pluginu:
Dobrze pasuje do logiki lokalnej dla Pluginu:
- wykrywanie odpowiedzi do bota
- wykrywanie cytatów bota
- sprawdzanie uczestnictwa we wątku
- wykluczanie wiadomości usługowych/systemowych
- natywne dla platformy cache potrzebne do udowodnienia uczestnictwa bota
- wykrywanie cytatu bota
- sprawdzanie udziału w wątku
- wykluczenia wiadomości usługowych/systemowych
- natywne dla platformy cache potrzebne do potwierdzenia udziału bota
Dobre dopasowanie do współdzielonego helpera:
Dobrze pasuje do współdzielonego helpera:
- `requireMention`
- jawny wynik wzmianki
- lista dozwolonych niejawnych wzmianek
- obejście komend
- obejście poleceń
- ostateczna decyzja o pominięciu
Preferowany przepływ:
1. Oblicz lokalne fakty dotyczące wzmianek.
1. Oblicz lokalne fakty dotyczące wzmianki.
2. Przekaż te fakty do `resolveInboundMentionDecision({ facts, policy })`.
3. Użyj `decision.effectiveWasMentioned`, `decision.shouldBypassMention` i `decision.shouldSkip` w swojej bramce wejściowej.
3. Użyj `decision.effectiveWasMentioned`, `decision.shouldBypassMention` i `decision.shouldSkip` w swojej bramce ruchu przychodzącego.
```typescript
import {
@ -228,17 +232,17 @@ bundlowanych Pluginów kanałów, które już zależą od wstrzykiwania runtime:
- `resolveInboundMentionDecision`
Starsze helpery `resolveMentionGating*` pozostają w
`openclaw/plugin-sdk/channel-inbound` jedynie jako eksporty zgodności. Nowy kod
`openclaw/plugin-sdk/channel-inbound` jedynie jako eksporty zgodnościowe. Nowy kod
powinien używać `resolveInboundMentionDecision({ facts, policy })`.
## Omówienie
## Przewodnik
<Steps>
<a id="step-1-package-and-manifest"></a>
<Step title="Pakiet i manifest">
Utwórz standardowe pliki Pluginu. Pole `channel` w `package.json`
sprawia, że jest to Plugin kanału. Pełną powierzchnię metadanych pakietu
znajdziesz w [Konfiguracja i ustawienia Pluginu](/pl/plugins/sdk-setup#openclaw-channel):
Utwórz standardowe pliki Pluginu. Pole `channel` w `package.json` to
właśnie to, co sprawia, że jest to Plugin kanału. Pełną powierzchnię metadanych pakietu
znajdziesz w [Konfiguracja Pluginu i Config](/pl/plugins/sdk-setup#openclaw-channel):
<CodeGroup>
```json package.json
@ -252,7 +256,7 @@ powinien używać `resolveInboundMentionDecision({ facts, policy })`.
"channel": {
"id": "acme-chat",
"label": "Acme Chat",
"blurb": "Connect OpenClaw to Acme Chat."
"blurb": "Połącz OpenClaw z Acme Chat."
}
}
}
@ -264,7 +268,7 @@ powinien używać `resolveInboundMentionDecision({ facts, policy })`.
"kind": "channel",
"channels": ["acme-chat"],
"name": "Acme Chat",
"description": "Acme Chat channel plugin",
"description": "Plugin kanału Acme Chat",
"configSchema": {
"type": "object",
"additionalProperties": false,
@ -289,7 +293,7 @@ powinien używać `resolveInboundMentionDecision({ facts, policy })`.
<Step title="Zbuduj obiekt Pluginu kanału">
Interfejs `ChannelPlugin` ma wiele opcjonalnych powierzchni adapterów. Zacznij od
minimum — `id` i `setup` — i dodawaj adaptery w miarę potrzeb.
minimum — `id` i `setup` — i dodawaj adaptery w razie potrzeby.
Utwórz `src/channel.ts`:
@ -299,7 +303,7 @@ powinien używać `resolveInboundMentionDecision({ facts, policy })`.
createChannelPluginBase,
} from "openclaw/plugin-sdk/channel-core";
import type { OpenClawConfig } from "openclaw/plugin-sdk/channel-core";
import { acmeChatApi } from "./client.js"; // your platform API client
import { acmeChatApi } from "./client.js"; // klient API Twojej platformy
type ResolvedAccount = {
accountId: string | null;
@ -340,7 +344,7 @@ powinien używać `resolveInboundMentionDecision({ facts, policy })`.
},
}),
// DM security: who can message the bot
// Bezpieczeństwo DM: kto może wysyłać wiadomości do bota
security: {
dm: {
channelKey: "acme-chat",
@ -350,21 +354,21 @@ powinien używać `resolveInboundMentionDecision({ facts, policy })`.
},
},
// Pairing: approval flow for new DM contacts
// Parowanie: przepływ zatwierdzania dla nowych kontaktów DM
pairing: {
text: {
idLabel: "Acme Chat username",
message: "Send this code to verify your identity:",
idLabel: "Nazwa użytkownika Acme Chat",
message: "Wyślij ten kod, aby zweryfikować swoją tożsamość:",
notify: async ({ target, code }) => {
await acmeChatApi.sendDm(target, `Pairing code: ${code}`);
},
},
},
// Threading: how replies are delivered
// Wątkowanie: sposób dostarczania odpowiedzi
threading: { topLevelReplyToMode: "reply" },
// Outbound: send messages to the platform
// Ruch wychodzący: wysyłanie wiadomości na platformę
outbound: {
attachedResults: {
sendText: async (params) => {
@ -385,17 +389,17 @@ powinien używać `resolveInboundMentionDecision({ facts, policy })`.
```
<Accordion title="Co robi za Ciebie createChatChannelPlugin">
Zamiast ręcznie implementować niskopoziomowe interfejsy adapterów, przekazujesz
deklaratywne opcje, a kreator je składa:
Zamiast ręcznie implementować niskopoziomowe interfejsy adapterów,
przekazujesz deklaratywne opcje, a konstruktor składa je razem:
| Opcja | Co podłącza |
| --- | --- |
| `security.dm` | Rozpoznawanie zabezpieczeń DM z zakresem z pól konfiguracji |
| `pairing.text` | Przepływ parowania DM oparty na tekście z wymianą kodów |
| `threading` | Rozpoznawanie trybu reply-to (stały, z zakresem konta lub niestandardowy) |
| `outbound.attachedResults` | Funkcje wysyłania zwracające metadane wyniku (identyfikatory wiadomości) |
| `security.dm` | Resolver bezpieczeństwa DM o zakresie z pól config |
| `pairing.text` | Przepływ parowania DM oparty na tekście z wymianą kodu |
| `threading` | Resolver trybu odpowiedzi (stały, o zakresie konta lub niestandardowy) |
| `outbound.attachedResults` | Funkcje wysyłania, które zwracają metadane wyniku (identyfikatory wiadomości) |
Możesz również przekazać surowe obiekty adapterów zamiast opcji deklaratywnych,
Możesz też przekazać surowe obiekty adapterów zamiast deklaratywnych opcji,
jeśli potrzebujesz pełnej kontroli.
</Accordion>
@ -411,20 +415,20 @@ powinien używać `resolveInboundMentionDecision({ facts, policy })`.
export default defineChannelPluginEntry({
id: "acme-chat",
name: "Acme Chat",
description: "Acme Chat channel plugin",
description: "Plugin kanału Acme Chat",
plugin: acmeChatPlugin,
registerCliMetadata(api) {
api.registerCli(
({ program }) => {
program
.command("acme-chat")
.description("Acme Chat management");
.description("Zarządzanie Acme Chat");
},
{
descriptors: [
{
name: "acme-chat",
description: "Acme Chat management",
description: "Zarządzanie Acme Chat",
hasSubcommands: false,
},
],
@ -438,15 +442,16 @@ powinien używać `resolveInboundMentionDecision({ facts, policy })`.
```
Umieść deskryptory CLI należące do kanału w `registerCliMetadata(...)`, aby OpenClaw
mógł pokazywać je w pomocy głównej bez aktywowania pełnego runtime kanału,
podczas gdy zwykłe pełne ładowania nadal pobierają te same deskryptory do rzeczywistej
rejestracji komend. Zachowaj `registerFull(...)` dla pracy tylko w runtime.
Jeśli `registerFull(...)` rejestruje metody RPC Gateway, użyj prefiksu
specyficznego dla Pluginu. Przestrzenie nazw administratora rdzenia (`config.*`,
mógł pokazywać je w głównej pomocy bez aktywowania pełnego runtime kanału,
podczas gdy zwykłe pełne ładowania nadal pobiorą te same deskryptory do rzeczywistej
rejestracji poleceń. `registerFull(...)` zachowaj dla pracy wyłącznie w runtime.
Jeśli `registerFull(...)` rejestruje metody RPC Gateway, użyj
prefiksu specyficznego dla Pluginu. Przestrzenie nazw administracyjnych rdzenia (`config.*`,
`exec.approvals.*`, `wizard.*`, `update.*`) pozostają zarezerwowane i zawsze
rozwiązują się do `operator.admin`.
`defineChannelPluginEntry` automatycznie obsługuje podział trybów rejestracji. Wszystkie
opcje znajdziesz w [Punkty wejścia](/pl/plugins/sdk-entrypoints#definechannelpluginentry).
są rozwiązywane do `operator.admin`.
`defineChannelPluginEntry` automatycznie obsługuje podział trybów rejestracji. Zobacz
[Punkty wejścia](/pl/plugins/sdk-entrypoints#definechannelpluginentry), aby poznać wszystkie
opcje.
</Step>
@ -462,26 +467,31 @@ powinien używać `resolveInboundMentionDecision({ facts, policy })`.
OpenClaw ładuje to zamiast pełnego punktu wejścia, gdy kanał jest wyłączony
lub nieskonfigurowany. Pozwala to uniknąć wciągania ciężkiego kodu runtime podczas przepływów konfiguracji.
Szczegóły znajdziesz w [Konfiguracja i ustawienia](/pl/plugins/sdk-setup#setup-entry).
Szczegóły znajdziesz w [Konfiguracja i Config](/pl/plugins/sdk-setup#setup-entry).
Bundlowane kanały workspace, które rozdzielają eksporty bezpieczne dla konfiguracji do modułów
pomocniczych, mogą używać `defineBundledChannelSetupEntry(...)` z
`openclaw/plugin-sdk/channel-entry-contract`, gdy potrzebują także
jawnego settera runtime dla czasu konfiguracji.
</Step>
<Step title="Obsłuż wiadomości przychodzące">
Twój Plugin musi odbierać wiadomości z platformy i przekazywać je do
OpenClaw. Typowy wzorzec to Webhook, który weryfikuje żądanie i
dyspozytuje je przez handler wejściowy Twojego kanału:
przekazuje je przez handler przychodzący Twojego kanału:
```typescript
registerFull(api) {
api.registerHttpRoute({
path: "/acme-chat/webhook",
auth: "plugin", // plugin-managed auth (verify signatures yourself)
auth: "plugin", // uwierzytelnianie zarządzane przez Plugin (samodzielnie zweryfikuj podpisy)
handler: async (req, res) => {
const event = parseWebhookPayload(req);
// Your inbound handler dispatches the message to OpenClaw.
// The exact wiring depends on your platform SDK
// see a real example in the bundled Microsoft Teams or Google Chat plugin package.
// Twój handler przychodzący przekazuje wiadomość do OpenClaw.
// Dokładne podłączenie zależy od SDK Twojej platformy
// zobacz rzeczywisty przykład w bundlowanym pakiecie Pluginu Microsoft Teams lub Google Chat.
await handleAcmeChatInbound(api, event);
res.statusCode = 200;
@ -494,22 +504,22 @@ powinien używać `resolveInboundMentionDecision({ facts, policy })`.
<Note>
Obsługa wiadomości przychodzących jest specyficzna dla kanału. Każdy Plugin kanału
odpowiada za własny pipeline wejściowy. Zobacz bundlowane Pluginy kanałów
posiada własny potok przychodzący. Zobacz bundlowane Pluginy kanałów
(na przykład pakiet Pluginu Microsoft Teams lub Google Chat), aby poznać rzeczywiste wzorce.
</Note>
</Step>
<a id="step-6-test"></a>
<Step title="Testuj">
Napisz testy kolokowane w `src/channel.test.ts`:
<Step title="Test">
Pisz testy współlokowane w `src/channel.test.ts`:
```typescript src/channel.test.ts
import { describe, it, expect } from "vitest";
import { acmeChatPlugin } from "./channel.js";
describe("acme-chat plugin", () => {
it("resolves account from config", () => {
describe("plugin acme-chat", () => {
it("rozpoznaje konto na podstawie config", () => {
const cfg = {
channels: {
"acme-chat": { token: "test-token", allowFrom: ["user1"] },
@ -519,7 +529,7 @@ Napisz testy kolokowane w `src/channel.test.ts`:
expect(account.token).toBe("test-token");
});
it("inspects account without materializing secrets", () => {
it("sprawdza konto bez materializowania sekretów", () => {
const cfg = {
channels: { "acme-chat": { token: "test-token" } },
} as any;
@ -528,7 +538,7 @@ Napisz testy kolokowane w `src/channel.test.ts`:
expect(result.tokenStatus).toBe("available");
});
it("reports missing config", () => {
it("zgłasza brakujący config", () => {
const cfg = { channels: {} } as any;
const result = acmeChatPlugin.setup!.inspectAccount!(cfg, undefined);
expect(result.configured).toBe(false);
@ -550,25 +560,25 @@ Napisz testy kolokowane w `src/channel.test.ts`:
```
<bundled-plugin-root>/acme-chat/
├── package.json # metadane openclaw.channel
├── openclaw.plugin.json # Manifest ze schematem konfiguracji
├── openclaw.plugin.json # Manifest z schematem config
├── index.ts # defineChannelPluginEntry
├── setup-entry.ts # defineSetupPluginEntry
├── api.ts # Eksporty publiczne (opcjonalnie)
├── runtime-api.ts # Wewnętrzne eksporty runtime (opcjonalnie)
├── runtime-api.ts # Eksporty wewnętrznego runtime (opcjonalnie)
└── src/
├── channel.ts # ChannelPlugin przez createChatChannelPlugin
├── channel.test.ts # Testy
├── client.ts # Klient API platformy
└── runtime.ts # Magazyn runtime (w razie potrzeby)
└── runtime.ts # Magazyn runtime (jeśli potrzebny)
```
## Tematy zaawansowane
<CardGroup cols={2}>
<Card title="Opcje wątkowania" icon="git-branch" href="/pl/plugins/sdk-entrypoints#registration-mode">
Stałe, z zakresem konta lub niestandardowe tryby odpowiedzi
Stałe, o zakresie konta lub niestandardowe tryby odpowiedzi
</Card>
<Card title="Integracja narzędzia wiadomości" icon="puzzle" href="/pl/plugins/architecture#channel-plugins-and-the-shared-message-tool">
<Card title="Integracja z narzędziem wiadomości" icon="puzzle" href="/pl/plugins/architecture#channel-plugins-and-the-shared-message-tool">
describeMessageTool i wykrywanie akcji
</Card>
<Card title="Rozpoznawanie celu" icon="crosshair" href="/pl/plugins/architecture#channel-target-resolution">
@ -580,10 +590,7 @@ Napisz testy kolokowane w `src/channel.test.ts`:
</CardGroup>
<Note>
Niektóre bundlowane powierzchnie helperów nadal istnieją na potrzeby utrzymania
bundlowanych Pluginów i zgodności. Nie są one zalecanym wzorcem dla nowych Pluginów kanałów;
preferuj ogólne podścieżki channel/setup/reply/runtime ze wspólnej
powierzchni SDK, chyba że bezpośrednio utrzymujesz tę rodzinę bundlowanych Pluginów.
Niektóre bundlowane powierzchnie helperów nadal istnieją na potrzeby utrzymania bundlowanych Pluginów i zgodności. Nie są one zalecanym wzorcem dla nowych Pluginów kanałów; preferuj ogólne podścieżki channel/setup/reply/runtime ze wspólnej powierzchni SDK, chyba że bezpośrednio utrzymujesz tę rodzinę bundlowanych Pluginów.
</Note>
## Następne kroki

View File

@ -1,35 +1,34 @@
---
read_when:
- Potrzebujesz dokładnej sygnatury typu dla definePluginEntry lub defineChannelPluginEntry
- Chcesz zrozumieć tryb rejestracji (pełny vs setup vs metadane CLI)
- Potrzebujesz dokładnej sygnatury typu `definePluginEntry` lub `defineChannelPluginEntry`
- Chcesz zrozumieć tryb rejestracji (pełny vs konfiguracja vs metadane CLI)
- Szukasz opcji punktu wejścia
sidebarTitle: Entry Points
summary: Dokumentacja referencyjna dla definePluginEntry, defineChannelPluginEntry i defineSetupPluginEntry
title: Punkty wejścia pluginów
summary: Odniesienie do `definePluginEntry`, `defineChannelPluginEntry` i `defineSetupPluginEntry`
title: Punkty wejścia Pluginu
x-i18n:
generated_at: "2026-04-05T14:01:43Z"
generated_at: "2026-04-15T19:41:35Z"
model: gpt-5.4
provider: openai
source_hash: 799dbfe71e681dd8ba929a7a631dfe745c3c5c69530126fea2f9c137b120f51f
source_hash: aabca25bc9b8ff1b5bb4852bafe83640ffeba006ea6b6a8eff4e2c37a10f1fe4
source_path: plugins/sdk-entrypoints.md
workflow: 15
---
# Punkty wejścia pluginów
# Punkty wejścia Pluginu
Każdy plugin eksportuje domyślny obiekt entry. SDK udostępnia trzy pomocnicze funkcje do ich tworzenia.
Każdy Plugin eksportuje domyślny obiekt punktu wejścia. SDK udostępnia trzy pomocnicze funkcje do ich tworzenia.
<Tip>
**Szukasz przewodnika krok po kroku?** Zobacz [Pluginy kanałów](/plugins/sdk-channel-plugins)
lub [Pluginy providerów](/plugins/sdk-provider-plugins), aby zapoznać się z instrukcjami krok po kroku.
**Szukasz przewodnika krok po kroku?** Zobacz [Pluginy kanałów](/pl/plugins/sdk-channel-plugins)
lub [Pluginy dostawców](/pl/plugins/sdk-provider-plugins), aby skorzystać z instrukcji krok po kroku.
</Tip>
## `definePluginEntry`
**Import:** `openclaw/plugin-sdk/plugin-entry`
Dla pluginów providerów, pluginów narzędzi, pluginów hooków i wszystkiego, co **nie jest**
kanałem wiadomości.
Dla Pluginów dostawców, Pluginów narzędzi, Pluginów hooków i wszystkiego, co **nie** jest kanałem wiadomości.
```typescript
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
@ -49,28 +48,26 @@ export default definePluginEntry({
});
```
| Pole | Typ | Wymagane | Domyślnie |
| -------------- | ---------------------------------------------------------------- | -------- | ------------------ |
| `id` | `string` | Tak | — |
| `name` | `string` | Tak | — |
| `description` | `string` | Tak | — |
| `kind` | `string` | Nie | — |
| 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 | — |
| `register` | `(api: OpenClawPluginApi) => void` | Tak | — |
- `id` musi odpowiadać manifestowi `openclaw.plugin.json`.
- `kind` służy do wyłącznych slotów: `"memory"` lub `"context-engine"`.
- `configSchema` może być funkcją do leniwej ewaluacji.
- OpenClaw rozwiązuje i zapamiętuje ten schemat przy pierwszym dostępie, więc kosztowne
konstruktory schematów uruchamiają się tylko raz.
- OpenClaw rozwiązuje i zapamiętuje 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` logiką specyficzną dla kanałów. Automatycznie wywołuje
`api.registerChannel({ plugin })`, udostępnia opcjonalny seam metadanych CLI dla
głównej pomocy i warunkuje `registerFull` trybem rejestracji.
`api.registerChannel({ plugin })`, udostępnia opcjonalny punkt integracji metadanych CLI dla pomocy głównej i uzależnia `registerFull` od trybu rejestracji.
```typescript
import { defineChannelPluginEntry } from "openclaw/plugin-sdk/channel-core";
@ -90,36 +87,35 @@ export default defineChannelPluginEntry({
});
```
| Pole | Typ | Wymagane | Domyślnie |
| --------------------- | ---------------------------------------------------------------- | -------- | ------------------ |
| `id` | `string` | Tak | — |
| `name` | `string` | Tak | — |
| `description` | `string` | Tak | — |
| `plugin` | `ChannelPlugin` | Tak | — |
| 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 | — |
| `setRuntime` | `(runtime: PluginRuntime) => void` | Nie | — |
| `registerCliMetadata` | `(api: OpenClawPluginApi) => void` | Nie | — |
| `registerFull` | `(api: OpenClawPluginApi) => void` | Nie | — |
- `setRuntime` jest wywoływane podczas rejestracji, aby można było zapisać referencję runtime
(zwykle przez `createPluginRuntimeStore`). Jest pomijane podczas przechwytywania
metadanych CLI.
- `setRuntime` jest wywoływane podczas rejestracji, aby można było przechować referencję do runtime
(zwykle za pomocą `createPluginRuntimeStore`). Jest pomijane podczas
przechwytywania metadanych CLI.
- `registerCliMetadata` działa zarówno przy `api.registrationMode === "cli-metadata"`,
jak i `api.registrationMode === "full"`.
Używaj go jako kanonicznego miejsca dla deskryptorów CLI należących do kanału, aby
główna pomoc pozostawała nieaktywująca, a jednocześnie normalna rejestracja poleceń CLI
była zgodna z pełnym ładowaniem pluginów.
Używaj go jako kanonicznego miejsca dla deskryptorów CLI należących do kanału, aby pomoc główna
nie aktywowała ładowania, a jednocześnie zwykła rejestracja poleceń CLI pozostała zgodna
z pełnym ładowaniem Pluginu.
- `registerFull` działa tylko wtedy, gdy `api.registrationMode === "full"`. Jest pomijane
podczas ładowania tylko do setupu.
podczas ładowania tylko do konfiguracji.
- Podobnie jak `definePluginEntry`, `configSchema` może być leniwą fabryką, a OpenClaw
zapamiętuje rozwiązany schemat przy pierwszym dostępie.
- Dla należących do pluginu głównych poleceń CLI preferuj `api.registerCli(..., { descriptors: [...] })`,
gdy chcesz, aby polecenie pozostało ładowane leniwie, ale nie znikało z
głównego drzewa parsowania CLI. W przypadku pluginów kanałów preferuj rejestrowanie tych
deskryptorów z poziomu `registerCliMetadata(...)`, a `registerFull(...)` pozostaw
do pracy wyłącznie runtime.
- Jeśli `registerFull(...)` rejestruje również metody Gateway RPC, trzymaj je pod
prefiksem specyficznym dla pluginu. Zarezerwowane główne przestrzenie nazw administratora (`config.*`,
- Dla głównych poleceń CLI należących do Pluginu preferuj `api.registerCli(..., { descriptors: [...] })`,
gdy chcesz, aby polecenie pozostało ładowane leniwie bez znikania z
drzewa parsowania głównego CLI. W przypadku Pluginów kanałów preferuj rejestrowanie takich deskryptorów
z poziomu `registerCliMetadata(...)`, a `registerFull(...)` pozostaw do pracy wyłącznie związanej z runtime.
- Jeśli `registerFull(...)` rejestruje także metody Gateway RPC, utrzymuj je pod
prefiksem specyficznym dla Pluginu. Zastrzeżone przestrzenie nazw administracyjnych rdzenia (`config.*`,
`exec.approvals.*`, `wizard.*`, `update.*`) są zawsze wymuszane do
`operator.admin`.
@ -136,34 +132,58 @@ import { defineSetupPluginEntry } from "openclaw/plugin-sdk/channel-core";
export default defineSetupPluginEntry(myChannelPlugin);
```
OpenClaw ładuje to zamiast pełnego entry, gdy kanał jest wyłączony,
nieskonfigurowany albo gdy włączone jest odroczone ładowanie. Zobacz
[Setup i konfiguracja](/plugins/sdk-setup#setup-entry), aby dowiedzieć się, kiedy ma to znaczenie.
OpenClaw ładuje to zamiast pełnego punktu wejścia, gdy kanał jest wyłączony,
nieskonfigurowany lub gdy włączone jest ładowanie odroczone. Zobacz
[Konfiguracja i ustawienia](/pl/plugins/sdk-setup#setup-entry), aby dowiedzieć się, kiedy ma to znaczenie.
W praktyce łącz `defineSetupPluginEntry(...)` z wąskimi rodzinami helperów setupu:
W praktyce łącz `defineSetupPluginEntry(...)` z wąskimi rodzinami pomocników konfiguracji:
- `openclaw/plugin-sdk/setup-runtime` dla bezpiecznych dla runtime helperów setupu, takich jak
bezpieczne importowo adaptery poprawek setupu, wyjście `lookup-note`,
`promptResolvedAllowFrom`, `splitSetupEntries` i delegowane proxy setupu
- `openclaw/plugin-sdk/channel-setup` dla opcjonalnych powierzchni setupu instalacji
- `openclaw/plugin-sdk/setup-tools` dla helperów CLI/archiwów/dokumentacji setupu i instalacji
- `openclaw/plugin-sdk/setup-runtime` dla bezpiecznych względem runtime pomocników konfiguracji, takich jak
adaptery łatek konfiguracji bezpieczne przy imporcie, dane wyjściowe `lookup-note`,
`promptResolvedAllowFrom`, `splitSetupEntries` i delegowane proxy konfiguracji
- `openclaw/plugin-sdk/channel-setup` dla powierzchni konfiguracji opcjonalnej instalacji
- `openclaw/plugin-sdk/setup-tools` dla pomocników CLI/archiwum/dokumentacji konfiguracji i instalacji
Ciężkie SDK, rejestrację CLI i długowieczne usługi runtime trzymaj w pełnym
entry.
Ciężkie SDK, rejestrację CLI i długowieczne usługi runtime pozostaw w pełnym
punkcie wejścia.
Kanały workspace dołączone do repozytorium, które rozdzielają powierzchnie konfiguracji i runtime, mogą zamiast tego używać
`defineBundledChannelSetupEntry(...)` z
`openclaw/plugin-sdk/channel-entry-contract`. Ten kontrakt pozwala zachować w punkcie wejścia konfiguracji
eksporty plugin/secrets bezpieczne dla konfiguracji, a jednocześnie nadal udostępnia setter runtime:
```typescript
import { defineBundledChannelSetupEntry } from "openclaw/plugin-sdk/channel-entry-contract";
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 rzeczywiście wymagają lekkiego
settera runtime przed załadowaniem pełnego punktu wejścia kanału.
## Tryb rejestracji
`api.registrationMode` informuje plugin, jak został załadowany:
`api.registrationMode` informuje Plugin, w jaki sposób został załadowany:
| Tryb | Kiedy | Co rejestrować |
| ----------------- | --------------------------------- | ----------------------------------------------------------------------------------------- |
| `"full"` | Normalny start Gateway | Wszystko |
| `"full"` | Normalne uruchomienie Gateway | Wszystko |
| `"setup-only"` | Wyłączony/nieskonfigurowany kanał | Tylko rejestrację kanału |
| `"setup-runtime"` | Przepływ setupu z dostępnym runtime | Rejestrację kanału oraz tylko lekki runtime potrzebny przed załadowaniem pełnego entry |
| `"cli-metadata"` | Główna pomoc / przechwytywanie metadanych CLI | Tylko deskryptory CLI |
| `"setup-runtime"` | Przepływ konfiguracji z dostępnym runtime | Rejestrację kanału oraz tylko lekki runtime potrzebny przed załadowaniem pełnego punktu wejścia |
| `"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, sprawdź tryb samodzielnie:
`defineChannelPluginEntry` automatycznie obsługuje ten podział. Jeśli używasz
bezpośrednio `definePluginEntry` dla kanału, samodzielnie sprawdzaj tryb:
```typescript
register(api) {
@ -175,42 +195,41 @@ register(api) {
api.registerChannel({ plugin: myPlugin });
if (api.registrationMode !== "full") return;
// Ciężkie rejestracje wyłącznie runtime
// Heavy runtime-only registrations
api.registerService(/* ... */);
}
```
Traktuj `"setup-runtime"` jako okno, w którym powierzchnie startowe tylko do setupu muszą
istnieć bez ponownego wchodzenia do pełnego środowiska runtime zbundlowanego kanału. Dobrze pasują tu
rejestracja kanału, bezpieczne dla setupu trasy HTTP, bezpieczne dla setupu metody Gateway oraz
delegowane helpery setupu. Ciężkie usługi działające w tle, rejestratory CLI oraz
bootstrapy SDK providerów/klientów nadal należą do `"full"`.
Traktuj `"setup-runtime"` jako okno, w którym powierzchnie uruchomieniowe tylko do konfiguracji muszą
istnieć bez ponownego wchodzenia do pełnego runtime dołączonego kanału. Dobrze pasują tu:
rejestracja kanału, bezpieczne dla konfiguracji trasy HTTP, bezpieczne dla konfiguracji metody Gateway oraz
delegowane pomocniki konfiguracji. Ciężkie usługi działające w tle, rejestratory CLI oraz bootstrapy SDK dostawców/klientów nadal należą do `"full"`.
W szczególności dla rejestratorów CLI:
Konkretnie dla rejestratorów CLI:
- używaj `descriptors`, gdy rejestrator posiada jedno lub więcej głównych poleceń i
chcesz, aby OpenClaw ładował właściwy moduł CLI leniwie przy pierwszym wywołaniu
- upewnij się, że te deskryptory obejmują każdy główny korzeń polecenia udostępniany przez
- używaj `descriptors`, gdy rejestrator zarządza co najmniej jednym głównym poleceniem i
chcesz, aby OpenClaw leniwie załadował rzeczywisty moduł CLI przy pierwszym wywołaniu
- upewnij się, że te deskryptory obejmują każdy główny korzeń poleceń udostępniany przez
rejestrator
- używaj samego `commands` tylko dla ścieżek zgodności eager
## Kształty pluginów
## Kształty Pluginów
OpenClaw klasyfikuje załadowane pluginy według ich zachowania rejestracyjnego:
OpenClaw klasyfikuje załadowane Pluginy według ich zachowania podczas rejestracji:
| Kształt | Opis |
| -------------------- | -------------------------------------------------- |
| **plain-capability** | Jeden typ możliwości (np. tylko provider) |
| **hybrid-capability** | Wiele typów możliwości (np. provider + speech) |
| **hook-only** | Tylko hooki, bez możliwości |
| **non-capability** | Narzędzia/polecenia/usługi, ale bez możliwości |
| Kształt | Opis |
| --------------------- | -------------------------------------------------- |
| **plain-capability** | Jeden typ capability (np. tylko dostawca) |
| **hybrid-capability** | Wiele typów capability (np. dostawca + mowa) |
| **hook-only** | Tylko hooki, bez capability |
| **non-capability** | Narzędzia/polecenia/usługi, ale bez capability |
Użyj `openclaw plugins inspect <id>`, aby zobaczyć kształt pluginu.
Użyj `openclaw plugins inspect <id>`, aby zobaczyć kształt Pluginu.
## Powiązane
- [Przegląd SDK](/plugins/sdk-overview) — API rejestracji i dokumentacja subpath
- [Helpery runtime](/plugins/sdk-runtime) — `api.runtime` i `createPluginRuntimeStore`
- [Setup i konfiguracja](/plugins/sdk-setup) — manifest, setup entry, odroczone ładowanie
- [Pluginy kanałów](/plugins/sdk-channel-plugins) — budowanie obiektu `ChannelPlugin`
- [Pluginy providerów](/plugins/sdk-provider-plugins) — rejestracja providerów i hooki
- [Przegląd SDK](/pl/plugins/sdk-overview) — API rejestracji i opis subpathów
- [Pomocniki runtime](/pl/plugins/sdk-runtime) — `api.runtime` i `createPluginRuntimeStore`
- [Konfiguracja i ustawienia](/pl/plugins/sdk-setup) — manifest, punkt wejścia konfiguracji, ładowanie odroczone
- [Pluginy kanałów](/pl/plugins/sdk-channel-plugins) — budowanie obiektu `ChannelPlugin`
- [Pluginy dostawców](/pl/plugins/sdk-provider-plugins) — rejestracja dostawcy i hooki

View File

@ -1,28 +1,29 @@
---
read_when:
- Musisz wywoływać pomocniki core z pluginu (TTS, STT, generowanie obrazów, wyszukiwanie w sieci, subagent)
- Musisz wywołać pomocnicze funkcje rdzenia z Pluginu (TTS, STT, generowanie obrazów, wyszukiwanie w sieci, subagent)
- Chcesz zrozumieć, co udostępnia `api.runtime`
- Uzyskujesz dostęp do pomocników config, agenta lub mediów z kodu pluginu
- Uzyskujesz dostęp do pomocniczych funkcji konfiguracji, agenta lub multimediów z kodu Pluginu
sidebarTitle: Runtime Helpers
summary: api.runtime -- wstrzyknięte pomocniki runtime dostępne dla pluginów
title: Pomocniki runtime pluginów
summary: api.runtime — wstrzyknięte pomocnicze funkcje środowiska uruchomieniowego dostępne dla Pluginów
title: Pomocnicze funkcje środowiska uruchomieniowego Pluginu
x-i18n:
generated_at: "2026-04-11T02:46:51Z"
generated_at: "2026-04-15T19:41:38Z"
model: gpt-5.4
provider: openai
source_hash: fbf8a6ecd970300f784b8aca20eed40ba12c83107abd27385bfdc3347d2544be
source_hash: c77a6e9cd48c84affa17dce684bbd0e072c8b63485e4a5d569f3793a4ea4f9c8
source_path: plugins/sdk-runtime.md
workflow: 15
---
# Pomocniki runtime pluginów
# Pomocnicze funkcje środowiska uruchomieniowego Pluginu
Dokumentacja referencyjna obiektu `api.runtime` wstrzykiwanego do każdego pluginu podczas rejestracji. Używaj tych pomocników zamiast bezpośrednio importować wewnętrzne elementy hosta.
Dokumentacja referencyjna obiektu `api.runtime` wstrzykiwanego do każdego Pluginu podczas
rejestracji. Używaj tych funkcji pomocniczych zamiast bezpośrednio importować elementy wewnętrzne hosta.
<Tip>
**Szukasz przewodnika?** Zobacz [Pluginy kanałów](/pl/plugins/sdk-channel-plugins)
lub [Provider Plugins](/pl/plugins/sdk-provider-plugins), aby skorzystać z
przewodników krok po kroku pokazujących te pomocniki w kontekście.
**Szukasz omówienia?** Zobacz [Pluginy kanałów](/pl/plugins/sdk-channel-plugins)
lub [Pluginy dostawców](/pl/plugins/sdk-provider-plugins), aby zapoznać się z przewodnikami krok po kroku,
które pokazują te funkcje pomocnicze w kontekście.
</Tip>
```typescript
@ -31,11 +32,11 @@ register(api) {
}
```
## Przestrzenie nazw runtime
## Przestrzenie nazw środowiska uruchomieniowego
### `api.runtime.agent`
Tożsamość agenta, katalogi i zarządzanie sesją.
Tożsamość agenta, katalogi i zarządzanie sesjami.
```typescript
// Resolve the agent's working directory
@ -68,11 +69,13 @@ const result = await api.runtime.agent.runEmbeddedAgent({
});
```
`runEmbeddedAgent(...)` to neutralny pomocnik do uruchamiania zwykłej tury agenta OpenClaw z kodu pluginu. Używa tego samego rozstrzygania providera/modelu oraz tego samego wyboru agent harness co odpowiedzi wywoływane przez kanał.
`runEmbeddedAgent(...)` to neutralna funkcja pomocnicza do uruchamiania zwykłego przebiegu
agenta OpenClaw z kodu Pluginu. Używa tego samego rozpoznawania dostawcy/modelu i
wyboru uprzęży agenta co odpowiedzi wywoływane przez kanał.
`runEmbeddedPiAgent(...)` pozostaje aliasem zgodności.
**Pomocniki magazynu sesji** znajdują się w `api.runtime.agent.session`:
**Funkcje pomocnicze magazynu sesji** znajdują się w `api.runtime.agent.session`:
```typescript
const storePath = api.runtime.agent.session.resolveStorePath(cfg);
@ -83,7 +86,7 @@ const filePath = api.runtime.agent.session.resolveSessionFilePath(cfg, sessionId
### `api.runtime.agent.defaults`
Domyślne stałe modelu i providera:
Stałe domyślnego modelu i dostawcy:
```typescript
const model = api.runtime.agent.defaults.model; // np. "anthropic/claude-sonnet-4-6"
@ -92,7 +95,7 @@ const provider = api.runtime.agent.defaults.provider; // np. "anthropic"
### `api.runtime.subagent`
Uruchamiaj i zarządzaj uruchomieniami subagenta w tle.
Uruchamianie i zarządzanie przebiegami subagentów w tle.
```typescript
// Start a subagent run
@ -120,14 +123,15 @@ await api.runtime.subagent.deleteSession({
```
<Warning>
Nadpisania modelu (`provider`/`model`) wymagają zgody operatora przez
Nadpisania modelu (`provider`/`model`) wymagają zgody operatora poprzez
`plugins.entries.<id>.subagent.allowModelOverride: true` w konfiguracji.
Niezaufane pluginy nadal mogą uruchamiać subagentów, ale żądania nadpisania są odrzucane.
Niezaufane Pluginy nadal mogą uruchamiać subagentów, ale żądania nadpisania są odrzucane.
</Warning>
### `api.runtime.taskFlow`
Powiąż runtime Task Flow z istniejącym kluczem sesji OpenClaw lub zaufanym kontekstem narzędzia, a następnie twórz i zarządzaj Task Flows bez przekazywania ownera przy każdym wywołaniu.
Powiąż środowisko uruchomieniowe TaskFlow z istniejącym kluczem sesji OpenClaw lub zaufanym
kontekstem narzędzia, a następnie twórz i zarządzaj TaskFlow bez przekazywania właściciela przy każdym wywołaniu.
```typescript
const taskFlow = api.runtime.taskFlow.fromToolContext(ctx);
@ -154,11 +158,12 @@ const waiting = taskFlow.setWaiting({
});
```
Użyj `bindSession({ sessionKey, requesterOrigin })`, gdy masz już zaufany klucz sesji OpenClaw z własnej warstwy powiązania. Nie wiąż sesji na podstawie surowych danych wejściowych użytkownika.
Użyj `bindSession({ sessionKey, requesterOrigin })`, gdy masz już zaufany klucz sesji OpenClaw
z własnej warstwy powiązania. Nie twórz powiązania na podstawie surowych danych wejściowych użytkownika.
### `api.runtime.tts`
Synteza mowy.
Synteza mowy z tekstu.
```typescript
// Standard TTS
@ -180,11 +185,12 @@ const voices = await api.runtime.tts.listVoices({
});
```
Używa konfiguracji core `messages.tts` i wyboru providera. Zwraca bufor audio PCM + sample rate.
Używa podstawowej konfiguracji `messages.tts` i wyboru dostawcy. Zwraca bufor
dźwięku PCM + częstotliwość próbkowania.
### `api.runtime.mediaUnderstanding`
Analiza obrazów, audio i wideo.
Analiza obrazów, dźwięku i wideo.
```typescript
// Describe an image
@ -214,11 +220,11 @@ const result = await api.runtime.mediaUnderstanding.runFile({
});
```
Zwraca `{ text: undefined }`, gdy nie powstaje żaden wynik (np. przy pominiętym wejściu).
Zwraca `{ text: undefined }`, gdy nie zostanie wygenerowany żaden wynik (np. pominięte dane wejściowe).
<Info>
`api.runtime.stt.transcribeAudioFile(...)` pozostaje aliasem zgodności dla
`api.runtime.mediaUnderstanding.transcribeAudioFile(...)`.
`api.runtime.stt.transcribeAudioFile(...)` pozostaje aliasem zgodności
dla `api.runtime.mediaUnderstanding.transcribeAudioFile(...)`.
</Info>
### `api.runtime.imageGeneration`
@ -249,7 +255,7 @@ const result = await api.runtime.webSearch.search({
### `api.runtime.media`
Niskopoziomowe narzędzia mediów.
Niskopoziomowe narzędzia multimedialne.
```typescript
const webMedia = await api.runtime.media.loadWebMedia(url);
@ -304,7 +310,7 @@ const childLogger = api.runtime.logging.getChildLogger({ plugin: "my-plugin" },
### `api.runtime.modelAuth`
Rozstrzyganie auth modeli i providerów.
Rozpoznawanie uwierzytelniania modelu i dostawcy.
```typescript
const auth = await api.runtime.modelAuth.getApiKeyForModel({ model, cfg });
@ -316,7 +322,7 @@ const providerAuth = await api.runtime.modelAuth.resolveApiKeyForProvider({
### `api.runtime.state`
Rozstrzyganie katalogu stanu.
Rozpoznawanie katalogu stanu.
```typescript
const stateDir = api.runtime.state.resolveStateDir();
@ -334,9 +340,10 @@ api.runtime.tools.registerMemoryCli(/* ... */);
### `api.runtime.channel`
Pomocniki runtime specyficzne dla kanału (dostępne, gdy załadowany jest plugin kanału).
Funkcje pomocnicze środowiska uruchomieniowego specyficzne dla kanału (dostępne, gdy załadowany jest Plugin kanału).
`api.runtime.channel.mentions` to współdzielona powierzchnia polityki wzmianek przychodzących dla wbudowanych pluginów kanałów, które używają wstrzykiwania runtime:
`api.runtime.channel.mentions` to współdzielona powierzchnia zasad wzmianek przychodzących dla
dołączonych Pluginów kanałów, które korzystają z wstrzykiwania środowiska uruchomieniowego:
```typescript
const mentionMatch = api.runtime.channel.mentions.matchesMentionWithExplicit(text, {
@ -363,7 +370,7 @@ const decision = api.runtime.channel.mentions.resolveInboundMentionDecision({
});
```
Dostępne pomocniki wzmianek:
Dostępne funkcje pomocnicze wzmianek:
- `buildMentionRegexes`
- `matchesMentionPatterns`
@ -371,17 +378,23 @@ Dostępne pomocniki wzmianek:
- `implicitMentionKindWhen`
- `resolveInboundMentionDecision`
`api.runtime.channel.mentions` celowo nie udostępnia starszych pomocników zgodności `resolveMentionGating*`. Preferuj znormalizowaną ścieżkę `{ facts, policy }`.
`api.runtime.channel.mentions` celowo nie udostępnia starszych
pomocniczych funkcji zgodności `resolveMentionGating*`. Preferuj znormalizowaną
ścieżkę `{ facts, policy }`.
## Przechowywanie odwołań runtime
## Przechowywanie odwołań do środowiska uruchomieniowego
Użyj `createPluginRuntimeStore`, aby przechować odwołanie do runtime do użycia poza callbackiem `register`:
Użyj `createPluginRuntimeStore`, aby przechować odwołanie do środowiska uruchomieniowego do użycia poza
wywołaniem zwrotnym `register`:
```typescript
import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
import type { PluginRuntime } from "openclaw/plugin-sdk/runtime-store";
const store = createPluginRuntimeStore<PluginRuntime>("my-plugin runtime not initialized");
const store = createPluginRuntimeStore<PluginRuntime>({
pluginId: "my-plugin",
errorMessage: "my-plugin runtime not initialized",
});
// In your entry point
export default defineChannelPluginEntry({
@ -402,22 +415,25 @@ export function tryGetRuntime() {
}
```
Preferuj `pluginId` jako tożsamość runtime-store. Niższopoziomowa forma `key` jest
przeznaczona do rzadkich przypadków, gdy jeden Plugin celowo potrzebuje więcej niż jednego gniazda środowiska uruchomieniowego.
## Inne pola najwyższego poziomu `api`
Poza `api.runtime` obiekt API udostępnia także:
Poza `api.runtime` obiekt API udostępnia również:
| Pole | Typ | Opis |
| ------------------------ | ------------------------- | ---------------------------------------------------------------------------------------------- |
| `api.id` | `string` | Id pluginu |
| `api.name` | `string` | Wyświetlana nazwa pluginu |
| `api.config` | `OpenClawConfig` | Bieżąca migawka konfiguracji (aktywna migawka runtime w pamięci, gdy jest dostępna) |
| `api.pluginConfig` | `Record<string, unknown>` | Konfiguracja specyficzna dla pluginu z `plugins.entries.<id>.config` |
| `api.logger` | `PluginLogger` | Logger o ograniczonym zakresie (`debug`, `info`, `warn`, `error`) |
| `api.registrationMode` | `PluginRegistrationMode` | Bieżący tryb ładowania; `"setup-runtime"` to lekkie okno uruchomienia/konfiguracji przed pełnym startem |
| `api.resolvePath(input)` | `(string) => string` | Rozwiązuje ścieżkę względem katalogu głównego pluginu |
| Pole | Typ | Opis |
| ------------------------ | ------------------------- | -------------------------------------------------------------------------------------------- |
| `api.id` | `string` | Identyfikator Pluginu |
| `api.name` | `string` | Wyświetlana nazwa Pluginu |
| `api.config` | `OpenClawConfig` | Bieżąca migawka konfiguracji (aktywna migawka środowiska uruchomieniowego w pamięci, jeśli dostępna) |
| `api.pluginConfig` | `Record<string, unknown>` | Konfiguracja specyficzna dla Pluginu z `plugins.entries.<id>.config` |
| `api.logger` | `PluginLogger` | Logger o ograniczonym zakresie (`debug`, `info`, `warn`, `error`) |
| `api.registrationMode` | `PluginRegistrationMode` | Bieżący tryb wczytywania; `"setup-runtime"` to lekkie okno uruchamiania/konfiguracji przed pełnym uruchomieniem wpisu |
| `api.resolvePath(input)` | `(string) => string` | Rozpoznaje ścieżkę względem katalogu głównego Pluginu |
## Powiązane
- [Przegląd SDK](/pl/plugins/sdk-overview) -- odniesienie do subścieżek
- [Omówienie SDK](/pl/plugins/sdk-overview) -- dokumentacja podścieżek
- [Punkty wejścia SDK](/pl/plugins/sdk-entrypoints) -- opcje `definePluginEntry`
- [Wewnętrzne elementy pluginów](/pl/plugins/architecture) -- model możliwości i rejestr
- [Elementy wewnętrzne Pluginu](/pl/plugins/architecture) -- model możliwości i rejestr

View File

@ -1,35 +1,35 @@
---
read_when:
- Dodajesz kreator konfiguracji do pluginu OpenClaw
- Musisz zrozumieć różnicę między setup-entry.ts a index.ts
- Definiujesz schematy konfiguracji pluginu albo metadane openclaw w package.json
- Dodajesz kreator konfiguracji do Pluginu
- Musisz zrozumieć `setup-entry.ts` w porównaniu z `index.ts`
- Definiujesz schematy konfiguracji Pluginu lub metadane openclaw w `package.json`
sidebarTitle: Setup and Config
summary: Kreatory konfiguracji, setup-entry.ts, schematy konfiguracji i metadane openclaw w package.json
title: Konfiguracja i setup pluginu
summary: Kreatory konfiguracji, `setup-entry.ts`, schematy konfiguracji i metadane `package.json`
title: Konfiguracja i ustawienia Pluginu
x-i18n:
generated_at: "2026-04-06T03:11:27Z"
generated_at: "2026-04-15T19:41:37Z"
model: gpt-5.4
provider: openai
source_hash: eac2586516d27bcd94cc4c259fe6274c792b3f9938c7ddd6dbf04a6dbb988dc9
source_hash: ddf28e25e381a4a38ac478e531586f59612e1a278732597375f87c2eeefc521b
source_path: plugins/sdk-setup.md
workflow: 15
---
# Konfiguracja i setup pluginu
# Konfiguracja i ustawienia Pluginu
Dokumentacja referencyjna dla pakowania pluginów (metadane `package.json`), manifestów
(`openclaw.plugin.json`), wpisów setup, oraz schematów konfiguracji.
Dokumentacja referencyjna dotycząca pakietowania pluginów (metadane `package.json`), manifestów
(`openclaw.plugin.json`), wpisów konfiguracji oraz schematów konfiguracji.
<Tip>
**Szukasz przewodnika krok po kroku?** Przewodniki how-to omawiają pakowanie w odpowiednim kontekście:
[Channel Plugins](/pl/plugins/sdk-channel-plugins#step-1-package-and-manifest) i
[Provider Plugins](/pl/plugins/sdk-provider-plugins#step-1-package-and-manifest).
**Szukasz instrukcji krok po kroku?** Przewodniki how-to omawiają pakietowanie w kontekście:
[Pluginy kanałów](/pl/plugins/sdk-channel-plugins#step-1-package-and-manifest) i
[Pluginy dostawców](/pl/plugins/sdk-provider-plugins#step-1-package-and-manifest).
</Tip>
## Metadane pakietu
Twój `package.json` potrzebuje pola `openclaw`, które mówi systemowi pluginów, co
udostępnia Twój plugin:
Twój `package.json` musi zawierać pole `openclaw`, które informuje system pluginów, co
udostępnia Twój Plugin:
**Plugin kanału:**
@ -44,7 +44,7 @@ udostępnia Twój plugin:
"channel": {
"id": "my-channel",
"label": "My Channel",
"blurb": "Krótki opis kanału."
"blurb": "Short description of the channel."
}
}
}
@ -71,47 +71,47 @@ udostępnia Twój plugin:
}
```
Jeśli publikujesz plugin zewnętrznie w ClawHub, te pola `compat` i `build`
są wymagane. Kanoniczne fragmenty publikacji znajdują się w
Jeśli publikujesz Plugin zewnętrznie w ClawHub, pola `compat` i `build`
są wymagane. Kanoniczne fragmenty do publikacji znajdują się w
`docs/snippets/plugin-publish/`.
### Pola `openclaw`
| Pole | Typ | Opis |
| ------------ | ---------- | ---------------------------------------------------------------------------------------------------- |
| `extensions` | `string[]` | Pliki punktów wejścia (względnie do katalogu głównego pakietu) |
| `setupEntry` | `string` | Lekki wpis tylko do setupu (opcjonalny) |
| `channel` | `object` | Metadane katalogu kanału dla powierzchni setupu, selektora, szybkiego startu i statusu |
| `providers` | `string[]` | ID dostawców rejestrowanych przez ten plugin |
| `install` | `object` | Wskazówki instalacji: `npmSpec`, `localPath`, `defaultChoice`, `minHostVersion`, `allowInvalidConfigRecovery` |
| `startup` | `object` | Flagi zachowania przy uruchamianiu |
| Pole | Typ | Opis |
| ------------ | ---------- | ------------------------------------------------------------------------------------------------------ |
| `extensions` | `string[]` | Pliki punktów wejścia (względem katalogu głównego pakietu) |
| `setupEntry` | `string` | Lekki wpis wyłącznie do konfiguracji (opcjonalny) |
| `channel` | `object` | Metadane katalogu kanału dla konfiguracji, selektora, szybkiego startu i powierzchni statusu |
| `providers` | `string[]` | Identyfikatory dostawców rejestrowane przez ten Plugin |
| `install` | `object` | Wskazówki instalacyjne: `npmSpec`, `localPath`, `defaultChoice`, `minHostVersion`, `allowInvalidConfigRecovery` |
| `startup` | `object` | Flagi zachowania podczas uruchamiania |
### `openclaw.channel`
`openclaw.channel` to lekkie metadane pakietu dla wykrywania kanału i powierzchni setupu
przed załadowaniem runtime.
`openclaw.channel` to tanie metadane pakietu dla wykrywania kanałów i powierzchni
konfiguracji, zanim środowisko uruchomieniowe zostanie załadowane.
| Pole | Typ | Co oznacza |
| Pole | Typ | Znaczenie |
| -------------------------------------- | ---------- | ----------------------------------------------------------------------------- |
| `id` | `string` | Kanoniczne ID kanału. |
| `id` | `string` | Kanoniczny identyfikator kanału. |
| `label` | `string` | Główna etykieta kanału. |
| `selectionLabel` | `string` | Etykieta w selektorze/setupie, gdy powinna różnić się od `label`. |
| `detailLabel` | `string` | Dodatkowa etykieta szczegółowa dla bogatszych katalogów kanałów i powierzchni statusu. |
| `docsPath` | `string` | Ścieżka dokumentacji dla linków setupu i wyboru. |
| `docsLabel` | `string` | Nadpisana etykieta używana dla linków do dokumentacji, gdy powinna różnić się od ID kanału. |
| `selectionLabel` | `string` | Etykieta selektora/konfiguracji, gdy ma się różnić od `label`. |
| `detailLabel` | `string` | Dodatkowa etykieta szczegółów dla bogatszych katalogów kanałów i powierzchni statusu. |
| `docsPath` | `string` | Ścieżka dokumentacji dla linków konfiguracji i wyboru. |
| `docsLabel` | `string` | Etykieta zastępcza używana dla linków do dokumentacji, gdy ma się różnić od identyfikatora kanału. |
| `blurb` | `string` | Krótki opis do onboardingu/katalogu. |
| `order` | `number` | Kolejność sortowania w katalogach kanałów. |
| `aliases` | `string[]` | Dodatkowe aliasy wyszukiwania dla wyboru kanału. |
| `preferOver` | `string[]` | ID pluginów/kanałów o niższym priorytecie, które ten kanał powinien wyprzedzać. |
| `systemImage` | `string` | Opcjonalna nazwa ikony/system image dla katalogów UI kanału. |
| `preferOver` | `string[]` | Identyfikatory pluginów/kanałów o niższym priorytecie, które ten kanał ma wyprzedzać. |
| `systemImage` | `string` | Opcjonalna nazwa ikony/obrazu systemowego dla katalogów UI kanałów. |
| `selectionDocsPrefix` | `string` | Tekst prefiksu przed linkami do dokumentacji na powierzchniach wyboru. |
| `selectionDocsOmitLabel` | `boolean` | Pokaż ścieżkę dokumentacji bezpośrednio zamiast opisanego linku do dokumentacji w tekście wyboru. |
| `selectionExtras` | `string[]` | Dodatkowe krótkie ciągi dołączane do tekstu wyboru. |
| `markdownCapable` | `boolean` | Oznacza kanał jako obsługujący Markdown dla decyzji o formatowaniu wychodzącym. |
| `exposure` | `object` | Kontrola widoczności kanału dla powierzchni setupu, list skonfigurowanych i dokumentacji. |
| `quickstartAllowFrom` | `boolean` | Włącza ten kanał do standardowego przepływu szybkiego startu `allowFrom`. |
| `forceAccountBinding` | `boolean` | Wymaga jawnego powiązania konta, nawet gdy istnieje tylko jedno konto. |
| `preferSessionLookupForAnnounceTarget` | `boolean` | Preferuje wyszukiwanie sesji przy rozstrzyganiu celów ogłoszeń dla tego kanału. |
| `selectionDocsOmitLabel` | `boolean` | Pokazuje bezpośrednio ścieżkę dokumentacji zamiast podpisanego linku na powierzchniach wyboru. |
| `selectionExtras` | `string[]` | Dodatkowe krótkie ciągi dołączane na powierzchniach wyboru. |
| `markdownCapable` | `boolean` | Oznacza kanał jako obsługujący Markdown na potrzeby decyzji o formatowaniu wychodzącym. |
| `exposure` | `object` | Kontrolki widoczności kanału dla konfiguracji, list skonfigurowanych kanałów i powierzchni dokumentacji. |
| `quickstartAllowFrom` | `boolean` | Włącza ten kanał do standardowego przepływu konfiguracji `allowFrom` szybkiego startu. |
| `forceAccountBinding` | `boolean` | Wymaga jawnego powiązania konta nawet wtedy, gdy istnieje tylko jedno konto. |
| `preferSessionLookupForAnnounceTarget` | `boolean` | Preferuje wyszukiwanie sesji przy rozwiązywaniu celów ogłoszeń dla tego kanału. |
Przykład:
@ -125,11 +125,11 @@ Przykład:
"detailLabel": "My Channel Bot",
"docsPath": "/channels/my-channel",
"docsLabel": "my-channel",
"blurb": "Samohostowana integracja czatu oparta na webhookach.",
"blurb": "Webhook-based self-hosted chat integration.",
"order": 80,
"aliases": ["mc"],
"preferOver": ["my-channel-legacy"],
"selectionDocsPrefix": "Przewodnik:",
"selectionDocsPrefix": "Guide:",
"selectionExtras": ["Markdown"],
"markdownCapable": true,
"exposure": {
@ -145,37 +145,39 @@ Przykład:
`exposure` obsługuje:
- `configured`: uwzględnij kanał na powierzchniach list skonfigurowanych / podobnych do statusu
- `setup`: uwzględnij kanał w interaktywnych selektorach setupu/konfiguracji
- `docs`: oznacz kanał jako publicznie widoczny na powierzchniach dokumentacji/nawigacji
- `configured`: uwzględnia kanał na powierzchniach list skonfigurowanych kanałów/w stylu statusu
- `setup`: uwzględnia kanał w interaktywnych selektorach konfiguracji
- `docs`: oznacza kanał jako publicznie widoczny na powierzchniach dokumentacji/nawigacji
`showConfigured` i `showInSetup` nadal są obsługiwane jako starsze aliasy. Preferowane jest
`showConfigured` i `showInSetup` nadal są obsługiwane jako starsze aliasy. Preferuj
`exposure`.
### `openclaw.install`
`openclaw.install` to metadane pakietu, a nie metadane manifestu.
| Pole | Typ | Co oznacza |
| Pole | Typ | Znaczenie |
| ---------------------------- | -------------------- | -------------------------------------------------------------------------------- |
| `npmSpec` | `string` | Kanoniczna specyfikacja npm dla przepływów instalacji/aktualizacji. |
| `localPath` | `string` | Lokalna ścieżka instalacji deweloperskiej lub bundlowanej. |
| `localPath` | `string` | Lokalna ścieżka instalacji deweloperskiej lub wbudowanej. |
| `defaultChoice` | `"npm"` \| `"local"` | Preferowane źródło instalacji, gdy oba są dostępne. |
| `minHostVersion` | `string` | Minimalna obsługiwana wersja OpenClaw w formacie `>=x.y.z`. |
| `allowInvalidConfigRecovery` | `boolean` | Pozwala przepływom ponownej instalacji bundlowanych pluginów odzyskać działanie po określonych błędach nieaktualnej konfiguracji. |
| `allowInvalidConfigRecovery` | `boolean` | Umożliwia przepływom ponownej instalacji wbudowanych pluginów odzyskiwanie po wybranych błędach nieaktualnej konfiguracji. |
Jeśli ustawiono `minHostVersion`, zarówno instalacja, jak i ładowanie rejestru manifestów
wymuszają to ograniczenie. Starsze hosty pomijają plugin; nieprawidłowe ciągi wersji są odrzucane.
Jeśli ustawiono `minHostVersion`, zarówno instalacja, jak i ładowanie z rejestru
manifestów będą je egzekwować. Starsze hosty pomijają Plugin; nieprawidłowe ciągi
wersji są odrzucane.
`allowInvalidConfigRecovery` nie jest ogólnym obejściem dla uszkodzonych konfiguracji. Służy
wyłącznie do wąskiego odzyskiwania bundlowanych pluginów, tak aby ponowna instalacja/setup mogły naprawić znane
pozostałości po aktualizacji, takie jak brakująca ścieżka bundlowanego pluginu albo nieaktualny wpis `channels.<id>`
dla tego samego pluginu. Jeśli konfiguracja jest uszkodzona z niezwiązanych powodów, instalacja
nadal kończy się fail-closed i informuje operatora, aby uruchomił `openclaw doctor --fix`.
`allowInvalidConfigRecovery` nie jest ogólnym obejściem dla uszkodzonych konfiguracji. Jest
przeznaczone wyłącznie do wąskiego odzyskiwania dla wbudowanych pluginów, aby
ponowna instalacja/konfiguracja mogła naprawić znane pozostałości po aktualizacjach,
takie jak brakująca ścieżka wbudowanego pluginu lub nieaktualny wpis `channels.<id>`
dla tego samego Pluginu. Jeśli konfiguracja jest uszkodzona z innych powodów, instalacja
nadal kończy się bez obejścia i informuje operatora o konieczności uruchomienia `openclaw doctor --fix`.
### Odroczone pełne ładowanie
Pluginy kanałów mogą włączyć odroczone ładowanie przez:
Pluginy kanałów mogą włączyć odroczone ładowanie za pomocą:
```json
{
@ -189,39 +191,39 @@ Pluginy kanałów mogą włączyć odroczone ładowanie przez:
}
```
Gdy to jest włączone, OpenClaw ładuje tylko `setupEntry` podczas fazy uruchamiania
przed nasłuchiwaniem, nawet dla już skonfigurowanych kanałów. Pełny wpis ładuje się po
rozpoczęciu nasłuchiwania przez bramę.
Gdy ta opcja jest włączona, OpenClaw ładuje tylko `setupEntry` w fazie uruchamiania
przed rozpoczęciem nasłuchiwania, nawet dla już skonfigurowanych kanałów. Pełny wpis
jest ładowany po tym, jak Gateway zacznie nasłuchiwać.
<Warning>
Włączaj odroczone ładowanie tylko wtedy, gdy `setupEntry` rejestruje wszystko, czego
brama potrzebuje przed rozpoczęciem nasłuchiwania (rejestrację kanału, trasy HTTP,
metody gateway). Jeśli pełny wpis posiada wymagane możliwości startowe, zachowaj
domyślne zachowanie.
Włączaj odroczone ładowanie tylko wtedy, gdy `setupEntry` rejestruje wszystko,
czego Gateway potrzebuje przed rozpoczęciem nasłuchiwania (rejestracja kanału,
trasy HTTP, metody Gateway). Jeśli pełny wpis posiada wymagane możliwości
startowe, pozostaw domyślne zachowanie.
</Warning>
Jeśli Twój wpis setupu/pełny wpis rejestruje metody RPC gateway, utrzymuj je w
prefiksie specyficznym dla pluginu. Zastrzeżone przestrzenie nazw administracji rdzenia (`config.*`,
`exec.approvals.*`, `wizard.*`, `update.*`) pozostają własnością rdzenia i zawsze są rozstrzygane
Jeśli Twój wpis konfiguracji/pełny wpis rejestruje metody RPC Gateway, zachowaj je pod
prefiksem specyficznym dla pluginu. Zastrzeżone przestrzenie nazw administracyjnych rdzenia (`config.*`,
`exec.approvals.*`, `wizard.*`, `update.*`) pozostają własnością rdzenia i zawsze są rozwiązywane
do `operator.admin`.
## Manifest pluginu
## Manifest Pluginu
Każdy natywny plugin musi dostarczać `openclaw.plugin.json` w katalogu głównym pakietu.
OpenClaw używa tego do walidacji konfiguracji bez wykonywania kodu pluginu.
Każdy natywny Plugin musi dostarczać plik `openclaw.plugin.json` w katalogu głównym pakietu.
OpenClaw używa go do walidacji konfiguracji bez wykonywania kodu pluginu.
```json
{
"id": "my-plugin",
"name": "My Plugin",
"description": "Dodaje możliwości My Plugin do OpenClaw",
"description": "Adds My Plugin capabilities to OpenClaw",
"configSchema": {
"type": "object",
"additionalProperties": false,
"properties": {
"webhookSecret": {
"type": "string",
"description": "Sekret weryfikacji webhooka"
"description": "Webhook verification secret"
}
}
}
@ -255,25 +257,25 @@ Nawet pluginy bez konfiguracji muszą dostarczać schemat. Pusty schemat jest pr
}
```
Zobacz [Plugin Manifest](/pl/plugins/manifest), aby poznać pełną dokumentację schematu.
Pełny opis schematu znajdziesz w [Manifeście Pluginu](/pl/plugins/manifest).
## Publikowanie w ClawHub
Dla pakietów pluginów używaj polecenia ClawHub specyficznego dla pakietu:
Dla pakietów pluginów używaj polecenia ClawHub przeznaczonego dla pakietów:
```bash
clawhub package publish your-org/your-plugin --dry-run
clawhub package publish your-org/your-plugin
```
Starszy alias publikacji tylko dla Skills dotyczy Skills. Pakiety pluginów
zawsze powinny używać `clawhub package publish`.
Starszy alias publikacji tylko dla Skills jest przeznaczony dla Skills. Pakiety pluginów powinny
zawsze używać `clawhub package publish`.
## Wpis setup
## Wpis konfiguracji
Plik `setup-entry.ts` jest lekką alternatywą dla `index.ts`, którą
OpenClaw ładuje, gdy potrzebuje tylko powierzchni setupu (onboarding, naprawa konfiguracji,
inspekcja wyłączonego kanału).
Plik `setup-entry.ts` to lekka alternatywa dla `index.ts`, którą
OpenClaw ładuje wtedy, gdy potrzebuje tylko powierzchni konfiguracji (onboarding, naprawa konfiguracji,
inspekcja wyłączonych kanałów).
```typescript
// setup-entry.ts
@ -283,73 +285,81 @@ import { myChannelPlugin } from "./src/channel.js";
export default defineSetupPluginEntry(myChannelPlugin);
```
Pozwala to uniknąć ładowania ciężkiego kodu runtime (bibliotek kryptograficznych, rejestracji CLI,
usług działających w tle) podczas przepływów setupu.
Pozwala to uniknąć ładowania ciężkiego kodu środowiska uruchomieniowego (bibliotek kryptograficznych, rejestracji CLI,
usług działających w tle) podczas przepływów konfiguracji.
Wbudowane kanały workspace, które przechowują eksporty bezpieczne dla konfiguracji w modułach pobocznych,
mogą używać `defineBundledChannelSetupEntry(...)` z
`openclaw/plugin-sdk/channel-entry-contract` zamiast
`defineSetupPluginEntry(...)`. Ten kontrakt dla wbudowanych pluginów obsługuje też opcjonalny eksport
`runtime`, dzięki czemu łączenie środowiska uruchomieniowego w czasie konfiguracji może pozostać lekkie i jawne.
**Kiedy OpenClaw używa `setupEntry` zamiast pełnego wpisu:**
- Kanał jest wyłączony, ale potrzebuje powierzchni setupu/onboardingu
- Kanał jest wyłączony, ale potrzebuje powierzchni konfiguracji/onboardingu
- Kanał jest włączony, ale nieskonfigurowany
- Włączono odroczone ładowanie (`deferConfiguredChannelFullLoadUntilAfterListen`)
**Co musi rejestrować `setupEntry`:**
**Co `setupEntry` musi zarejestrować:**
- Obiekt pluginu kanału (przez `defineSetupPluginEntry`)
- Wszelkie trasy HTTP wymagane przed rozpoczęciem nasłuchiwania przez bramę
- Wszelkie metody gateway potrzebne podczas uruchamiania
- Wszelkie trasy HTTP wymagane przed rozpoczęciem nasłuchiwania przez Gateway
- Wszelkie metody Gateway potrzebne podczas uruchamiania
Te startowe metody gateway nadal powinny unikać zastrzeżonych przestrzeni nazw administracji rdzenia,
Te startowe metody Gateway nadal powinny unikać zastrzeżonych przestrzeni nazw administracyjnych rdzenia,
takich jak `config.*` czy `update.*`.
**Czego `setupEntry` NIE powinien zawierać:**
- Rejestracji CLI
- Usług działających w tle
- Ciężkich importów runtime (crypto, SDK)
- Metod gateway potrzebnych dopiero po uruchomieniu
- Rejestracje CLI
- Usługi działające w tle
- Ciężkie importy środowiska uruchomieniowego (crypto, SDK)
- Metody Gateway potrzebne dopiero po uruchomieniu
### Wąskie importy helperów setupu
### Wąskie importy pomocników konfiguracji
Dla gorących ścieżek tylko do setupu preferuj wąskie warstwy helperów setupu zamiast szerszego
parasola `plugin-sdk/setup`, jeśli potrzebujesz tylko części powierzchni setupu:
Dla gorących ścieżek wyłącznie konfiguracyjnych preferuj wąskie punkty dostępu pomocników konfiguracji zamiast szerszego
parasola `plugin-sdk/setup`, gdy potrzebujesz tylko części powierzchni konfiguracji:
| Ścieżka importu | Użycie | Kluczowe eksporty |
| ---------------------------------- | --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `plugin-sdk/setup-runtime` | helpery runtime na czas setupu, które pozostają dostępne w `setupEntry` / odroczonym starcie kanału | `createPatchedAccountSetupAdapter`, `createEnvPatchedAccountSetupAdapter`, `createSetupInputPresenceValidator`, `noteChannelLookupFailure`, `noteChannelLookupSummary`, `promptResolvedAllowFrom`, `splitSetupEntries`, `createAllowlistSetupWizardProxy`, `createDelegatedSetupWizardProxy` |
| `plugin-sdk/setup-adapter-runtime` | adaptery setupu kont uwzględniające środowisko | `createEnvPatchedAccountSetupAdapter` |
| `plugin-sdk/setup-tools` | helpery setupu/instalacji CLI/archiwów/dokumentacji | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
| Ścieżka importu | Używaj do | Kluczowe eksporty |
| ----------------------------------- | ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `plugin-sdk/setup-runtime` | pomocniki środowiska uruchomieniowego używane w czasie konfiguracji, dostępne w `setupEntry` / przy odroczonym uruchamianiu kanału | `createPatchedAccountSetupAdapter`, `createEnvPatchedAccountSetupAdapter`, `createSetupInputPresenceValidator`, `noteChannelLookupFailure`, `noteChannelLookupSummary`, `promptResolvedAllowFrom`, `splitSetupEntries`, `createAllowlistSetupWizardProxy`, `createDelegatedSetupWizardProxy` |
| `plugin-sdk/setup-adapter-runtime` | adaptery konfiguracji kont świadome środowiska | `createEnvPatchedAccountSetupAdapter` |
| `plugin-sdk/setup-tools` | pomocniki CLI/archiwów/dokumentacji dla konfiguracji i instalacji | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
Użyj szerszej warstwy `plugin-sdk/setup`, gdy potrzebujesz pełnego współdzielonego
zestawu narzędzi setupu, w tym helperów do patchowania konfiguracji, takich jak
Użyj szerszego punktu dostępu `plugin-sdk/setup`, gdy potrzebujesz pełnego współdzielonego
zestawu narzędzi konfiguracji, w tym pomocników do łatania konfiguracji, takich jak
`moveSingleAccountChannelSectionToDefaultAccount(...)`.
Adaptery patchowania setupu pozostają bezpieczne dla gorącej ścieżki przy imporcie. Ich bundlowane
wyszukiwanie powierzchni kontraktów promocji pojedynczego konta jest leniwe, więc import
`plugin-sdk/setup-runtime` nie ładuje eagerly wykrywania bundlowanych powierzchni kontraktów, dopóki adapter nie zostanie faktycznie użyty.
Adaptery łatek konfiguracji pozostają bezpieczne dla gorącej ścieżki przy imporcie. Ich wbudowane
leniwe wyszukiwanie powierzchni kontraktu promocji pojedynczego konta sprawia, że import
`plugin-sdk/setup-runtime` nie powoduje natychmiastowego ładowania wykrywania powierzchni kontraktu
wbudowanych pluginów, zanim adapter faktycznie zostanie użyty.
### Promocja pojedynczego konta należąca do kanału
### Promocja pojedynczego konta zarządzana przez kanał
Gdy kanał przechodzi z konfiguracji najwyższego poziomu dla pojedynczego konta do
`channels.<id>.accounts.*`, domyślne współdzielone zachowanie polega na przeniesieniu wartości
o zakresie konta do `accounts.default`.
`channels.<id>.accounts.*`, domyślne współdzielone zachowanie polega na przeniesieniu promowanych
wartości o zakresie konta do `accounts.default`.
Bundlowane kanały mogą zawężać lub nadpisywać tę promocję przez swoją powierzchnię kontraktu setupu:
Wbudowane kanały mogą zawężać lub nadpisywać tę promocję przez swoją powierzchnię kontraktu
konfiguracji:
- `singleAccountKeysToMove`: dodatkowe klucze najwyższego poziomu, które powinny zostać przeniesione do
promowanego konta
- `namedAccountPromotionKeys`: gdy nazwane konta już istnieją, tylko te
klucze są przenoszone do promowanego konta; współdzielone klucze zasad/dostarczania pozostają w katalogu głównym
kanału
klucze są przenoszone do promowanego konta; współdzielone klucze polityki/dostarczania pozostają w katalogu głównym kanału
- `resolveSingleAccountPromotionTarget(...)`: wybiera, które istniejące konto
otrzyma promowane wartości
Matrix jest obecnym bundlowanym przykładem. Jeśli istnieje dokładnie jedno nazwane konto Matrix
albo jeśli `defaultAccount` wskazuje na istniejący niekanoniczny klucz, taki jak `Ops`,
promocja zachowuje to konto zamiast tworzyć nowy wpis `accounts.default`.
Matrix jest obecnie przykładem wbudowanego kanału. Jeśli istnieje dokładnie jedno nazwane konto Matrix
albo jeśli `defaultAccount` wskazuje istniejący niekanoniczny klucz, taki jak
`Ops`, promocja zachowuje to konto zamiast tworzyć nowy wpis
`accounts.default`.
## Schemat konfiguracji
Konfiguracja pluginu jest walidowana względem JSON Schema w Twoim manifeście. Użytkownicy
Konfiguracja pluginu jest walidowana względem JSON Schema w manifeście. Użytkownicy
konfigurują pluginy przez:
```json5
@ -366,9 +376,9 @@ konfigurują pluginy przez:
}
```
Twój plugin otrzymuje tę konfigurację jako `api.pluginConfig` podczas rejestracji.
Twój Plugin otrzymuje tę konfigurację jako `api.pluginConfig` podczas rejestracji.
Dla konfiguracji specyficznej dla kanału użyj zamiast tego sekcji konfiguracji kanału:
W przypadku konfiguracji specyficznej dla kanału użyj zamiast tego sekcji konfiguracji kanału:
```json5
{
@ -383,8 +393,8 @@ Dla konfiguracji specyficznej dla kanału użyj zamiast tego sekcji konfiguracji
### Budowanie schematów konfiguracji kanału
Użyj `buildChannelConfigSchema` z `openclaw/plugin-sdk/core`, aby przekształcić
schemat Zod w opakowanie `ChannelConfigSchema`, które OpenClaw waliduje:
Użyj `buildChannelConfigSchema` z `openclaw/plugin-sdk/core`, aby przekonwertować
schemat Zod do opakowania `ChannelConfigSchema`, które OpenClaw waliduje:
```typescript
import { z } from "zod";
@ -402,8 +412,8 @@ const configSchema = buildChannelConfigSchema(accountSchema);
## Kreatory konfiguracji
Pluginy kanałów mogą dostarczać interaktywne kreatory konfiguracji dla `openclaw onboard`.
Kreator jest obiektem `ChannelSetupWizard` w `ChannelPlugin`:
Pluginy kanałów mogą udostępniać interaktywne kreatory konfiguracji dla `openclaw onboard`.
Kreator to obiekt `ChannelSetupWizard` w `ChannelPlugin`:
```typescript
import type { ChannelSetupWizard } from "openclaw/plugin-sdk/channel-setup";
@ -438,20 +448,20 @@ const setupWizard: ChannelSetupWizard = {
Typ `ChannelSetupWizard` obsługuje `credentials`, `textInputs`,
`dmPolicy`, `allowFrom`, `groupAccess`, `prepare`, `finalize` i inne.
Pełne przykłady znajdziesz w bundlowanych pakietach pluginów (na przykład plugin Discord `src/channel.setup.ts`).
Pełne przykłady znajdziesz w pakietach wbudowanych pluginów (na przykład plugin Discord `src/channel.setup.ts`).
Dla promptów listy dozwolonych DM, które potrzebują tylko standardowego przepływu
`note -> prompt -> parse -> merge -> patch`, preferuj współdzielone helpery setupu
Dla promptów listy dozwolonych w DM, które wymagają tylko standardowego przepływu
`note -> prompt -> parse -> merge -> patch`, preferuj współdzielone pomocniki konfiguracji
z `openclaw/plugin-sdk/setup`: `createPromptParsedAllowFromForAccount(...)`,
`createTopLevelChannelParsedAllowFromPrompt(...)` i
`createNestedChannelParsedAllowFromPrompt(...)`.
Dla bloków statusu konfiguracji kanału, które różnią się tylko etykietami, wynikami i opcjonalnymi
dodatkowymi liniami, preferuj `createStandardChannelSetupStatus(...)` z
`openclaw/plugin-sdk/setup` zamiast ręcznego tworzenia tego samego obiektu `status` w
`openclaw/plugin-sdk/setup` zamiast ręcznie tworzyć ten sam obiekt `status` w
każdym pluginie.
Dla opcjonalnych powierzchni setupu, które powinny pojawiać się tylko w określonych kontekstach, użyj
Dla opcjonalnych powierzchni konfiguracji, które powinny pojawiać się tylko w określonych kontekstach, użyj
`createOptionalChannelSetupSurface` z `openclaw/plugin-sdk/channel-setup`:
```typescript
@ -463,54 +473,55 @@ const setupSurface = createOptionalChannelSetupSurface({
npmSpec: "@myorg/openclaw-my-channel",
docsPath: "/channels/my-channel",
});
// Returns { setupAdapter, setupWizard }
// Zwraca { setupAdapter, setupWizard }
```
`plugin-sdk/channel-setup` udostępnia także niższego poziomu konstruktory
`plugin-sdk/channel-setup` udostępnia także niższopoziomowe konstruktory
`createOptionalChannelSetupAdapter(...)` i
`createOptionalChannelSetupWizard(...)`, gdy potrzebujesz tylko jednej połowy
tej opcjonalnej powierzchni instalacji.
Wygenerowany opcjonalny adapter/kreator działa fail-closed przy rzeczywistych zapisach konfiguracji. Ponownie
wykorzystuje jeden komunikat o wymaganej instalacji w `validateInput`,
`applyAccountConfig` i `finalize`, a gdy ustawiono `docsPath`, dołącza link do dokumentacji.
Wygenerowany opcjonalny adapter/kreator kończy działanie bez obejścia przy rzeczywistych zapisach konfiguracji. Ponownie
wykorzystują jeden komunikat o wymaganej instalacji w `validateInput`,
`applyAccountConfig` i `finalize`, a po ustawieniu `docsPath` dołączają link do dokumentacji.
Dla interfejsów setupu opartych na binariach preferuj współdzielone delegowane helpery zamiast
kopiowania tej samej logiki binariów/statusu do każdego kanału:
Dla interfejsów konfiguracji opartych na plikach binarnych preferuj współdzielone pomocniki delegujące zamiast
kopiowania tego samego kodu pośredniego binariów/statusu do każdego kanału:
- `createDetectedBinaryStatus(...)` dla bloków statusu, które różnią się tylko etykietami,
wskazówkami, wynikami i wykrywaniem binariów
- `createCliPathTextInput(...)` dla wejść tekstowych opartych na ścieżce
- `createDelegatedSetupWizardStatusResolvers(...)`,
`createDelegatedPrepare(...)`, `createDelegatedFinalize(...)` i
`createDelegatedResolveConfigured(...)`, gdy `setupEntry` musi leniwie przekazać dalej cięższy pełny kreator
- `createDelegatedTextInputShouldPrompt(...)`, gdy `setupEntry` musi tylko
`createDelegatedResolveConfigured(...)`, gdy `setupEntry` musi leniwie przekazać obsługę
do cięższego pełnego kreatora
- `createDelegatedTextInputShouldPrompt(...)`, gdy `setupEntry` musi jedynie
delegować decyzję `textInputs[*].shouldPrompt`
## Publikowanie i instalacja
**Pluginy zewnętrzne:** opublikuj do [ClawHub](/pl/tools/clawhub) albo npm, a następnie zainstaluj:
**Pluginy zewnętrzne:** opublikuj w [ClawHub](/pl/tools/clawhub) lub npm, a następnie zainstaluj:
```bash
openclaw plugins install @myorg/openclaw-my-plugin
```
OpenClaw najpierw próbuje ClawHub i automatycznie przechodzi do npm jako fallback. Możesz też
OpenClaw najpierw próbuje ClawHub, a potem automatycznie przechodzi do npm. Możesz też
jawnie wymusić ClawHub:
```bash
openclaw plugins install clawhub:@myorg/openclaw-my-plugin # tylko ClawHub
```
Nie ma odpowiadającego nadpisania `npm:`. Użyj zwykłej specyfikacji pakietu npm, jeśli
chcesz ścieżki npm po fallbacku z ClawHub:
Nie ma odpowiadającego nadpisania `npm:`. Użyj zwykłej specyfikacji pakietu npm, gdy
chcesz użyć ścieżki npm po awaryjnym przejściu z ClawHub:
```bash
openclaw plugins install @myorg/openclaw-my-plugin
```
**Pluginy w repo:** umieść je w drzewie workspace bundlowanych pluginów, a będą automatycznie
wykrywane podczas builda.
**Pluginy w repozytorium:** umieść je w drzewie workspace wbudowanych pluginów, a zostaną automatycznie
wykryte podczas budowania.
**Użytkownicy mogą instalować:**
@ -519,13 +530,13 @@ openclaw plugins install <package-name>
```
<Info>
Dla instalacji pochodzących z npm `openclaw plugins install` uruchamia
`npm install --ignore-scripts` (bez skryptów lifecycle). Utrzymuj drzewo zależności pluginu
jako czyste JS/TS i unikaj pakietów wymagających buildów `postinstall`.
W przypadku instalacji pochodzących z npm `openclaw plugins install` uruchamia
`npm install --ignore-scripts` (bez skryptów cyklu życia). Zachowaj drzewo zależności pluginu
jako czyste JS/TS i unikaj pakietów, które wymagają kompilacji w `postinstall`.
</Info>
## Powiązane
- [SDK Entry Points](/pl/plugins/sdk-entrypoints) -- `definePluginEntry` i `defineChannelPluginEntry`
- [Plugin Manifest](/pl/plugins/manifest) -- pełna dokumentacja schematu manifestu
- [Building Plugins](/pl/plugins/building-plugins) -- przewodnik krok po kroku dla początkujących
- [Punkty wejścia SDK](/pl/plugins/sdk-entrypoints) -- `definePluginEntry` i `defineChannelPluginEntry`
- [Manifest Pluginu](/pl/plugins/manifest) -- pełna dokumentacja schematu manifestu
- [Tworzenie pluginów](/pl/plugins/building-plugins) -- przewodnik krok po kroku na start

View File

@ -1,36 +1,36 @@
---
read_when:
- Piszesz testy dla pluginu
- Potrzebujesz narzędzi testowych z Plugin SDK
- Piszesz testy dla Pluginu
- Potrzebujesz narzędzi testowych z SDK Pluginu
- Chcesz zrozumieć testy kontraktowe dla dołączonych pluginów
sidebarTitle: Testing
summary: Narzędzia testowe i wzorce dla pluginów OpenClaw
title: Testowanie pluginów
title: Testowanie Pluginów
x-i18n:
generated_at: "2026-04-05T14:01:56Z"
generated_at: "2026-04-15T19:41:35Z"
model: gpt-5.4
provider: openai
source_hash: 2e95ed58ed180feadad17bb5138bd09e3b45f1f3ecdff4e2fba4874bb80099fe
source_hash: 2f75bd3f3b5ba34b05786e0dd96d493c36db73a1d258998bf589e27e45c0bd09
source_path: plugins/sdk-testing.md
workflow: 15
---
# Testowanie pluginów
# Testowanie Pluginów
Referencja narzędzi testowych, wzorców i egzekwowania lint dla pluginów
OpenClaw.
Dokumentacja narzędzi testowych, wzorców i egzekwowania reguł lintingu dla
pluginów OpenClaw.
<Tip>
**Szukasz przykładów testów?** Przewodniki how-to zawierają gotowe przykłady testów:
[Testy pluginów kanałowych](/plugins/sdk-channel-plugins#step-6-test) oraz
[Testy pluginów providerów](/plugins/sdk-provider-plugins#step-6-test).
[Testy Pluginów kanałów](/pl/plugins/sdk-channel-plugins#step-6-test) oraz
[Testy Pluginów dostawców](/pl/plugins/sdk-provider-plugins#step-6-test).
</Tip>
## Narzędzia testowe
**Import:** `openclaw/plugin-sdk/testing`
Ta ścieżka podrzędna do testowania eksportuje wąski zestaw helperów dla autorów pluginów:
Podścieżka testowa eksportuje wąski zestaw pomocników dla autorów pluginów:
```typescript
import {
@ -42,15 +42,15 @@ import {
### Dostępne eksporty
| Export | Purpose |
| Export | Cel |
| -------------------------------------- | ------------------------------------------------------ |
| `installCommonResolveTargetErrorCases` | Współdzielone przypadki testowe do obsługi błędów rozwiązywania celu |
| `shouldAckReaction` | Sprawdza, czy kanał powinien dodać reakcję ack |
| `removeAckReactionAfterReply` | Usuwa reakcję ack po dostarczeniu odpowiedzi |
| `installCommonResolveTargetErrorCases` | Współdzielone przypadki testowe dla obsługi błędów rozwiązywania celu |
| `shouldAckReaction` | Sprawdza, czy kanał powinien dodać reakcję ack |
| `removeAckReactionAfterReply` | Usuwa reakcję ack po dostarczeniu odpowiedzi |
### Typy
Ścieżka podrzędna do testowania ponownie eksportuje też typy przydatne w plikach testowych:
Podścieżka testowa ponownie eksportuje także typy przydatne w plikach testowych:
```typescript
import type {
@ -66,23 +66,23 @@ import type {
## Testowanie rozwiązywania celu
Użyj `installCommonResolveTargetErrorCases`, aby dodać standardowe przypadki błędów dla
rozwiązywania celów kanału:
rozwiązywania celu kanału:
```typescript
import { describe } from "vitest";
import { installCommonResolveTargetErrorCases } from "openclaw/plugin-sdk/testing";
describe("rozwiązywanie celu my-channel", () => {
describe("my-channel target resolution", () => {
installCommonResolveTargetErrorCases({
resolveTarget: ({ to, mode, allowFrom }) => {
// Logika rozwiązywania celu twojego kanału
// Your channel's target resolution logic
return myChannelResolveTarget({ to, mode, allowFrom });
},
implicitAllowFrom: ["user1", "user2"],
});
// Dodaj przypadki testowe specyficzne dla kanału
it("powinno rozwiązywać cele @username", () => {
// Add channel-specific test cases
it("should resolve @username targets", () => {
// ...
});
});
@ -90,13 +90,13 @@ describe("rozwiązywanie celu my-channel", () => {
## Wzorce testowania
### Testy jednostkowe pluginu kanałowego
### Testy jednostkowe Pluginu kanału
```typescript
import { describe, it, expect, vi } from "vitest";
describe("plugin my-channel", () => {
it("powinien rozwiązać konto z config", () => {
describe("my-channel plugin", () => {
it("should resolve account from config", () => {
const cfg = {
channels: {
"my-channel": {
@ -110,7 +110,7 @@ describe("plugin my-channel", () => {
expect(account.token).toBe("test-token");
});
it("powinien sprawdzać konto bez materializowania sekretów", () => {
it("should inspect account without materializing secrets", () => {
const cfg = {
channels: {
"my-channel": { token: "test-token" },
@ -120,19 +120,19 @@ describe("plugin my-channel", () => {
const inspection = myPlugin.setup.inspectAccount(cfg, undefined);
expect(inspection.configured).toBe(true);
expect(inspection.tokenStatus).toBe("available");
// Bez ujawniania wartości tokena
// No token value exposed
expect(inspection).not.toHaveProperty("token");
});
});
```
### Testy jednostkowe pluginu providera
### Testy jednostkowe Pluginu dostawcy
```typescript
import { describe, it, expect } from "vitest";
describe("plugin my-provider", () => {
it("powinien rozwiązywać modele dynamiczne", () => {
describe("my-provider plugin", () => {
it("should resolve dynamic models", () => {
const model = myProvider.resolveDynamicModel({
modelId: "custom-model-v2",
// ... context
@ -143,7 +143,7 @@ describe("plugin my-provider", () => {
expect(model.api).toBe("openai-completions");
});
it("powinien zwrócić katalog, gdy klucz API jest dostępny", async () => {
it("should return catalog when API key is available", async () => {
const result = await myProvider.catalog.run({
resolveProviderApiKey: () => ({ apiKey: "test-key" }),
// ... context
@ -154,17 +154,20 @@ describe("plugin my-provider", () => {
});
```
### Mockowanie runtime pluginu
### Mockowanie środowiska uruchomieniowego Pluginu
Dla kodu używającego `createPluginRuntimeStore` mockuj runtime w testach:
W przypadku kodu używającego `createPluginRuntimeStore` zamockuj runtime w testach:
```typescript
import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
import type { PluginRuntime } from "openclaw/plugin-sdk/runtime-store";
const store = createPluginRuntimeStore<PluginRuntime>("test runtime not set");
const store = createPluginRuntimeStore<PluginRuntime>({
pluginId: "test-plugin",
errorMessage: "test runtime not set",
});
// W konfiguracji testu
// In test setup
const mockRuntime = {
agent: {
resolveAgentDir: vi.fn().mockReturnValue("/tmp/agent"),
@ -179,26 +182,26 @@ const mockRuntime = {
store.setRuntime(mockRuntime);
// Po testach
// After tests
store.clearRuntime();
```
### Testowanie z per-instance stubs
### Testowanie z użyciem stubów per instancja
Preferuj stuby per instancja zamiast modyfikacji prototypu:
Preferuj stuby per instancja zamiast mutacji prototypu:
```typescript
// Preferowane: stub per instancja
// Preferred: per-instance stub
const client = new MyChannelClient();
client.sendMessage = vi.fn().mockResolvedValue({ id: "msg-1" });
// Unikaj: modyfikacji prototypu
// Avoid: prototype mutation
// MyChannelClient.prototype.sendMessage = vi.fn();
```
## Testy kontraktowe (pluginy w repozytorium)
Dołączone pluginy mają testy kontraktowe weryfikujące własność rejestracji:
Dołączone pluginy mają testy kontraktowe, które weryfikują własność rejestracji:
```bash
pnpm test -- src/plugins/contracts/
@ -206,8 +209,8 @@ pnpm test -- src/plugins/contracts/
Te testy sprawdzają:
- Które pluginy rejestrują które providery
- Które pluginy rejestrują których providerów mowy
- Które pluginy rejestrują których dostawców
- Które pluginy rejestrują których dostawców mowy
- Poprawność kształtu rejestracji
- Zgodność z kontraktem runtime
@ -227,15 +230,15 @@ pnpm test -- src/plugins/contracts/auth.contract.test.ts
pnpm test -- src/plugins/contracts/runtime.contract.test.ts
```
## Egzekwowanie lint (pluginy w repozytorium)
## Egzekwowanie reguł lintingu (pluginy w repozytorium)
`pnpm check` egzekwuje trzy reguły dla pluginów w repozytorium:
Trzy reguły są egzekwowane przez `pnpm check` dla pluginów w repozytorium:
1. **Brak monolitycznych importów root** — root barrel `openclaw/plugin-sdk` jest odrzucany
2. **Brak bezpośrednich importów `src/`** — pluginy nie mogą importować bezpośrednio `../../src/`
3. **Brak self-imports** — pluginy nie mogą importować własnej ścieżki podrzędnej `plugin-sdk/<name>`
1. **Brak monolitycznych importów z root** -- barrel root `openclaw/plugin-sdk` jest odrzucany
2. **Brak bezpośrednich importów z `src/`** -- pluginy nie mogą importować `../../src/` bezpośrednio
3. **Brak importów do siebie samych** -- pluginy nie mogą importować własnej podścieżki `plugin-sdk/<name>`
Zewnętrzne pluginy nie podlegają tym regułom lint, ale zaleca się stosowanie tych samych
Zewnętrzne pluginy nie podlegają tym regułom lintingu, ale zaleca się stosowanie tych samych
wzorców.
## Konfiguracja testów
@ -243,20 +246,20 @@ wzorców.
OpenClaw używa Vitest z progami pokrycia V8. Dla testów pluginów:
```bash
# Uruchom wszystkie testy
# Run all tests
pnpm test
# Uruchom testy konkretnego pluginu
# Run specific plugin tests
pnpm test -- <bundled-plugin-root>/my-channel/src/channel.test.ts
# Uruchom z filtrem konkretnej nazwy testu
# Run with a specific test name filter
pnpm test -- <bundled-plugin-root>/my-channel/ -t "resolves account"
# Uruchom z pokryciem
# Run with coverage
pnpm test:coverage
```
Jeśli lokalne przebiegi powodują presję pamięci:
Jeśli lokalne uruchomienia powodują presję na pamięć:
```bash
OPENCLAW_VITEST_MAX_WORKERS=1 pnpm test
@ -264,7 +267,7 @@ OPENCLAW_VITEST_MAX_WORKERS=1 pnpm test
## Powiązane
- [Przegląd SDK](/plugins/sdk-overview) -- konwencje importu
- [SDK pluginów kanałowych](/plugins/sdk-channel-plugins) -- interfejs pluginów kanałowych
- [SDK pluginów providerów](/plugins/sdk-provider-plugins) -- hooki pluginów providerów
- [Tworzenie pluginów](/plugins/building-plugins) -- przewodnik na start
- [Przegląd SDK](/pl/plugins/sdk-overview) -- konwencje importu
- [Pluginy kanałów SDK](/pl/plugins/sdk-channel-plugins) -- interfejs Pluginu kanału
- [Pluginy dostawców SDK](/pl/plugins/sdk-provider-plugins) -- hooki Pluginu dostawcy
- [Tworzenie Pluginów](/pl/plugins/building-plugins) -- przewodnik na początek

View File

@ -1,14 +1,14 @@
---
read_when:
- Wyjaśnianie użycia tokenów, kosztów lub okien kontekstowych
- Wyjaśnianie użycia tokenów, kosztów lub okien kontekstu
- Debugowanie wzrostu kontekstu lub zachowania Compaction
summary: Jak OpenClaw buduje kontekst promptu oraz raportuje użycie tokenów i koszty
title: Użycie tokenów i koszty
x-i18n:
generated_at: "2026-04-12T09:34:14Z"
generated_at: "2026-04-15T19:41:58Z"
model: gpt-5.4
provider: openai
source_hash: f8c856549cd28b8364a640e6fa9ec26aa736895c7a993e96cbe85838e7df2dfb
source_hash: 9a706d3df8b2ea1136b3535d216c6b358e43aee2a31a4759824385e1345e6fe5
source_path: reference/token-use.md
workflow: 15
---
@ -16,80 +16,96 @@ x-i18n:
# Użycie tokenów i koszty
OpenClaw śledzi **tokeny**, a nie znaki. Tokeny są zależne od modelu, ale większość
modeli w stylu OpenAI daje średnio około 4 znaków na token dla tekstu angielskiego.
modeli w stylu OpenAI ma średnio około 4 znaki na token dla tekstu angielskiego.
## Jak budowany jest prompt systemowy
OpenClaw składa własny prompt systemowy przy każdym uruchomieniu. Obejmuje on:
- listę narzędzi + krótkie opisy
- listę Skills (tylko metadane; instrukcje są ładowane na żądanie za pomocą `read`)
- instrukcje samodzielnej aktualizacji
- obszar roboczy + pliki bootstrapu (`AGENTS.md`, `SOUL.md`, `TOOLS.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md`, `BOOTSTRAP.md` gdy nowe, a także `MEMORY.md`, jeśli istnieje, lub `memory.md` jako zapasowy wariant małymi literami). Duże pliki są obcinane przez `agents.defaults.bootstrapMaxChars` (domyślnie: 20000), a całkowite wstrzyknięcie bootstrapu jest ograniczone przez `agents.defaults.bootstrapTotalMaxChars` (domyślnie: 150000). Dzienne pliki `memory/*.md` nie są częścią zwykłego promptu bootstrapu; przy zwykłych turach pozostają dostępne na żądanie przez narzędzia pamięci, ale zwykłe `/new` i `/reset` mogą dodać na początku jednorazowy blok kontekstu startowego z ostatnią dzienną pamięcią dla tej pierwszej tury. Ten prelude startowy jest kontrolowany przez `agents.defaults.startupContext`.
- czas (UTC + strefa czasowa użytkownika)
- tagi odpowiedzi + zachowanie Heartbeat
- metadane runtime (host/OS/model/poziom myślenia)
- Listę narzędzi + krótkie opisy
- Listę Skills (tylko metadane; instrukcje są ładowane na żądanie przez `read`).
Zwięzły blok Skills jest ograniczony przez `skills.limits.maxSkillsPromptChars`,
z opcjonalnym nadpisaniem per agent w
`agents.list[].skillsLimits.maxSkillsPromptChars`.
- Instrukcje samoaktualizacji
- Pliki workspace + bootstrap (`AGENTS.md`, `SOUL.md`, `TOOLS.md`, `IDENTITY.md`, `USER.md`, `HEARTBEAT.md`, `BOOTSTRAP.md` gdy są nowe, a także `MEMORY.md`, gdy występuje, lub `memory.md` jako wariant z małych liter). Duże pliki są przycinane przez `agents.defaults.bootstrapMaxChars` (domyślnie: 12000), a całkowity wstrzykiwany bootstrap jest ograniczony przez `agents.defaults.bootstrapTotalMaxChars` (domyślnie: 60000). Codzienne pliki `memory/*.md` nie są częścią zwykłego promptu bootstrap; pozostają dostępne na żądanie przez narzędzia pamięci w zwykłych turach, ale czyste `/new` i `/reset` mogą dodać jednorazowy blok kontekstu startowego z ostatnią dzienną pamięcią dla tej pierwszej tury. To wprowadzenie startowe jest kontrolowane przez `agents.defaults.startupContext`.
- Czas (UTC + strefa czasowa użytkownika)
- Tagi odpowiedzi + zachowanie Heartbeat
- Metadane runtime (host/OS/model/thinking)
Pełny podział znajdziesz w [Prompt systemowy](/pl/concepts/system-prompt).
## Co liczy się do okna kontekstowego
## Co liczy się do okna kontekstu
Wszystko, co model otrzymuje, liczy się do limitu kontekstu:
- prompt systemowy (wszystkie sekcje wymienione powyżej)
- historia rozmowy (wiadomości użytkownika + asystenta)
- wywołania narzędzi i wyniki narzędzi
- załączniki/transkrypcje (obrazy, audio, pliki)
- podsumowania Compaction i artefakty przycinania
- wrappery dostawcy lub nagłówki bezpieczeństwa (niewidoczne, ale nadal liczone)
- Prompt systemowy (wszystkie sekcje wymienione powyżej)
- Historia rozmowy (wiadomości użytkownika i asystenta)
- Wywołania narzędzi i wyniki narzędzi
- Załączniki/transkrypcje (obrazy, audio, pliki)
- Podsumowania Compaction i artefakty przycinania
- Opakowania dostawcy lub nagłówki bezpieczeństwa (niewidoczne, ale nadal liczone)
Dla obrazów OpenClaw zmniejsza rozdzielczość ładunków obrazów w transkrypcjach/narzędziach przed wywołaniami dostawcy.
Niektóre powierzchnie runtime o dużym obciążeniu mają własne jawne limity:
- `agents.defaults.contextLimits.memoryGetMaxChars`
- `agents.defaults.contextLimits.memoryGetDefaultLines`
- `agents.defaults.contextLimits.toolResultMaxChars`
- `agents.defaults.contextLimits.postCompactionMaxChars`
Nadpisania per agent znajdują się w `agents.list[].contextLimits`. Te ustawienia
dotyczą ograniczonych fragmentów runtime i wstrzykiwanych bloków należących do runtime.
Są one oddzielone od limitów bootstrap, limitów kontekstu startowego i limitów
promptu Skills.
W przypadku obrazów OpenClaw skaluje w dół ładunki obrazów transkrypcji/narzędzi przed wywołaniami dostawcy.
Użyj `agents.defaults.imageMaxDimensionPx` (domyślnie: `1200`), aby to dostroić:
- niższe wartości zwykle zmniejszają zużycie tokenów vision i rozmiar ładunku
- wyższe wartości zachowują więcej szczegółów wizualnych dla OCR/zrzutów ekranu z intensywnym UI
- Niższe wartości zwykle zmniejszają użycie tokenów vision i rozmiar ładunku.
- Wyższe wartości zachowują więcej szczegółów wizualnych dla zrzutów ekranu z dużą ilością OCR/UI.
Aby zobaczyć praktyczny podział (na wstrzyknięty plik, narzędzia, Skills i rozmiar promptu systemowego), użyj `/context list` lub `/context detail`. Zobacz [Kontekst](/pl/concepts/context).
Aby uzyskać praktyczny podział (na każdy wstrzyknięty plik, narzędzia, Skills i rozmiar promptu systemowego), użyj `/context list` lub `/context detail`. Zobacz [Kontekst](/pl/concepts/context).
## Jak zobaczyć bieżące użycie tokenów
Użyj tych poleceń na czacie:
- `/status`**bogata w emoji karta statusu** z modelem sesji, wykorzystaniem kontekstu,
- `/status`**karta statusu bogata w emoji** z modelem sesji, użyciem kontekstu,
tokenami wejścia/wyjścia ostatniej odpowiedzi oraz **szacowanym kosztem** (tylko klucz API).
- `/usage off|tokens|full` → dodaje **stopkę użycia dla każdej odpowiedzi** do każdej odpowiedzi.
- Utrzymuje się per sesja (zapisywane jako `responseUsage`).
- Uwierzytelnianie OAuth **ukrywa koszt** (tylko tokeny).
- Utrzymuje się per sesja (przechowywane jako `responseUsage`).
- Autoryzacja OAuth **ukrywa koszt** (tylko tokeny).
- `/usage cost` → pokazuje lokalne podsumowanie kosztów z logów sesji OpenClaw.
Inne powierzchnie:
- **TUI/Web TUI:** obsługiwane są `/status` + `/usage`.
- **TUI/Web TUI:** obsługiwane są `/status` i `/usage`.
- **CLI:** `openclaw status --usage` i `openclaw channels list` pokazują
znormalizowane okna limitów dostawcy (`X% left`, a nie koszty dla poszczególnych odpowiedzi).
Obecni dostawcy okien użycia: Anthropic, GitHub Copilot, Gemini CLI,
znormalizowane okna limitów dostawców (`X% left`, a nie koszty per odpowiedź).
Obecni dostawcy z oknami użycia: Anthropic, GitHub Copilot, Gemini CLI,
OpenAI Codex, MiniMax, Xiaomi i z.ai.
Powierzchnie użycia normalizują typowe aliasy pól natywnych dostawców przed wyświetleniem.
Powierzchnie użycia normalizują popularne aliasy pól natywnych dla dostawców przed wyświetleniem.
Dla ruchu OpenAI-family Responses obejmuje to zarówno `input_tokens` /
`output_tokens`, jak i `prompt_tokens` / `completion_tokens`, więc specyficzne dla transportu
nazwy pól nie zmieniają `/status`, `/usage` ani podsumowań sesji.
Użycie JSON Gemini CLI jest również normalizowane: tekst odpowiedzi pochodzi z `response`, a
`output_tokens`, jak i `prompt_tokens` / `completion_tokens`, więc nazwy pól
zależne od transportu nie zmieniają `/status`, `/usage` ani podsumowań sesji.
Użycie Gemini CLI JSON również jest normalizowane: tekst odpowiedzi pochodzi z `response`, a
`stats.cached` mapuje się na `cacheRead`, przy czym używane jest `stats.input_tokens - stats.cached`,
gdy CLI pomija jawne pole `stats.input`.
Dla natywnego ruchu OpenAI-family Responses aliasy użycia WebSocket/SSE są
normalizowane w ten sam sposób, a sumy całkowite wracają do znormalizowanego wejścia + wyjścia, gdy
`total_tokens` nie istnieje lub ma wartość `0`.
Gdy bieżąca migawka sesji jest uboga w dane, `/status` i `session_status` mogą
Gdy bieżący snapshot sesji jest ubogi, `/status` i `session_status` mogą
również odzyskać liczniki tokenów/cache oraz etykietę aktywnego modelu runtime z
najnowszego logu użycia transkryptu. Istniejące niezerowe wartości na żywo nadal mają
pierwszeństwo przed wartościami odzyskanymi z transkryptu, a większe sumy zorientowane na prompt
z transkryptu mogą wygrać, gdy zapisane sumy nie istnieją lub są mniejsze.
Uwierzytelnianie użycia dla okien limitów dostawcy pochodzi z hooków specyficznych dla dostawcy, gdy są dostępne;
w przeciwnym razie OpenClaw wraca do dopasowywania poświadczeń OAuth/klucza API
z profili uwierzytelniania, env lub konfiguracji.
najnowszego logu użycia transkrypcji. Istniejące niezerowe wartości live nadal mają
pierwszeństwo przed wartościami awaryjnie pobranymi z transkrypcji, a większe sumy
zorientowane na prompt z transkrypcji mogą wygrać, gdy zapisane sumy nie istnieją
lub są mniejsze.
Autoryzacja użycia dla okien limitów dostawców pochodzi z hooków specyficznych dla dostawcy, gdy są dostępne;
w przeciwnym razie OpenClaw wraca do dopasowywania poświadczeń OAuth/klucza API z
profili auth, env lub config.
## Szacowanie kosztów (gdy jest pokazywane)
## Szacowanie kosztów (gdy jest wyświetlane)
Koszty są szacowane na podstawie konfiguracji cen modelu:
@ -97,35 +113,36 @@ Koszty są szacowane na podstawie konfiguracji cen modelu:
models.providers.<provider>.models[].cost
```
Są to wartości **USD za 1M tokenów** dla `input`, `output`, `cacheRead` i
Są to wartości **USD za 1M tokenów** dla `input`, `output`, `cacheRead` oraz
`cacheWrite`. Jeśli brakuje cen, OpenClaw pokazuje tylko tokeny. Tokeny OAuth
nigdy nie pokazują kosztu w dolarach.
## Wpływ TTL cache i przycinania
Cache promptu dostawcy ma zastosowanie tylko w obrębie okna TTL cache. OpenClaw może
opcjonalnie uruchamiać **przycinanie cache-ttl**: przycina sesję po wygaśnięciu TTL
cache, a następnie resetuje okno cache, aby kolejne żądania mogły ponownie używać
świeżo zcacheowanego kontekstu zamiast ponownie cacheować całą historię. Utrzymuje to
niższe koszty zapisu cache, gdy sesja pozostaje bezczynna po TTL.
Cache promptów dostawcy działa tylko w obrębie okna TTL cache. OpenClaw może
opcjonalnie uruchamiać **przycinanie cache-ttl**: przycina sesję po wygaśnięciu
TTL cache, a następnie resetuje okno cache, aby kolejne żądania mogły ponownie użyć
świeżo zcacheowanego kontekstu zamiast ponownie cacheować pełną historię. Dzięki temu koszty
zapisu cache pozostają niższe, gdy sesja pozostaje bezczynna dłużej niż TTL.
Skonfiguruj to w [Konfiguracja Gateway](/pl/gateway/configuration), a szczegóły
działania znajdziesz w [Przycinanie sesji](/pl/concepts/session-pruning).
zachowania znajdziesz w [Przycinanie sesji](/pl/concepts/session-pruning).
Heartbeat może utrzymywać cache **ciepły** podczas przerw bezczynności. Jeśli TTL cache modelu
wynosi `1h`, ustawienie interwału Heartbeat nieco poniżej tego czasu (np. `55m`) może zapobiec
ponownemu cacheowaniu całego promptu, zmniejszając koszty zapisu cache.
Heartbeat może utrzymywać cache **warm** w przerwach bezczynności. Jeśli TTL cache
Twojego modelu wynosi `1h`, ustawienie interwału Heartbeat tuż poniżej tej wartości
(np. `55m`) może zapobiec ponownemu cacheowaniu pełnego promptu, zmniejszając koszty
zapisu cache.
W konfiguracjach wieloagentowych możesz utrzymać jedną współdzieloną konfigurację modelu i dostrajać zachowanie cache
dla każdego agenta przez `agents.list[].params.cacheRetention`.
per agent za pomocą `agents.list[].params.cacheRetention`.
Pełny przewodnik po wszystkich ustawieniach znajdziesz w [Prompt Caching](/pl/reference/prompt-caching).
W przypadku cen API Anthropic odczyty cache są znacząco tańsze niż tokeny wejściowe,
podczas gdy zapisy cache są rozliczane według wyższego mnożnika. Najnowsze stawki i mnożniki TTL znajdziesz w cenniku prompt caching Anthropic:
W przypadku cen API Anthropic odczyty cache są znacznie tańsze niż tokeny
wejściowe, natomiast zapisy cache są rozliczane z wyższym mnożnikiem. Aktualne stawki i mnożniki TTL znajdziesz w cenniku prompt caching Anthropic:
[https://docs.anthropic.com/docs/build-with-claude/prompt-caching](https://docs.anthropic.com/docs/build-with-claude/prompt-caching)
### Przykład: utrzymanie 1h cache w cieple za pomocą Heartbeat
### Przykład: utrzymywanie cache 1h w stanie warm za pomocą Heartbeat
```yaml
agents:
@ -150,24 +167,24 @@ agents:
models:
"anthropic/claude-opus-4-6":
params:
cacheRetention: "long" # domyślna baza dla większości agentów
cacheRetention: "long" # default baseline for most agents
list:
- id: "research"
default: true
heartbeat:
every: "55m" # utrzymuj długi cache w cieple dla głębokich sesji
every: "55m" # keep long cache warm for deep sessions
- id: "alerts"
params:
cacheRetention: "none" # unikaj zapisów cache dla skokowych powiadomień
cacheRetention: "none" # avoid cache writes for bursty notifications
```
`agents.list[].params` scala się na wierzchu `params` wybranego modelu, więc możesz
nadpisać tylko `cacheRetention` i pozostawić inne domyślne ustawienia modelu bez zmian.
nadpisać tylko `cacheRetention` i odziedziczyć pozostałe domyślne ustawienia modelu bez zmian.
### Przykład: włączenie nagłówka beta Anthropic 1M context
Okno kontekstowe 1M w Anthropic jest obecnie objęte bramką beta. OpenClaw może wstrzyknąć wymaganą
wartość `anthropic-beta`, gdy włączysz `context1m` w obsługiwanych modelach Opus
Okno kontekstu 1M Anthropic jest obecnie objęte bramką beta. OpenClaw może wstrzyknąć
wymaganą wartość `anthropic-beta`, gdy włączysz `context1m` w obsługiwanych modelach Opus
lub Sonnet.
```yaml
@ -179,23 +196,23 @@ agents:
context1m: true
```
To mapuje się na nagłówek beta Anthropic `context-1m-2025-08-07`.
Mapuje się to na nagłówek beta Anthropic `context-1m-2025-08-07`.
Ma to zastosowanie tylko wtedy, gdy dla tego wpisu modelu ustawiono `context1m: true`.
Ma to zastosowanie tylko wtedy, gdy `context1m: true` jest ustawione w tym wpisie modelu.
Wymaganie: poświadczenie musi kwalifikować się do użycia długiego kontekstu. Jeśli nie,
Anthropic odpowie błędem limitu po stronie dostawcy dla tego żądania.
Jeśli uwierzytelniasz Anthropic tokenami OAuth/subskrypcyjnymi (`sk-ant-oat-*`),
Jeśli uwierzytelniasz Anthropic za pomocą tokenów OAuth/subscription (`sk-ant-oat-*`),
OpenClaw pomija nagłówek beta `context-1m-*`, ponieważ Anthropic obecnie
odrzuca tę kombinację z HTTP 401.
## Wskazówki dotyczące zmniejszania presji tokenowej
## Wskazówki, jak zmniejszyć presję tokenów
- Użyj `/compact`, aby podsumować długie sesje.
- Przycinaj duże wyjścia narzędzi w swoich workflow.
- Ograniczaj duże wyniki narzędzi w swoich workflow.
- Obniż `agents.defaults.imageMaxDimensionPx` dla sesji z dużą liczbą zrzutów ekranu.
- Utrzymuj krótkie opisy Skills (lista Skills jest wstrzykiwana do promptu).
- Preferuj mniejsze modele do rozwlekłej, eksploracyjnej pracy.
- W przypadku rozwlekłej, eksploracyjnej pracy preferuj mniejsze modele.
Dokładny wzór narzutu listy Skills znajdziesz w [Skills](/pl/tools/skills).
Zobacz [Skills](/pl/tools/skills), aby poznać dokładny wzór narzutu listy Skills.