64 KiB
| read_when | summary | title | x-i18n | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Zestaw testowy: pakiety testów unit/e2e/live, uruchamiacze Docker i zakres pokrycia poszczególnych testów | Testowanie |
|
Testowanie
OpenClaw ma trzy pakiety Vitest (unit/integration, e2e, live) oraz niewielki zestaw uruchamiaczy Docker.
Ten dokument jest przewodnikiem „jak testujemy”:
- Co obejmuje każdy pakiet testów (i czego celowo nie obejmuje)
- Jakie polecenia uruchamiać w typowych przepływach pracy (lokalnie, przed pushem, debugowanie)
- Jak testy live wykrywają poświadczenia oraz wybierają modele/dostawców
- Jak dodawać testy regresji dla rzeczywistych problemów modeli/dostawców
Szybki start
W większości dni:
- Pełna bramka (oczekiwana przed pushem):
pnpm build && pnpm check && pnpm test - Szybsze lokalne uruchomienie całego pakietu na wydajnej maszynie:
pnpm test:max - Bezpośrednia pętla obserwacji Vitest:
pnpm test:watch - Bezpośrednie wskazanie pliku teraz obsługuje także ścieżki rozszerzeń/kanałów:
pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts - Gdy iterujesz nad pojedynczym błędem, najpierw preferuj uruchomienia ukierunkowane.
- Witryna QA oparta na Docker:
pnpm qa:lab:up - Linia QA oparta na Linux VM:
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
Gdy modyfikujesz testy lub chcesz uzyskać większą pewność:
- Bramka pokrycia:
pnpm test:coverage - Pakiet E2E:
pnpm test:e2e
Podczas debugowania rzeczywistych dostawców/modeli (wymaga prawdziwych poświadczeń):
- Pakiet live (modele + sondy narzędzi/obrazów Gateway):
pnpm test:live - Ciche uruchomienie pojedynczego pliku live:
pnpm test:live -- src/agents/models.profiles.live.test.ts
Wskazówka: gdy potrzebujesz tylko jednego nieudanego przypadku, zawężaj testy live za pomocą zmiennych środowiskowych allowlist opisanych poniżej.
Uruchamiacze specyficzne dla QA
Te polecenia działają obok głównych pakietów testów, gdy potrzebujesz realizmu qa-lab:
pnpm openclaw qa suite- Uruchamia scenariusze QA wspierane przez repozytorium bezpośrednio na hoście.
- Domyślnie uruchamia równolegle wiele wybranych scenariuszy z izolowanymi workerami Gateway, maksymalnie do 64 workerów lub liczby wybranych scenariuszy. Użyj
--concurrency <count>, aby dostroić liczbę workerów, albo--concurrency 1dla starszej linii sekwencyjnej.
pnpm openclaw qa suite --runner multipass- Uruchamia ten sam pakiet QA wewnątrz jednorazowej maszyny wirtualnej Linux Multipass.
- Zachowuje ten sam sposób wyboru scenariuszy co
qa suitena hoście. - Używa tych samych flag wyboru dostawcy/modelu co
qa suite. - Uruchomienia live przekazują do gościa obsługiwane wejścia uwierzytelniania QA, które są praktyczne dla środowiska gościa:
klucze dostawców oparte na env, ścieżkę konfiguracji dostawcy QA live oraz
CODEX_HOME, jeśli jest obecne. - Katalogi wyjściowe muszą pozostawać pod korzeniem repozytorium, aby gość mógł zapisywać dane z powrotem przez zamontowany obszar roboczy.
- Zapisuje zwykły raport + podsumowanie QA oraz logi Multipass w
.artifacts/qa-e2e/....
pnpm qa:lab:up- Uruchamia witrynę QA opartą na Docker do pracy QA w stylu operatorskim.
pnpm openclaw qa matrix- Uruchamia linię live QA Matrix na jednorazowym homeserverze Tuwunel opartym na Docker.
- Tworzy trzy tymczasowe konta użytkowników Matrix (
driver,sut,observer) oraz jeden prywatny pokój, a następnie uruchamia podrzędny proces QA Gateway z rzeczywistym Plugin Matrix jako transportem SUT. - Domyślnie używa przypiętego stabilnego obrazu Tuwunel
ghcr.io/matrix-construct/tuwunel:v1.5.1. Zastąp przezOPENCLAW_QA_MATRIX_TUWUNEL_IMAGE, gdy musisz przetestować inny obraz. - Matrix obecnie obsługuje tylko
--credential-source env, ponieważ linia tworzy tymczasowych użytkowników lokalnie. - Zapisuje raport QA Matrix, podsumowanie oraz artefakt obserwowanych zdarzeń w
.artifacts/qa-e2e/....
pnpm openclaw qa telegram- Uruchamia linię live QA Telegram na rzeczywistej prywatnej grupie przy użyciu tokenów botów driver i SUT z env.
- Wymaga
OPENCLAW_QA_TELEGRAM_GROUP_ID,OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKENorazOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN. Identyfikator grupy musi być numerycznym identyfikatorem czatu Telegram. - Obsługuje
--credential-source convexdla współdzielonych poświadczeń z puli. Domyślnie używaj trybu env albo ustawOPENCLAW_QA_CREDENTIAL_SOURCE=convex, aby włączyć dzierżawy z puli. - Wymaga dwóch różnych botów w tej samej prywatnej grupie, przy czym bot SUT musi udostępniać nazwę użytkownika Telegram.
- Aby zapewnić stabilną obserwację bot-bot, włącz Bot-to-Bot Communication Mode w
@BotFatherdla obu botów i upewnij się, że bot driver może obserwować ruch botów w grupie. - Zapisuje raport QA Telegram, podsumowanie oraz artefakt obserwowanych wiadomości w
.artifacts/qa-e2e/....
Linie live dla transportów współdzielą jeden standardowy kontrakt, aby nowe transporty nie dryfowały.
qa-channel pozostaje szerokim syntetycznym pakietem QA i nie jest częścią macierzy pokrycia live dla transportów.
| Linia | Canary | Bramka wzmianek | Blokada allowlist | Odpowiedź najwyższego poziomu | Wznowienie po restarcie | Kontynuacja wątku | Izolacja wątku | Obserwacja reakcji | Polecenie pomocy |
|---|---|---|---|---|---|---|---|---|---|
| Matrix | x | x | x | x | x | x | x | x | |
| Telegram | x | x |
Współdzielone poświadczenia Telegram przez Convex (v1)
Gdy --credential-source convex (lub OPENCLAW_QA_CREDENTIAL_SOURCE=convex) jest włączone dla
openclaw qa telegram, laboratorium QA pobiera wyłączną dzierżawę z puli opartej na Convex, wysyła Heartbeat
tej dzierżawy, gdy linia działa, i zwalnia dzierżawę przy zamykaniu.
Referencyjny szkielet projektu Convex:
qa/convex-credential-broker/
Wymagane zmienne środowiskowe:
OPENCLAW_QA_CONVEX_SITE_URL(na przykładhttps://your-deployment.convex.site)- Jeden sekret dla wybranej roli:
OPENCLAW_QA_CONVEX_SECRET_MAINTAINERdlamaintainerOPENCLAW_QA_CONVEX_SECRET_CIdlaci
- Wybór roli poświadczeń:
- CLI:
--credential-role maintainer|ci - Domyślna wartość z env:
OPENCLAW_QA_CREDENTIAL_ROLE(domyślniemaintainer)
- CLI:
Opcjonalne zmienne środowiskowe:
OPENCLAW_QA_CREDENTIAL_LEASE_TTL_MS(domyślnie1200000)OPENCLAW_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS(domyślnie30000)OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS(domyślnie90000)OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS(domyślnie15000)OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX(domyślnie/qa-credentials/v1)OPENCLAW_QA_CREDENTIAL_OWNER_ID(opcjonalny identyfikator śledzenia)OPENCLAW_QA_ALLOW_INSECURE_HTTP=1pozwala na adresy URL Convexhttp://w local loopback wyłącznie do lokalnego developmentu.
OPENCLAW_QA_CONVEX_SITE_URL powinien używać https:// w normalnej pracy.
Polecenia administracyjne maintainera (dodawanie/usuwanie/listowanie puli) wymagają
konkretnie OPENCLAW_QA_CONVEX_SECRET_MAINTAINER.
Pomocnicze polecenia CLI dla maintainerów:
pnpm openclaw qa credentials add --kind telegram --payload-file qa/telegram-credential.json
pnpm openclaw qa credentials list --kind telegram
pnpm openclaw qa credentials remove --credential-id <credential-id>
Użyj --json, aby uzyskać wynik czytelny maszynowo w skryptach i narzędziach CI.
Domyślny kontrakt endpointu (OPENCLAW_QA_CONVEX_SITE_URL + /qa-credentials/v1):
POST /acquire- Żądanie:
{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs } - Sukces:
{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? } - Wyczerpanie/możliwość ponowienia:
{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }
- Żądanie:
POST /heartbeat- Żądanie:
{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs } - Sukces:
{ status: "ok" }(lub puste2xx)
- Żądanie:
POST /release- Żądanie:
{ kind, ownerId, actorRole, credentialId, leaseToken } - Sukces:
{ status: "ok" }(lub puste2xx)
- Żądanie:
POST /admin/add(tylko sekret maintainera)- Żądanie:
{ kind, actorId, payload, note?, status? } - Sukces:
{ status: "ok", credential }
- Żądanie:
POST /admin/remove(tylko sekret maintainera)- Żądanie:
{ credentialId, actorId } - Sukces:
{ status: "ok", changed, credential } - Ochrona aktywnej dzierżawy:
{ status: "error", code: "LEASE_ACTIVE", ... }
- Żądanie:
POST /admin/list(tylko sekret maintainera)- Żądanie:
{ kind?, status?, includePayload?, limit? } - Sukces:
{ status: "ok", credentials, count }
- Żądanie:
Kształt payload dla rodzaju Telegram:
{ groupId: string, driverToken: string, sutToken: string }groupIdmusi być ciągiem znaków będącym numerycznym identyfikatorem czatu Telegram.admin/addwaliduje ten kształt dlakind: "telegram"i odrzuca nieprawidłowy payload.
Dodawanie kanału do QA
Dodanie kanału do markdownowego systemu QA wymaga dokładnie dwóch rzeczy:
- Adaptera transportu dla kanału.
- Pakietu scenariuszy, który testuje kontrakt kanału.
Nie dodawaj uruchamiacza QA specyficznego dla kanału, jeśli wspólny uruchamiacz qa-lab
może obsłużyć ten przepływ.
qa-lab odpowiada za wspólną mechanikę:
- uruchamianie i zamykanie pakietu
- współbieżność workerów
- zapisywanie artefaktów
- generowanie raportów
- wykonywanie scenariuszy
- aliasy zgodności dla starszych scenariuszy
qa-channel
Adapter kanału odpowiada za kontrakt transportu:
- jak Gateway jest konfigurowany dla tego transportu
- jak sprawdzana jest gotowość
- jak wstrzykiwane są zdarzenia przychodzące
- jak obserwowane są wiadomości wychodzące
- jak udostępniane są transkrypcje i znormalizowany stan transportu
- jak wykonywane są akcje oparte na transporcie
- jak obsługiwany jest reset lub czyszczenie specyficzne dla transportu
Minimalny próg wdrożenia dla nowego kanału to:
- Zaimplementować adapter transportu na wspólnej granicy
qa-lab. - Zarejestrować adapter w rejestrze transportów.
- Zachować mechanikę specyficzną dla transportu wewnątrz adaptera lub harnessu kanału.
- Napisać lub dostosować scenariusze markdown w
qa/scenarios/. - Używać ogólnych helperów scenariuszy dla nowych scenariuszy.
- Zachować działanie istniejących aliasów zgodności, chyba że repozytorium przeprowadza zamierzoną migrację.
Zasada decyzyjna jest ścisła:
- Jeśli zachowanie można wyrazić raz w
qa-lab, umieść je wqa-lab. - Jeśli zachowanie zależy od jednego transportu kanału, zachowaj je w tym adapterze lub harnessie Plugin.
- Jeśli scenariusz wymaga nowej możliwości, z której może skorzystać więcej niż jeden kanał, dodaj ogólny helper zamiast gałęzi specyficznej dla kanału w
suite.ts. - Jeśli zachowanie ma sens tylko dla jednego transportu, zachowaj scenariusz jako specyficzny dla tego transportu i zaznacz to wyraźnie w kontrakcie scenariusza.
Preferowane nazwy ogólnych helperów dla nowych scenariuszy to:
waitForTransportReadywaitForChannelReadyinjectInboundMessageinjectOutboundMessagewaitForTransportOutboundMessagewaitForChannelOutboundMessagewaitForNoTransportOutboundgetTransportSnapshotreadTransportMessagereadTransportTranscriptformatTransportTranscriptresetTransport
Aliasy zgodności pozostają dostępne dla istniejących scenariuszy, w tym:
waitForQaChannelReadywaitForOutboundMessagewaitForNoOutboundformatConversationTranscriptresetBus
Nowa praca nad kanałami powinna używać ogólnych nazw helperów. Aliasy zgodności istnieją po to, aby uniknąć migracji typu flag day, a nie jako model tworzenia nowych scenariuszy.
Pakiety testów (co uruchamia się gdzie)
O pakietach warto myśleć jako o „rosnącym realizmie” (oraz rosnącej podatności na błędy/niestabilność i koszcie):
Unit / integration (domyślne)
- Polecenie:
pnpm test - Konfiguracja: dziesięć sekwencyjnych uruchomień shardów (
vitest.full-*.config.ts) na istniejących zakresowanych projektach Vitest - Pliki: inwentarze core/unit w
src/**/*.test.ts,packages/**/*.test.ts,test/**/*.test.tsoraz umieszczone na allowliście testy node wui, objęte przezvitest.unit.config.ts - Zakres:
- Czyste testy unit
- Testy integracyjne in-process (uwierzytelnianie Gateway, routing, narzędzia, parsowanie, konfiguracja)
- Deterministyczne testy regresji dla znanych błędów
- Oczekiwania:
- Uruchamia się w CI
- Nie wymaga prawdziwych kluczy
- Powinno być szybkie i stabilne
- Uwaga o projektach:
- Niekierunkowane
pnpm testuruchamia teraz jedenaście mniejszych konfiguracji shardów (core-unit-src,core-unit-security,core-unit-ui,core-unit-support,core-support-boundary,core-contracts,core-bundled,core-runtime,agentic,auto-reply,extensions) zamiast jednego ogromnego natywnego procesu root-project. Zmniejsza to szczytowe RSS na obciążonych maszynach i zapobiega temu, by praceauto-reply/rozszerzeń zagłodziły niezwiązane pakiety. pnpm test --watchnadal używa natywnego grafu projektów rootvitest.config.ts, ponieważ wieloszardowa pętla watch nie jest praktyczna.pnpm test,pnpm test:watchipnpm test:perf:importskierują jawne cele plików/katalogów najpierw przez zakresowane linie, dzięki czemupnpm test extensions/discord/src/monitor/message-handler.preflight.test.tsnie płaci kosztu uruchomienia pełnego root project.pnpm test:changedrozwija zmienione ścieżki git do tych samych zakresowanych linii, gdy diff dotyczy tylko routowalnych plików źródłowych/testowych; edycje konfiguracji/ustawień nadal przechodzą do szerokiego ponownego uruchomienia root project.- Lekkie importowo testy unit z agentów, poleceń, pluginów, helperów
auto-reply,plugin-sdki podobnych czystych obszarów narzędziowych są kierowane przez linięunit-fast, która pomijatest/setup-openclaw-runtime.ts; pliki stanowe/ciężkie runtime pozostają na istniejących liniach. - Wybrane pliki źródłowe helperów
plugin-sdkicommandsrównież mapują uruchomienia trybu changed do jawnych sąsiednich testów w tych lekkich liniach, dzięki czemu edycje helperów nie wymuszają ponownego uruchamiania całego ciężkiego pakietu dla tego katalogu. auto-replyma teraz trzy dedykowane koszyki: helpery core najwyższego poziomu, testy integracyjne najwyższego poziomureply.*oraz poddrzewosrc/auto-reply/reply/**. Dzięki temu najcięższa praca harnessu odpowiedzi nie trafia do tanich testów status/chunk/token.
- Niekierunkowane
- Uwaga o osadzonym uruchamiaczu:
- Gdy zmieniasz wejścia wykrywania message-tool lub kontekst runtime Compaction, utrzymuj oba poziomy pokrycia.
- Dodawaj ukierunkowane testy regresji helperów dla czystych granic routingu/normalizacji.
- Utrzymuj też w dobrej kondycji pakiety integracyjne osadzonego uruchamiacza:
src/agents/pi-embedded-runner/compact.hooks.test.ts,src/agents/pi-embedded-runner/run.overflow-compaction.test.tsorazsrc/agents/pi-embedded-runner/run.overflow-compaction.loop.test.ts. - Te pakiety weryfikują, że zakresowane identyfikatory i zachowanie Compaction nadal przepływają
przez rzeczywiste ścieżki
run.ts/compact.ts; same testy helperów nie są wystarczającym zamiennikiem dla tych ścieżek integracyjnych.
- Uwaga o puli:
- Bazowa konfiguracja Vitest domyślnie używa teraz
threads. - Współdzielona konfiguracja Vitest ustawia również
isolate: falsei używa nieizolowanego uruchamiacza w projektach root, konfiguracjach e2e i live. - Główna linia UI zachowuje konfigurację
jsdomi optimizer, ale teraz również działa na współdzielonym nieizolowanym uruchamiaczu. - Każdy shard
pnpm testdziedziczy te same domyślne ustawieniathreads+isolate: falseze współdzielonej konfiguracji Vitest. - Współdzielony launcher
scripts/run-vitest.mjsdomyślnie dodaje teraz także--no-maglevdla podrzędnych procesów Node Vitest, aby ograniczyć narzut kompilacji V8 podczas dużych lokalnych uruchomień. UstawOPENCLAW_VITEST_ENABLE_MAGLEV=1, jeśli chcesz porównać zachowanie z domyślnym V8.
- Bazowa konfiguracja Vitest domyślnie używa teraz
- Uwaga o szybkiej iteracji lokalnej:
pnpm test:changedkieruje przez zakresowane linie, gdy zmienione ścieżki czysto mapują się na mniejszy pakiet.pnpm test:maxipnpm test:changed:maxzachowują to samo kierowanie, tylko z wyższym limitem workerów.- Automatyczne skalowanie lokalnych workerów jest teraz celowo konserwatywne i dodatkowo zwalnia, gdy średnie obciążenie hosta jest już wysokie, dzięki czemu wiele równoczesnych uruchomień Vitest domyślnie powoduje mniej szkód.
- Bazowa konfiguracja Vitest oznacza projekty/pliki konfiguracyjne jako
forceRerunTriggers, aby ponowne uruchomienia w trybie changed pozostawały poprawne, gdy zmienia się okablowanie testów. - Konfiguracja utrzymuje włączone
OPENCLAW_VITEST_FS_MODULE_CACHEna obsługiwanych hostach; ustawOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path, jeśli chcesz jeden jawny katalog cache do bezpośredniego profilowania.
- Uwaga o debugowaniu wydajności:
pnpm test:perf:importswłącza raportowanie czasu importu Vitest oraz wynik z podziałem importów.pnpm test:perf:imports:changedzawęża ten sam widok profilowania do plików zmienionych odorigin/main.
pnpm test:perf:changed:bench -- --ref <git-ref>porównuje kierowanetest:changedz natywną ścieżką root-project dla tego zatwierdzonego diffu i wypisuje czas ścienny oraz maksymalne RSS na macOS.pnpm test:perf:changed:bench -- --worktreebenchmarkuje bieżące brudne drzewo, kierując listę zmienionych plików przezscripts/test-projects.mjsoraz główną konfigurację Vitest.pnpm test:perf:profile:mainzapisuje profil CPU głównego wątku dla narzutu uruchamiania i transformacji Vitest/Vite.pnpm test:perf:profile:runnerzapisuje profile CPU+heap uruchamiacza dla pakietu unit z wyłączoną równoległością plików.
E2E (smoke Gateway)
- Polecenie:
pnpm test:e2e - Konfiguracja:
vitest.e2e.config.ts - Pliki:
src/**/*.e2e.test.ts,test/**/*.e2e.test.ts - Domyślne ustawienia runtime:
- Używa Vitest
threadszisolate: false, zgodnie z resztą repozytorium. - Używa adaptacyjnej liczby workerów (CI: do 2, lokalnie: domyślnie 1).
- Domyślnie działa w trybie cichym, aby ograniczyć narzut I/O konsoli.
- Używa Vitest
- Przydatne nadpisania:
OPENCLAW_E2E_WORKERS=<n>aby wymusić liczbę workerów (maksymalnie 16).OPENCLAW_E2E_VERBOSE=1aby ponownie włączyć szczegółowy wynik konsoli.
- Zakres:
- Zachowanie end-to-end Gateway z wieloma instancjami
- Powierzchnie WebSocket/HTTP, parowanie Node oraz cięższa komunikacja sieciowa
- Oczekiwania:
- Uruchamia się w CI (gdy jest włączone w pipeline)
- Nie wymaga prawdziwych kluczy
- Ma więcej ruchomych części niż testy unit (może być wolniejsze)
E2E: smoke backendu OpenShell
- Polecenie:
pnpm test:e2e:openshell - Plik:
test/openshell-sandbox.e2e.test.ts - Zakres:
- Uruchamia na hoście izolowany Gateway OpenShell przez Docker
- Tworzy sandbox z tymczasowego lokalnego Dockerfile
- Testuje backend OpenShell w OpenClaw przez rzeczywiste
sandbox ssh-config+ wykonanie SSH - Weryfikuje zdalnie kanoniczne zachowanie systemu plików przez most fs sandboxa
- Oczekiwania:
- Tylko opt-in; nie jest częścią domyślnego uruchomienia
pnpm test:e2e - Wymaga lokalnego CLI
openshelloraz działającego demona Docker - Używa izolowanych
HOME/XDG_CONFIG_HOME, a następnie niszczy testowy Gateway i sandbox
- Tylko opt-in; nie jest częścią domyślnego uruchomienia
- Przydatne nadpisania:
OPENCLAW_E2E_OPENSHELL=1, aby włączyć test przy ręcznym uruchamianiu szerszego pakietu e2eOPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell, aby wskazać niestandardowy binarny plik CLI lub skrypt wrappera
Live (rzeczywiści dostawcy + rzeczywiste modele)
- Polecenie:
pnpm test:live - Konfiguracja:
vitest.live.config.ts - Pliki:
src/**/*.live.test.ts - Domyślnie: włączone przez
pnpm test:live(ustawiaOPENCLAW_LIVE_TEST=1) - Zakres:
- „Czy ten dostawca/model naprawdę działa dzisiaj z prawdziwymi poświadczeniami?”
- Wychwytywanie zmian formatu dostawcy, niuansów wywołań narzędzi, problemów z uwierzytelnianiem oraz zachowania limitów szybkości
- Oczekiwania:
- Z założenia niestabilne w CI (rzeczywiste sieci, rzeczywiste polityki dostawców, limity, awarie)
- Kosztują pieniądze / zużywają limity szybkości
- Lepiej uruchamiać zawężone podzbiory zamiast „wszystkiego”
- Uruchomienia live pobierają
~/.profile, aby przejąć brakujące klucze API. - Domyślnie uruchomienia live nadal izolują
HOMEi kopiują materiały konfiguracji/uwierzytelniania do tymczasowego katalogu testowego, aby fixture unit nie mogły modyfikować twojego rzeczywistego~/.openclaw. - Ustaw
OPENCLAW_LIVE_USE_REAL_HOME=1tylko wtedy, gdy celowo chcesz, by testy live używały twojego rzeczywistego katalogu domowego. pnpm test:livedomyślnie działa teraz w cichszym trybie: zachowuje wynik postępu[live] ..., ale ukrywa dodatkowy komunikat o~/.profilei wycisza logi bootstrapu Gateway/hałas Bonjour. UstawOPENCLAW_LIVE_TEST_QUIET=0, jeśli chcesz z powrotem pełne logi startowe.- Rotacja kluczy API (specyficzna dla dostawcy): ustaw
*_API_KEYSw formacie rozdzielanym przecinkami/średnikami albo*_API_KEY_1,*_API_KEY_2(na przykładOPENAI_API_KEYS,ANTHROPIC_API_KEYS,GEMINI_API_KEYS) lub nadpisanie per-live przezOPENCLAW_LIVE_*_KEY; testy ponawiają próby przy odpowiedziach z limitem szybkości. - Wynik postępu/Heartbeat:
- Pakiety live emitują teraz linie postępu do stderr, dzięki czemu długie wywołania dostawców są widocznie aktywne, nawet gdy przechwytywanie konsoli Vitest jest wyciszone.
vitest.live.config.tswyłącza przechwytywanie konsoli przez Vitest, dzięki czemu linie postępu dostawcy/Gateway są strumieniowane natychmiast podczas uruchomień live.- Dostosuj Heartbeat dla bezpośrednich modeli przez
OPENCLAW_LIVE_HEARTBEAT_MS. - Dostosuj Heartbeat dla Gateway/sond przez
OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS.
Który pakiet powinienem uruchomić?
Użyj tej tabeli decyzyjnej:
- Edycja logiki/testów: uruchom
pnpm test(orazpnpm test:coverage, jeśli zmieniłeś dużo) - Zmiany w komunikacji sieciowej Gateway / protokole WS / parowaniu: dodaj
pnpm test:e2e - Debugowanie „mój bot nie działa” / błędów specyficznych dla dostawcy / wywołań narzędzi: uruchom zawężone
pnpm test:live
Live: przegląd możliwości Android Node
- Test:
src/gateway/android-node.capabilities.live.test.ts - Skrypt:
pnpm android:test:integration - Cel: wywołać każde polecenie aktualnie ogłaszane przez podłączony Android Node i sprawdzić zachowanie kontraktu poleceń.
- Zakres:
- Wstępnie przygotowana/ręczna konfiguracja (pakiet nie instaluje, nie uruchamia ani nie paruje aplikacji).
- Walidacja
node.invokeGateway polecenie po poleceniu dla wybranego Android Node.
- Wymagane przygotowanie:
- Aplikacja Android jest już połączona i sparowana z Gateway.
- Aplikacja pozostaje na pierwszym planie.
- Uprawnienia/zgody na przechwytywanie zostały przyznane dla możliwości, które mają przechodzić.
- Opcjonalne nadpisania celu:
OPENCLAW_ANDROID_NODE_IDlubOPENCLAW_ANDROID_NODE_NAME.OPENCLAW_ANDROID_GATEWAY_URL/OPENCLAW_ANDROID_GATEWAY_TOKEN/OPENCLAW_ANDROID_GATEWAY_PASSWORD.
- Pełne szczegóły konfiguracji Android: Android App
Live: smoke modeli (klucze profili)
Testy live są podzielone na dwie warstwy, aby można było izolować błędy:
- „Direct model” mówi nam, czy dostawca/model w ogóle potrafi odpowiedzieć przy danym kluczu.
- „Gateway smoke” mówi nam, czy pełny pipeline gateway+agent działa dla tego modelu (sesje, historia, narzędzia, polityka sandbox itd.).
Warstwa 1: bezpośrednie ukończenie modelu (bez Gateway)
- Test:
src/agents/models.profiles.live.test.ts - Cel:
- Wyliczać wykryte modele
- Używać
getApiKeyForModeldo wyboru modeli, dla których masz poświadczenia - Wykonywać małe ukończenie dla każdego modelu (oraz ukierunkowane testy regresji tam, gdzie to potrzebne)
- Jak włączyć:
pnpm test:live(lubOPENCLAW_LIVE_TEST=1, jeśli wywołujesz Vitest bezpośrednio)
- Ustaw
OPENCLAW_LIVE_MODELS=modern(luball, alias dla modern), aby faktycznie uruchomić ten pakiet; w przeciwnym razie zostanie pominięty, abypnpm test:livebyło skupione na smoke Gateway - Jak wybierać modele:
OPENCLAW_LIVE_MODELS=modern, aby uruchomić nowoczesną allowlistę (Opus/Sonnet 4.6+, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.7, Grok 4)OPENCLAW_LIVE_MODELS=alljest aliasem dla nowoczesnej allowlisty- albo
OPENCLAW_LIVE_MODELS="openai/gpt-5.4,anthropic/claude-opus-4-6,..."(allowlista rozdzielana przecinkami) - Przeglądy modern/all domyślnie używają kuratorowanego limitu o wysokim sygnale; ustaw
OPENCLAW_LIVE_MAX_MODELS=0dla wyczerpującego przeglądu modern albo dodatnią liczbę dla mniejszego limitu.
- Jak wybierać dostawców:
OPENCLAW_LIVE_PROVIDERS="google,google-antigravity,google-gemini-cli"(allowlista rozdzielana przecinkami)
- Skąd pochodzą klucze:
- Domyślnie: magazyn profili i fallbacki env
- Ustaw
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1, aby wymusić wyłącznie magazyn profili
- Po co to istnieje:
- Oddziela „API dostawcy jest zepsute / klucz jest nieprawidłowy” od „pipeline agenta Gateway jest zepsuty”
- Zawiera małe, izolowane testy regresji (przykład: replay rozumowania OpenAI Responses/Codex Responses + przepływy wywołań narzędzi)
Warstwa 2: smoke Gateway + agenta developerskiego (to, co faktycznie robi „@openclaw”)
- Test:
src/gateway/gateway-models.profiles.live.test.ts - Cel:
- Uruchomić in-process Gateway
- Utworzyć/spatchować sesję
agent:dev:*(nadpisanie modelu dla każdego uruchomienia) - Iterować po modelach-z-kluczami i sprawdzać:
- „sensowną” odpowiedź (bez narzędzi)
- że rzeczywiste wywołanie narzędzia działa (sonda odczytu)
- opcjonalne dodatkowe sondy narzędzi (sonda exec+read)
- że ścieżki regresji OpenAI (tylko tool-call → follow-up) nadal działają
- Szczegóły sond (aby można było szybko wyjaśniać błędy):
- sonda
read: test zapisuje plik nonce w obszarze roboczym i prosi agenta o jegoreadoraz odesłanie nonce. - sonda
exec+read: test prosi agenta o zapisanie nonce do pliku tymczasowego przezexec, a następnie o jego odczytanie przezread. - sonda obrazu: test dołącza wygenerowany PNG (kot + losowy kod) i oczekuje, że model zwróci
cat <CODE>. - Referencja implementacyjna:
src/gateway/gateway-models.profiles.live.test.tsorazsrc/gateway/live-image-probe.ts.
- sonda
- Jak włączyć:
pnpm test:live(lubOPENCLAW_LIVE_TEST=1, jeśli wywołujesz Vitest bezpośrednio)
- Jak wybierać modele:
- Domyślnie: nowoczesna allowlista (Opus/Sonnet 4.6+, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.7, Grok 4)
OPENCLAW_LIVE_GATEWAY_MODELS=alljest aliasem dla nowoczesnej allowlisty- Albo ustaw
OPENCLAW_LIVE_GATEWAY_MODELS="provider/model"(lub listę rozdzielaną przecinkami), aby zawęzić - Przeglądy gateway modern/all domyślnie używają kuratorowanego limitu o wysokim sygnale; ustaw
OPENCLAW_LIVE_GATEWAY_MAX_MODELS=0dla wyczerpującego przeglądu modern albo dodatnią liczbę dla mniejszego limitu.
- Jak wybierać dostawców (aby uniknąć „wszystkiego z OpenRouter”):
OPENCLAW_LIVE_GATEWAY_PROVIDERS="google,google-antigravity,google-gemini-cli,openai,anthropic,zai,minimax"(allowlista rozdzielana przecinkami)
- Sondy narzędzi + obrazu są zawsze włączone w tym teście live:
- sonda
read+ sondaexec+read(obciążenie narzędzi) - sonda obrazu działa, gdy model deklaruje obsługę wejścia obrazowego
- Przepływ (na wysokim poziomie):
- Test generuje mały PNG z napisem „CAT” + losowym kodem (
src/gateway/live-image-probe.ts) - Wysyła go przez
agentattachments: [{ mimeType: "image/png", content: "<base64>" }] - Gateway parsuje załączniki do
images[](src/gateway/server-methods/agent.ts+src/gateway/chat-attachments.ts) - Osadzony agent przekazuje do modelu multimodalną wiadomość użytkownika
- Asercja: odpowiedź zawiera
cat+ kod (tolerancja OCR: drobne błędy są dozwolone)
- Test generuje mały PNG z napisem „CAT” + losowym kodem (
- sonda
Wskazówka: aby zobaczyć, co możesz testować na swojej maszynie (oraz dokładne identyfikatory provider/model), uruchom:
openclaw models list
openclaw models list --json
Live: smoke backendu CLI (Claude, Codex, Gemini lub inne lokalne CLI)
- Test:
src/gateway/gateway-cli-backend.live.test.ts - Cel: zweryfikować pipeline Gateway + agent przy użyciu lokalnego backendu CLI, bez naruszania domyślnej konfiguracji.
- Domyślne ustawienia smoke specyficzne dla backendu znajdują się w definicji
cli-backend.tsnależącej do odpowiedniego rozszerzenia. - Włączanie:
pnpm test:live(lubOPENCLAW_LIVE_TEST=1, jeśli wywołujesz Vitest bezpośrednio)OPENCLAW_LIVE_CLI_BACKEND=1
- Domyślne ustawienia:
- Domyślny dostawca/model:
claude-cli/claude-sonnet-4-6 - Zachowanie polecenia/argumentów/obrazu pochodzi z metadanych Plugin odpowiedzialnego za backend CLI.
- Domyślny dostawca/model:
- Nadpisania (opcjonalne):
OPENCLAW_LIVE_CLI_BACKEND_MODEL="codex-cli/gpt-5.4"OPENCLAW_LIVE_CLI_BACKEND_COMMAND="/full/path/to/codex"OPENCLAW_LIVE_CLI_BACKEND_ARGS='["exec","--json","--color","never","--sandbox","read-only","--skip-git-repo-check"]'OPENCLAW_LIVE_CLI_BACKEND_IMAGE_PROBE=1, aby wysłać rzeczywisty załącznik obrazu (ścieżki są wstrzykiwane do promptu).OPENCLAW_LIVE_CLI_BACKEND_IMAGE_ARG="--image", aby przekazywać ścieżki plików obrazów jako argumenty CLI zamiast przez wstrzykiwanie do promptu.OPENCLAW_LIVE_CLI_BACKEND_IMAGE_MODE="repeat"(lub"list"), aby sterować sposobem przekazywania argumentów obrazów, gdy ustawionoIMAGE_ARG.OPENCLAW_LIVE_CLI_BACKEND_RESUME_PROBE=1, aby wysłać drugą turę i zweryfikować przepływ wznowienia.OPENCLAW_LIVE_CLI_BACKEND_MODEL_SWITCH_PROBE=0, aby wyłączyć domyślną sondę ciągłości tej samej sesji Claude Sonnet -> Opus (ustaw1, aby wymusić jej włączenie, gdy wybrany model obsługuje cel przełączenia).
Przykład:
OPENCLAW_LIVE_CLI_BACKEND=1 \
OPENCLAW_LIVE_CLI_BACKEND_MODEL="codex-cli/gpt-5.4" \
pnpm test:live src/gateway/gateway-cli-backend.live.test.ts
Recepta Docker:
pnpm test:docker:live-cli-backend
Recepty Docker dla pojedynczego dostawcy:
pnpm test:docker:live-cli-backend:claude
pnpm test:docker:live-cli-backend:claude-subscription
pnpm test:docker:live-cli-backend:codex
pnpm test:docker:live-cli-backend:gemini
Uwagi:
- Uruchamiacz Docker znajduje się w
scripts/test-live-cli-backend-docker.sh. - Uruchamia smoke live backendu CLI wewnątrz obrazu Docker repozytorium jako użytkownik nieuprzywilejowany
node. - Rozwiązuje metadane smoke CLI z odpowiedniego rozszerzenia, a następnie instaluje pasujący pakiet Linux CLI (
@anthropic-ai/claude-code,@openai/codexlub@google/gemini-cli) do cache’owanego zapisywalnego prefiksu wOPENCLAW_DOCKER_CLI_TOOLS_DIR(domyślnie:~/.cache/openclaw/docker-cli-tools). pnpm test:docker:live-cli-backend:claude-subscriptionwymaga przenośnego OAuth subskrypcji Claude Code przez~/.claude/.credentials.jsonzclaudeAiOauth.subscriptionTypelubCLAUDE_CODE_OAUTH_TOKENzclaude setup-token. Najpierw potwierdza bezpośrednieclaude -pw Docker, a następnie uruchamia dwie tury backendu CLI Gateway bez zachowywania zmiennych env z kluczem API Anthropic. Ta linia subskrypcyjna domyślnie wyłącza sondy Claude MCP/tool i obrazu, ponieważ Claude obecnie rozlicza użycie aplikacji zewnętrznych przez billing extra-usage zamiast zwykłych limitów planu subskrypcji.- Smoke live backendu CLI testuje teraz ten sam przepływ end-to-end dla Claude, Codex i Gemini: tura tekstowa, tura klasyfikacji obrazu, a następnie wywołanie narzędzia MCP
cronzweryfikowane przez CLI Gateway. - Domyślny smoke Claude dodatkowo patchuje sesję z Sonnet do Opus i sprawdza, czy wznowiona sesja nadal pamięta wcześniejszą notatkę.
Live: smoke powiązania ACP (/acp spawn ... --bind here)
- Test:
src/gateway/gateway-acp-bind.live.test.ts - Cel: zweryfikować rzeczywisty przepływ powiązania rozmowy ACP z aktywnym agentem ACP:
- wysłać
/acp spawn <agent> --bind here - powiązać syntetyczną rozmowę kanału wiadomości w miejscu
- wysłać zwykły follow-up w tej samej rozmowie
- zweryfikować, że follow-up trafia do transkryptu powiązanej sesji ACP
- wysłać
- Włączanie:
pnpm test:live src/gateway/gateway-acp-bind.live.test.tsOPENCLAW_LIVE_ACP_BIND=1
- Domyślne ustawienia:
- Agenci ACP w Docker:
claude,codex,gemini - Agent ACP dla bezpośredniego
pnpm test:live ...:claude - Syntetyczny kanał: kontekst rozmowy w stylu Slack DM
- Backend ACP:
acpx
- Agenci ACP w Docker:
- Nadpisania:
OPENCLAW_LIVE_ACP_BIND_AGENT=claudeOPENCLAW_LIVE_ACP_BIND_AGENT=codexOPENCLAW_LIVE_ACP_BIND_AGENT=geminiOPENCLAW_LIVE_ACP_BIND_AGENTS=claude,codex,geminiOPENCLAW_LIVE_ACP_BIND_AGENT_COMMAND='npx -y @agentclientprotocol/claude-agent-acp@<version>'
- Uwagi:
- Ta linia używa powierzchni
chat.sendGateway z polami synthetic originating-route dostępnymi tylko dla administratora, dzięki czemu testy mogą dołączać kontekst kanału wiadomości bez udawania zewnętrznego dostarczenia. - Gdy
OPENCLAW_LIVE_ACP_BIND_AGENT_COMMANDnie jest ustawione, test używa wbudowanego rejestru agentów Pluginacpxdla wybranego agenta harnessu ACP.
- Ta linia używa powierzchni
Przykład:
OPENCLAW_LIVE_ACP_BIND=1 \
OPENCLAW_LIVE_ACP_BIND_AGENT=claude \
pnpm test:live src/gateway/gateway-acp-bind.live.test.ts
Recepta Docker:
pnpm test:docker:live-acp-bind
Recepty Docker dla pojedynczego agenta:
pnpm test:docker:live-acp-bind:claude
pnpm test:docker:live-acp-bind:codex
pnpm test:docker:live-acp-bind:gemini
Uwagi dotyczące Docker:
- Uruchamiacz Docker znajduje się w
scripts/test-live-acp-bind-docker.sh. - Domyślnie uruchamia smoke powiązania ACP kolejno dla wszystkich obsługiwanych aktywnych agentów CLI:
claude,codex, a następniegemini. - Użyj
OPENCLAW_LIVE_ACP_BIND_AGENTS=claude,OPENCLAW_LIVE_ACP_BIND_AGENTS=codexlubOPENCLAW_LIVE_ACP_BIND_AGENTS=gemini, aby zawęzić macierz. - Pobiera
~/.profile, przygotowuje pasujące materiały uwierzytelniające CLI w kontenerze, instalujeacpxdo zapisywalnego prefiksu npm, a następnie instaluje żądane aktywne CLI (@anthropic-ai/claude-code,@openai/codexlub@google/gemini-cli), jeśli go brakuje. - Wewnątrz Docker uruchamiacz ustawia
OPENCLAW_LIVE_ACP_BIND_ACPX_COMMAND=$HOME/.npm-global/bin/acpx, abyacpxzachował zmienne env dostawcy z pobranego profilu dostępne dla podrzędnego CLI harnessu.
Live: smoke harnessu app-server Codex
- Cel: zweryfikować należący do Plugin harness Codex przez normalną
metodę
agentGateway:- załadować bundlowany Plugin
codex - wybrać
OPENCLAW_AGENT_RUNTIME=codex - wysłać pierwszą turę agenta Gateway do
codex/gpt-5.4 - wysłać drugą turę do tej samej sesji OpenClaw i zweryfikować, że wątek app-server może zostać wznowiony
- uruchomić
/codex statusoraz/codex modelsprzez tę samą ścieżkę poleceń Gateway
- załadować bundlowany Plugin
- Test:
src/gateway/gateway-codex-harness.live.test.ts - Włączanie:
OPENCLAW_LIVE_CODEX_HARNESS=1 - Domyślny model:
codex/gpt-5.4 - Opcjonalna sonda obrazu:
OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=1 - Opcjonalna sonda MCP/tool:
OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=1 - Ten smoke ustawia
OPENCLAW_AGENT_HARNESS_FALLBACK=none, aby uszkodzony harness Codex nie mógł przejść przez cichy fallback do PI. - Uwierzytelnianie:
OPENAI_API_KEYz powłoki/profilu oraz opcjonalnie skopiowane~/.codex/auth.jsoni~/.codex/config.toml
Lokalna recepta:
source ~/.profile
OPENCLAW_LIVE_CODEX_HARNESS=1 \
OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=1 \
OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=1 \
OPENCLAW_LIVE_CODEX_HARNESS_MODEL=codex/gpt-5.4 \
pnpm test:live -- src/gateway/gateway-codex-harness.live.test.ts
Recepta Docker:
source ~/.profile
pnpm test:docker:live-codex-harness
Uwagi dotyczące Docker:
- Uruchamiacz Docker znajduje się w
scripts/test-live-codex-harness-docker.sh. - Pobiera zamontowane
~/.profile, przekazujeOPENAI_API_KEY, kopiuje pliki uwierzytelniające CLI Codex, gdy są dostępne, instaluje@openai/codexdo zapisywalnego zamontowanego prefiksu npm, przygotowuje drzewo źródłowe, a następnie uruchamia tylko test live harnessu Codex. - Docker domyślnie włącza sondy obrazu oraz MCP/tool. Ustaw
OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=0lubOPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0, gdy potrzebujesz węższego uruchomienia debugowego. - Docker eksportuje również
OPENCLAW_AGENT_HARNESS_FALLBACK=none, zgodnie z konfiguracją testu live, aby fallbackopenai-codex/*lub PI nie mógł ukryć regresji harnessu Codex.
Zalecane recepty live
Wąskie, jawne allowlisty są najszybsze i najmniej podatne na niestabilność:
-
Pojedynczy model, bezpośrednio (bez Gateway):
OPENCLAW_LIVE_MODELS="openai/gpt-5.4" pnpm test:live src/agents/models.profiles.live.test.ts
-
Pojedynczy model, smoke Gateway:
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
-
Wywoływanie narzędzi u kilku dostawców:
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4,anthropic/claude-opus-4-6,google/gemini-3-flash-preview,zai/glm-4.7,minimax/MiniMax-M2.7" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
-
Skupienie na Google (klucz API Gemini + Antigravity):
- Gemini (klucz API):
OPENCLAW_LIVE_GATEWAY_MODELS="google/gemini-3-flash-preview" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts - Antigravity (OAuth):
OPENCLAW_LIVE_GATEWAY_MODELS="google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-pro-high" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
- Gemini (klucz API):
Uwagi:
google/...używa Gemini API (klucz API).google-antigravity/...używa mostu OAuth Antigravity (endpoint agenta w stylu Cloud Code Assist).google-gemini-cli/...używa lokalnego Gemini CLI na twojej maszynie (osobne uwierzytelnianie + niuanse narzędzi).- Gemini API vs Gemini CLI:
- API: OpenClaw wywołuje hostowane Gemini API Google przez HTTP (uwierzytelnianie kluczem API / profilem); to właśnie większość użytkowników ma na myśli, mówiąc „Gemini”.
- CLI: OpenClaw wywołuje lokalny binarny plik
gemini; ma własne uwierzytelnianie i może zachowywać się inaczej (streaming/obsługa narzędzi/rozbieżność wersji).
Live: macierz modeli (co obejmujemy)
Nie ma stałej „listy modeli CI” (live jest opt-in), ale to są zalecane modele do regularnego pokrywania na maszynie deweloperskiej z kluczami.
Nowoczesny zestaw smoke (wywoływanie narzędzi + obraz)
To jest uruchomienie „typowych modeli”, które oczekujemy utrzymać w działaniu:
- OpenAI (bez Codex):
openai/gpt-5.4(opcjonalnie:openai/gpt-5.4-mini) - OpenAI Codex:
openai-codex/gpt-5.4 - Anthropic:
anthropic/claude-opus-4-6(lubanthropic/claude-sonnet-4-6) - Google (Gemini API):
google/gemini-3.1-pro-previeworazgoogle/gemini-3-flash-preview(unikaj starszych modeli Gemini 2.x) - Google (Antigravity):
google-antigravity/claude-opus-4-6-thinkingorazgoogle-antigravity/gemini-3-flash - Z.AI (GLM):
zai/glm-4.7 - MiniMax:
minimax/MiniMax-M2.7
Uruchom smoke Gateway z narzędziami + obrazem:
OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.4,openai-codex/gpt-5.4,anthropic/claude-opus-4-6,google/gemini-3.1-pro-preview,google/gemini-3-flash-preview,google-antigravity/claude-opus-4-6-thinking,google-antigravity/gemini-3-flash,zai/glm-4.7,minimax/MiniMax-M2.7" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts
Linia bazowa: wywoływanie narzędzi (Read + opcjonalnie Exec)
Wybierz co najmniej jeden model z każdej rodziny dostawców:
- OpenAI:
openai/gpt-5.4(lubopenai/gpt-5.4-mini) - Anthropic:
anthropic/claude-opus-4-6(lubanthropic/claude-sonnet-4-6) - Google:
google/gemini-3-flash-preview(lubgoogle/gemini-3.1-pro-preview) - Z.AI (GLM):
zai/glm-4.7 - MiniMax:
minimax/MiniMax-M2.7
Opcjonalne dodatkowe pokrycie (warto mieć):
- xAI:
xai/grok-4(lub najnowszy dostępny) - Mistral:
mistral/… (wybierz jeden model z włączoną obsługą „tools”, do którego masz dostęp) - Cerebras:
cerebras/… (jeśli masz dostęp) - LM Studio:
lmstudio/… (lokalnie; wywoływanie narzędzi zależy od trybu API)
Vision: wysyłanie obrazu (załącznik → wiadomość multimodalna)
Uwzględnij co najmniej jeden model z obsługą obrazu w OPENCLAW_LIVE_GATEWAY_MODELS (warianty Claude/Gemini/OpenAI z obsługą vision itd.), aby przetestować sondę obrazu.
Agregatory / alternatywne Gateway
Jeśli masz włączone klucze, obsługujemy też testowanie przez:
- OpenRouter:
openrouter/...(setki modeli; użyjopenclaw models scan, aby znaleźć kandydatów z obsługą narzędzi+obrazu) - OpenCode:
opencode/...dla Zen iopencode-go/...dla Go (uwierzytelnianie przezOPENCODE_API_KEY/OPENCODE_ZEN_API_KEY)
Więcej dostawców, których możesz uwzględnić w macierzy live (jeśli masz poświadczenia/konfigurację):
- Wbudowani:
openai,openai-codex,anthropic,google,google-vertex,google-antigravity,google-gemini-cli,zai,openrouter,opencode,opencode-go,xai,groq,cerebras,mistral,github-copilot - Przez
models.providers(własne endpointy):minimax(cloud/API), plus dowolny proxy zgodny z OpenAI/Anthropic (LM Studio, vLLM, LiteLLM itd.)
Wskazówka: nie próbuj wpisywać na stałe „wszystkich modeli” w dokumentacji. Autorytatywna lista to to, co discoverModels(...) zwraca na twojej maszynie + jakie klucze są dostępne.
Poświadczenia (nigdy nie commituj)
Testy live wykrywają poświadczenia w ten sam sposób, co CLI. Praktyczne konsekwencje:
-
Jeśli działa CLI, testy live powinny znaleźć te same klucze.
-
Jeśli test live mówi „brak poświadczeń”, debuguj to tak samo, jak debugowałbyś
openclaw models list/ wybór modelu. -
Profile uwierzytelniania per agent:
~/.openclaw/agents/<agentId>/agent/auth-profiles.json(to właśnie oznaczają „profile keys” w testach live) -
Konfiguracja:
~/.openclaw/openclaw.json(lubOPENCLAW_CONFIG_PATH) -
Starszy katalog stanu:
~/.openclaw/credentials/(kopiowany do przygotowanego katalogu domowego live, jeśli istnieje, ale nie jest głównym magazynem kluczy profili) -
Lokalne uruchomienia live domyślnie kopiują aktywną konfigurację, pliki
auth-profiles.jsonper agent, starszy katalogcredentials/oraz obsługiwane zewnętrzne katalogi uwierzytelniania CLI do tymczasowego katalogu domowego testu; przygotowane katalogi domowe live pomijająworkspace/isandboxes/, a nadpisania ścieżekagents.*.workspace/agentDirsą usuwane, aby sondy nie działały w twoim rzeczywistym obszarze roboczym hosta.
Jeśli chcesz polegać na kluczach env (np. wyeksportowanych w ~/.profile), uruchamiaj testy lokalne po source ~/.profile albo użyj poniższych uruchamiaczy Docker (mogą montować ~/.profile do kontenera).
Live: Deepgram (transkrypcja audio)
- Test:
src/media-understanding/providers/deepgram/audio.live.test.ts - Włączanie:
DEEPGRAM_API_KEY=... DEEPGRAM_LIVE_TEST=1 pnpm test:live src/media-understanding/providers/deepgram/audio.live.test.ts
Live: plan kodowania BytePlus
- Test:
src/agents/byteplus.live.test.ts - Włączanie:
BYTEPLUS_API_KEY=... BYTEPLUS_LIVE_TEST=1 pnpm test:live src/agents/byteplus.live.test.ts - Opcjonalne nadpisanie modelu:
BYTEPLUS_CODING_MODEL=ark-code-latest
Live: media workflow ComfyUI
- Test:
extensions/comfy/comfy.live.test.ts - Włączanie:
OPENCLAW_LIVE_TEST=1 COMFY_LIVE_TEST=1 pnpm test:live -- extensions/comfy/comfy.live.test.ts - Zakres:
- Testuje bundlowane ścieżki obrazu, wideo i
music_generatecomfy - Pomija każdą możliwość, jeśli
models.providers.comfy.<capability>nie jest skonfigurowane - Przydatne po zmianach w wysyłaniu workflow comfy, odpytywaniu, pobieraniu lub rejestracji Plugin
- Testuje bundlowane ścieżki obrazu, wideo i
Live: generowanie obrazów
- Test:
src/image-generation/runtime.live.test.ts - Polecenie:
pnpm test:live src/image-generation/runtime.live.test.ts - Harness:
pnpm test:live:media image - Zakres:
- Wylicza każdy zarejestrowany Plugin dostawcy generowania obrazów
- Ładuje brakujące zmienne env dostawców z twojej powłoki logowania (
~/.profile) przed sondowaniem - Domyślnie używa aktywnych/env kluczy API przed zapisanymi profilami uwierzytelniania, aby nieaktualne klucze testowe w
auth-profiles.jsonnie maskowały rzeczywistych poświadczeń powłoki - Pomija dostawców bez użytecznego uwierzytelniania/profilu/modelu
- Uruchamia standardowe warianty generowania obrazów przez współdzieloną możliwość runtime:
google:flash-generategoogle:pro-generategoogle:pro-editopenai:default-generate
- Obecnie objęci bundlowani dostawcy:
openaigoogle
- Opcjonalne zawężanie:
OPENCLAW_LIVE_IMAGE_GENERATION_PROVIDERS="openai,google"OPENCLAW_LIVE_IMAGE_GENERATION_MODELS="openai/gpt-image-1,google/gemini-3.1-flash-image-preview"OPENCLAW_LIVE_IMAGE_GENERATION_CASES="google:flash-generate,google:pro-edit"
- Opcjonalne zachowanie uwierzytelniania:
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1, aby wymusić uwierzytelnianie z magazynu profili i ignorować nadpisania tylko z env
Live: generowanie muzyki
- Test:
extensions/music-generation-providers.live.test.ts - Włączanie:
OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/music-generation-providers.live.test.ts - Harness:
pnpm test:live:media music - Zakres:
- Testuje współdzieloną bundlowaną ścieżkę dostawcy generowania muzyki
- Obecnie obejmuje Google i MiniMax
- Ładuje zmienne env dostawców z twojej powłoki logowania (
~/.profile) przed sondowaniem - Domyślnie używa aktywnych/env kluczy API przed zapisanymi profilami uwierzytelniania, aby nieaktualne klucze testowe w
auth-profiles.jsonnie maskowały rzeczywistych poświadczeń powłoki - Pomija dostawców bez użytecznego uwierzytelniania/profilu/modelu
- Uruchamia oba zadeklarowane tryby runtime, gdy są dostępne:
generatez wejściem opartym wyłącznie na prompcieedit, gdy dostawca deklarujecapabilities.edit.enabled
- Obecne pokrycie współdzielonej linii:
google:generate,editminimax:generatecomfy: osobny plik live Comfy, nie ten współdzielony przegląd
- Opcjonalne zawężanie:
OPENCLAW_LIVE_MUSIC_GENERATION_PROVIDERS="google,minimax"OPENCLAW_LIVE_MUSIC_GENERATION_MODELS="google/lyria-3-clip-preview,minimax/music-2.5+"
- Opcjonalne zachowanie uwierzytelniania:
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1, aby wymusić uwierzytelnianie z magazynu profili i ignorować nadpisania tylko z env
Live: generowanie wideo
- Test:
extensions/video-generation-providers.live.test.ts - Włączanie:
OPENCLAW_LIVE_TEST=1 pnpm test:live -- extensions/video-generation-providers.live.test.ts - Harness:
pnpm test:live:media video - Zakres:
- Testuje współdzieloną bundlowaną ścieżkę dostawcy generowania wideo
- Ładuje zmienne env dostawców z twojej powłoki logowania (
~/.profile) przed sondowaniem - Domyślnie używa aktywnych/env kluczy API przed zapisanymi profilami uwierzytelniania, aby nieaktualne klucze testowe w
auth-profiles.jsonnie maskowały rzeczywistych poświadczeń powłoki - Pomija dostawców bez użytecznego uwierzytelniania/profilu/modelu
- Uruchamia oba zadeklarowane tryby runtime, gdy są dostępne:
generatez wejściem opartym wyłącznie na prompcieimageToVideo, gdy dostawca deklarujecapabilities.imageToVideo.enabledi wybrany dostawca/model akceptuje wejście lokalnego obrazu oparte na buforze we współdzielonym przeglądzievideoToVideo, gdy dostawca deklarujecapabilities.videoToVideo.enabledi wybrany dostawca/model akceptuje wejście lokalnego wideo oparte na buforze we współdzielonym przeglądzie
- Obecni zadeklarowani, ale pomijani dostawcy
imageToVideowe współdzielonym przeglądzie:vydra, ponieważ bundlowanyveo3jest tylko tekstowy, a bundlowanyklingwymaga zdalnego adresu URL obrazu
- Pokrycie Vydra specyficzne dla dostawcy:
OPENCLAW_LIVE_TEST=1 OPENCLAW_LIVE_VYDRA_VIDEO=1 pnpm test:live -- extensions/vydra/vydra.live.test.ts- ten plik uruchamia
veo3text-to-video oraz liniękling, która domyślnie używa fixture zdalnego adresu URL obrazu
- Obecne pokrycie live
videoToVideo:- tylko
runway, gdy wybrany model torunway/gen4_aleph
- tylko
- Obecni zadeklarowani, ale pomijani dostawcy
videoToVideowe współdzielonym przeglądzie:alibaba,qwen,xai, ponieważ te ścieżki obecnie wymagają zdalnych referencyjnych adresów URLhttp(s)/ MP4google, ponieważ obecna współdzielona linia Gemini/Veo używa lokalnego wejścia opartego na buforze i ta ścieżka nie jest akceptowana we współdzielonym przeglądzieopenai, ponieważ obecna współdzielona linia nie gwarantuje organizacyjnego dostępu do video inpaint/remix
- Opcjonalne zawężanie:
OPENCLAW_LIVE_VIDEO_GENERATION_PROVIDERS="google,openai,runway"OPENCLAW_LIVE_VIDEO_GENERATION_MODELS="google/veo-3.1-fast-generate-preview,openai/sora-2,runway/gen4_aleph"
- Opcjonalne zachowanie uwierzytelniania:
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1, aby wymusić uwierzytelnianie z magazynu profili i ignorować nadpisania tylko z env
Harness live dla mediów
- Polecenie:
pnpm test:live:media - Cel:
- Uruchamia współdzielone pakiety live dla obrazów, muzyki i wideo przez jedno natywne wejście repozytorium
- Automatycznie ładuje brakujące zmienne env dostawców z
~/.profile - Domyślnie automatycznie zawęża każdy pakiet do dostawców, którzy aktualnie mają użyteczne uwierzytelnianie
- Ponownie używa
scripts/test-live.mjs, więc zachowanie Heartbeat i trybu cichego pozostaje spójne
- Przykłady:
pnpm test:live:mediapnpm test:live:media image video --providers openai,google,minimaxpnpm test:live:media video --video-providers openai,runway --all-providerspnpm test:live:media music --quiet
Uruchamiacze Docker (opcjonalne testy „działa w Linux”)
Te uruchamiacze Docker dzielą się na dwie kategorie:
- Uruchamiacze live-model:
test:docker:live-modelsitest:docker:live-gatewayuruchamiają tylko odpowiadający im plik live z kluczami profili wewnątrz obrazu Docker repozytorium (src/agents/models.profiles.live.test.tsisrc/gateway/gateway-models.profiles.live.test.ts), montując lokalny katalog konfiguracji i obszar roboczy (oraz pobierając~/.profile, jeśli jest zamontowany). Odpowiadające im lokalne punkty wejścia totest:live:models-profilesitest:live:gateway-profiles. - Uruchamiacze Docker live domyślnie używają mniejszego limitu smoke, aby pełny przegląd Docker pozostawał praktyczny:
test:docker:live-modelsdomyślnie ustawiaOPENCLAW_LIVE_MAX_MODELS=12, atest:docker:live-gatewaydomyślnie ustawiaOPENCLAW_LIVE_GATEWAY_SMOKE=1,OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8,OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000orazOPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000. Nadpisz te zmienne env, gdy celowo chcesz większego, wyczerpującego przeglądu. test:docker:allbuduje obraz Docker live raz przeztest:docker:live-build, a następnie ponownie używa go dla dwóch linii Docker live.- Uruchamiacze smoke kontenerów:
test:docker:openwebui,test:docker:onboard,test:docker:gateway-network,test:docker:mcp-channelsoraztest:docker:pluginsuruchamiają jeden lub więcej rzeczywistych kontenerów i weryfikują ścieżki integracji wyższego poziomu.
Uruchamiacze Docker live-model montują też tylko potrzebne katalogi domowe uwierzytelniania CLI (albo wszystkie obsługiwane, gdy uruchomienie nie jest zawężone), a następnie kopiują je do katalogu domowego kontenera przed uruchomieniem, aby zewnętrzny OAuth CLI mógł odświeżać tokeny bez modyfikowania magazynu uwierzytelniania hosta:
- Bezpośrednie modele:
pnpm test:docker:live-models(skrypt:scripts/test-live-models-docker.sh) - Smoke powiązania ACP:
pnpm test:docker:live-acp-bind(skrypt:scripts/test-live-acp-bind-docker.sh) - Smoke backendu CLI:
pnpm test:docker:live-cli-backend(skrypt:scripts/test-live-cli-backend-docker.sh) - Smoke harnessu app-server Codex:
pnpm test:docker:live-codex-harness(skrypt:scripts/test-live-codex-harness-docker.sh) - Gateway + agent developerski:
pnpm test:docker:live-gateway(skrypt:scripts/test-live-gateway-models-docker.sh) - Smoke live Open WebUI:
pnpm test:docker:openwebui(skrypt:scripts/e2e/openwebui-docker.sh) - Kreator onboardingu (TTY, pełne scaffoldowanie):
pnpm test:docker:onboard(skrypt:scripts/e2e/onboard-docker.sh) - Sieć Gateway (dwa kontenery, uwierzytelnianie WS + health):
pnpm test:docker:gateway-network(skrypt:scripts/e2e/gateway-network-docker.sh) - Most kanałów MCP (seedowany Gateway + most stdio + smoke surowej ramki powiadomień Claude):
pnpm test:docker:mcp-channels(skrypt:scripts/e2e/mcp-channels-docker.sh) - Pluginy (smoke instalacji + alias
/plugin+ semantyka restartu bundla Claude):pnpm test:docker:plugins(skrypt:scripts/e2e/plugins-docker.sh)
Uruchamiacze Docker live-model montują też bieżący checkout tylko do odczytu i
przygotowują go w tymczasowym katalogu roboczym wewnątrz kontenera. Dzięki temu obraz runtime
pozostaje lekki, a jednocześnie Vitest działa na dokładnie twojej lokalnej konfiguracji/źródłach.
Krok przygotowania pomija duże lokalne cache oraz wyniki buildów aplikacji, takie jak
.pnpm-store, .worktrees, __openclaw_vitest__ oraz lokalne dla aplikacji katalogi .build lub
wyjścia Gradle, dzięki czemu uruchomienia Docker live nie tracą minut na kopiowanie
artefaktów specyficznych dla maszyny.
Ustawiają też OPENCLAW_SKIP_CHANNELS=1, aby aktywne sondy Gateway nie uruchamiały
rzeczywistych workerów kanałów Telegram/Discord/itd. wewnątrz kontenera.
test:docker:live-models nadal uruchamia pnpm test:live, więc przekazuj także
OPENCLAW_LIVE_GATEWAY_*, gdy chcesz zawęzić lub wykluczyć pokrycie Gateway
live z tej linii Docker.
test:docker:openwebui jest smoke zgodności wyższego poziomu: uruchamia
kontener Gateway OpenClaw z włączonymi endpointami HTTP zgodnymi z OpenAI,
uruchamia przypięty kontener Open WebUI przeciwko temu Gateway, loguje się przez
Open WebUI, weryfikuje, że /api/models udostępnia openclaw/default, a następnie wysyła
rzeczywiste żądanie czatu przez proxy /api/chat/completions Open WebUI.
Pierwsze uruchomienie może być zauważalnie wolniejsze, ponieważ Docker może potrzebować pobrać
obraz Open WebUI, a samo Open WebUI może potrzebować dokończyć własną konfigurację cold-start.
Ta linia oczekuje użytecznego klucza modelu live, a OPENCLAW_PROFILE_FILE
(domyślnie ~/.profile) jest podstawowym sposobem jego dostarczenia w uruchomieniach konteneryzowanych.
Udane uruchomienia wypisują mały payload JSON, taki jak { "ok": true, "model": "openclaw/default", ... }.
test:docker:mcp-channels jest celowo deterministyczny i nie wymaga
rzeczywistego konta Telegram, Discord ani iMessage. Uruchamia seedowany kontener
Gateway, startuje drugi kontener uruchamiający openclaw mcp serve, a następnie
weryfikuje wykrywanie routowanych rozmów, odczyty transkryptów, metadane załączników,
zachowanie kolejki zdarzeń live, routing wysyłania wychodzącego oraz powiadomienia
w stylu Claude dla kanałów + uprawnień przez rzeczywisty most stdio MCP. Kontrola powiadomień
sprawdza bezpośrednio surowe ramki stdio MCP, dzięki czemu smoke weryfikuje to, co
most rzeczywiście emituje, a nie tylko to, co akurat ujawnia określony klient SDK.
Ręczny smoke wątku ACP w plain language (nie w CI):
bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...- Zachowaj ten skrypt do przepływów pracy regresji/debugowania. Może być znów potrzebny do walidacji routingu wątków ACP, więc go nie usuwaj.
Przydatne zmienne env:
OPENCLAW_CONFIG_DIR=...(domyślnie:~/.openclaw) montowane do/home/node/.openclawOPENCLAW_WORKSPACE_DIR=...(domyślnie:~/.openclaw/workspace) montowane do/home/node/.openclaw/workspaceOPENCLAW_PROFILE_FILE=...(domyślnie:~/.profile) montowane do/home/node/.profilei pobierane przed uruchomieniem testówOPENCLAW_DOCKER_CLI_TOOLS_DIR=...(domyślnie:~/.cache/openclaw/docker-cli-tools) montowane do/home/node/.npm-globaldla cache’owanych instalacji CLI wewnątrz Docker- Zewnętrzne katalogi/pliki uwierzytelniania CLI pod
$HOMEsą montowane tylko do odczytu pod/host-auth..., a następnie kopiowane do/home/node/...przed rozpoczęciem testów- Domyślne katalogi:
.minimax - Domyślne pliki:
~/.codex/auth.json,~/.codex/config.toml,.claude.json,~/.claude/.credentials.json,~/.claude/settings.json,~/.claude/settings.local.json - Zawężone uruchomienia dostawców montują tylko potrzebne katalogi/pliki wywnioskowane z
OPENCLAW_LIVE_PROVIDERS/OPENCLAW_LIVE_GATEWAY_PROVIDERS - Ręczne nadpisanie:
OPENCLAW_DOCKER_AUTH_DIRS=all,OPENCLAW_DOCKER_AUTH_DIRS=nonelub lista rozdzielana przecinkami, np.OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex
- Domyślne katalogi:
OPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=..., aby zawęzić uruchomienieOPENCLAW_LIVE_GATEWAY_PROVIDERS=.../OPENCLAW_LIVE_PROVIDERS=..., aby filtrować dostawców wewnątrz konteneraOPENCLAW_SKIP_DOCKER_BUILD=1, aby ponownie użyć istniejącego obrazuopenclaw:local-liveprzy ponownych uruchomieniach, które nie wymagają przebudowyOPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1, aby upewnić się, że poświadczenia pochodzą z magazynu profili (a nie z env)OPENCLAW_OPENWEBUI_MODEL=..., aby wybrać model udostępniany przez Gateway dla smoke Open WebUIOPENCLAW_OPENWEBUI_PROMPT=..., aby nadpisać prompt sprawdzania nonce używany przez smoke Open WebUIOPENWEBUI_IMAGE=..., aby nadpisać przypięty tag obrazu Open WebUI
Kontrola poprawności dokumentacji
Po edycjach dokumentacji uruchom sprawdzenia dokumentacji: pnpm check:docs.
Uruchom pełną walidację anchorów Mintlify, gdy potrzebujesz także sprawdzania nagłówków w obrębie strony: pnpm docs:check-links:anchors.
Regresje offline (bezpieczne dla CI)
To regresje „rzeczywistego pipeline” bez rzeczywistych dostawców:
- Wywoływanie narzędzi Gateway (mock OpenAI, rzeczywisty Gateway + pętla agenta):
src/gateway/gateway.test.ts(przypadek: "runs a mock OpenAI tool call end-to-end via gateway agent loop") - Kreator Gateway (WS
wizard.start/wizard.next, wymuszone zapisywanie konfiguracji + auth):src/gateway/gateway.test.ts(przypadek: "runs wizard over ws and writes auth token config")
Ewaluacje niezawodności agenta (Skills)
Mamy już kilka testów bezpiecznych dla CI, które zachowują się jak „ewaluacje niezawodności agenta”:
- Mock wywoływania narzędzi przez rzeczywistą pętlę Gateway + agenta (
src/gateway/gateway.test.ts). - Przepływy kreatora end-to-end, które walidują okablowanie sesji i efekty konfiguracji (
src/gateway/gateway.test.ts).
Czego nadal brakuje dla Skills (zobacz Skills):
- Decisioning: gdy Skills są wymienione w prompcie, czy agent wybiera właściwy Skill (albo unika nieistotnych)?
- Compliance: czy agent odczytuje
SKILL.mdprzed użyciem i wykonuje wymagane kroki/argumenty? - Workflow contracts: scenariusze wieloturowe, które sprawdzają kolejność narzędzi, przenoszenie historii sesji i granice sandboxa.
Przyszłe ewaluacje powinny najpierw pozostać deterministyczne:
- Uruchamiacz scenariuszy używający mock dostawców do sprawdzania wywołań narzędzi + kolejności, odczytów plików Skill i okablowania sesji.
- Niewielki pakiet scenariuszy skupionych na Skills (użycie vs unikanie, bramkowanie, prompt injection).
- Opcjonalne ewaluacje live (opt-in, bramkowane env) dopiero po wdrożeniu pakietu bezpiecznego dla CI.
Testy kontraktowe (kształt Plugin i kanałów)
Testy kontraktowe weryfikują, że każdy zarejestrowany Plugin i kanał jest zgodny ze swoim
kontraktem interfejsu. Iterują po wszystkich wykrytych Plugin i uruchamiają pakiet
asercji kształtu i zachowania. Domyślna linia unit pnpm test celowo
pomija te współdzielone pliki seam i smoke; uruchamiaj polecenia kontraktowe jawnie,
gdy modyfikujesz współdzielone powierzchnie kanałów lub dostawców.
Polecenia
- Wszystkie kontrakty:
pnpm test:contracts - Tylko kontrakty kanałów:
pnpm test:contracts:channels - Tylko kontrakty dostawców:
pnpm test:contracts:plugins
Kontrakty kanałów
Znajdują się w src/channels/plugins/contracts/*.contract.test.ts:
- plugin - Podstawowy kształt Plugin (id, nazwa, capabilities)
- setup - Kontrakt kreatora konfiguracji
- session-binding - Zachowanie wiązania sesji
- outbound-payload - Struktura payload wiadomości
- inbound - Obsługa wiadomości przychodzących
- actions - Handlery akcji kanału
- threading - Obsługa identyfikatorów wątków
- directory - API katalogu/listy
- group-policy - Egzekwowanie zasad grup
Kontrakty statusu dostawców
Znajdują się w src/plugins/contracts/*.contract.test.ts.
- status - Sondy statusu kanałów
- registry - Kształt rejestru Plugin
Kontrakty dostawców
Znajdują się w src/plugins/contracts/*.contract.test.ts:
- auth - Kontrakt przepływu uwierzytelniania
- auth-choice - Wybór/selekcja uwierzytelniania
- catalog - API katalogu modeli
- discovery - Wykrywanie Plugin
- loader - Ładowanie Plugin
- runtime - Runtime dostawcy
- shape - Kształt/interfejs Plugin
- wizard - Kreator konfiguracji
Kiedy uruchamiać
- Po zmianie eksportów lub subścieżek plugin-sdk
- Po dodaniu lub modyfikacji kanału albo Plugin dostawcy
- Po refaktoryzacji rejestracji lub wykrywania Plugin
Testy kontraktowe uruchamiają się w CI i nie wymagają prawdziwych kluczy API.
Dodawanie regresji (wskazówki)
Gdy naprawiasz problem dostawcy/modelu wykryty w live:
- Jeśli to możliwe, dodaj regresję bezpieczną dla CI (mock/stub dostawcy albo przechwycenie dokładnej transformacji kształtu żądania)
- Jeśli z natury jest to problem tylko live (limity szybkości, polityki uwierzytelniania), utrzymaj test live wąski i opt-in przez zmienne env
- Preferuj celowanie w najmniejszą warstwę, która wychwytuje błąd:
- błąd konwersji/replay żądania dostawcy → test bezpośrednich modeli
- błąd pipeline sesji/historii/narzędzi Gateway → smoke Gateway live albo bezpieczny dla CI mock test Gateway
- Zabezpieczenie przechodzenia SecretRef:
src/secrets/exec-secret-ref-id-parity.test.tswyprowadza jeden przykładowy cel na klasę SecretRef z metadanych rejestru (listSecretTargetRegistryEntries()), a następnie sprawdza, że identyfikatory exec segmentów przechodzenia są odrzucane.- Jeśli dodajesz nową rodzinę celów SecretRef
includeInPlanwsrc/secrets/target-registry-data.ts, zaktualizujclassifyTargetClassw tym teście. Test celowo kończy się błędem przy niesklasyfikowanych identyfikatorach celów, aby nowe klasy nie mogły zostać pominięte po cichu.