chore(i18n): refresh pl translations
This commit is contained in:
parent
d40312a564
commit
14c98fc84d
File diff suppressed because it is too large
Load Diff
@ -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
@ -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ą też 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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 zcache’owanego kontekstu zamiast ponownie cache’ować 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 zcache’owanego kontekstu zamiast ponownie cache’ować 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 cache’owaniu 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 cache’owaniu 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.
|
||||
|
||||
Loading…
Reference in New Issue
Block a user