Work: odizolowane obszary robocze
Work to natywny interfejs agentów programistycznych Libre WebUI. Każde zadanie łączy trwałą rozmowę, jawną trasę model-dostawca i osobny system plików w /workspace. Model może przeglądać i edytować pliki, uruchamiać polecenia w kontenerze Docker lub Podzie Kubernetes przypisanym do zadania i uruchamiać podgląd w przeglądarce.
Work jest zaimplementowany bezpośrednio w Libre WebUI. Nie wymaga Libre Claw ani innego demona agentów.
Każde API Work wymaga uwierzytelnionego konta z dostępem. Domyślnie są to administratorzy; administrator może otworzyć Work wszystkim aktywnym użytkownikom na karcie Zarządzanie użytkownikami w Settings (foldery hosta zawsze pozostają tylko dla administratorów, ponieważ wykonują bind mount ścieżek serwera). Work celowo pozwala modelowi wykonywać dowolne polecenia powłoki w piaskownicy. Zadania mają ruch wychodzący, chyba że wybrana nazwana polityka środowiska go wyłącza. Traktuj każdą uprawnioną osobę jako zaufanego operatora środowiska, nie tylko użytkownika czatu.
Najważniejsze funkcje wydania
To wydanie wprowadza pełny przepływ zadań Work:
- Osobne działania Work i Chat na głównym pasku, z widocznym wyborem trybu.
- Zadania na zwykłym pasku zamiast drugiej listy. Pozycje są stabilne podczas uruchomień, a wybrane zadanie można usunąć bezpośrednio.
- Osobna tożsamość piaskownicy i trwały wolumin Docker lub PVC Kubernetes na zadanie. Piaskownicę można zatrzymać lub odtworzyć bez usuwania plików.
- Trwała rozmowa, stan uruchomienia, aktywność narzędzi, model i własność w bazie Libre WebUI.
- Bieżący uwierzytelniony strumień tekstu asystenta, ujawnionego rozumowania, narzędzi i wyników, użycia, umiejętności workerów i zmian stanu.
- Umiejętności workerów należące do serwera, które uczą model przeglądania, edycji, weryfikacji i podglądu bez plików sterujących w projekcie.
- Lokalne modele Ollama z narzędziami, Ollama Cloud i skonfigurowane wtyczki uzupełniania/czatu.
- Responsywny podział Rozmowa/Obszar roboczy, przeciągany i dostępny klawiaturą na desktopie oraz przełączany na małych ekranach.
- Zintegrowane Pliki, Aktywność, Git, Terminal, Podgląd i Ekran — Ekran to obserwowalny i uczony pulpit Work Computer.
- Kolorowanie składni w jasnym/ciemnym trybie, formatowanie w przeglądarce, konflikty zapisu i tymczasowe szkice.
- Zamykane ujawnienie per użytkownik przy zdalnym dostawcy.
- Pełne tłumaczenia na 25 języków, w tym natywny arabski RTL, podczas gdy kod, ścieżki, ID modeli i wyjście pozostają LTR.
Trwałą jednostką jest obszar zadania, nie stale działający kontener. Libre WebUI uruchamia, zatrzymuje i może odtworzyć kontener, zachowując nazwany wolumin.
Architektura
Libre WebUI, nie model ani przeglądarka, wybiera nazwy, image, montowanie, użytkownika, limity, sieć i port. Model dostaje tylko:
list_filesread_filewrite_filedelete_filemove_filesearch_filesrun_commandstart_previewstop_preview
delete_file i move_file są chronione jak inne narzędzia plików: nie opuszczają obszaru, nie przechodzą symlinków, wymagają jawnej rekurencji dla katalogu i nie nadpisują celu. Ponieważ używają pomocnika, działają też podczas podglądu, gdy run_command jest zablokowane.
Żądania modeli wysyła zaplecze Libre WebUI. Nie pochodzą z kontenera ani nie zależą od jego sieci.
Wymagania
Work wymaga skonfigurowanego zaplecza piaskownicy:
- Docker: zainstalowany osiągalny daemon i prawo procesu do
dockeralbo pliku zWORK_DOCKER_COMMAND. - Kubernetes: poświadczenia API oraz ograniczone do namespace Role, RoleBinding, namespace piaskownicy i NetworkPolicies tworzone przez Helm przy
work.enabled=true.
Każde zaplecze potrzebuje też:
- Modelu z narzędziami przez:
- zdrowe Ollama, w tym Ollama Cloud; lub
- aktywną wtyczkę uzupełniania/czatu z dokładnym modelem i poświadczeniami administratora.
- Pamięci dla image, projektów i lokalnych zależności.
- Uwierzytelnionego konta z dostępem. Domyślnie tylko administratorzy; można otworzyć wszystkim aktywnym.
Libre WebUI sprawdza deklarowane możliwości Ollama i odrzuca model bez tools. Wtyczki muszą obsługiwać protokół wywołań dostawcy. Odrzucenie narzędzi kończy uruchomienie; Work nie przełącza cicho modelu ani dostawcy.
Uruchomienie lokalne
Najprościej uruchom Libre WebUI i Docker na tym samym komputerze co przeglądarka:
docker info
npx libre-webui@latest
Otwórz http://localhost:8080, zaloguj się jako administrator, wybierz Work, zgodny model i opisz projekt.
Przy braku lub niedostępności Docker Work pokazuje Środowisko niedostępne z przyczyną i wyłącza kompozytor. Nigdy nie wykonuje poleceń bezpośrednio na hoście.
Image jest sprawdzana przy pierwszym użyciu i pobierana, gdy brak, więc pierwsza operacja trwa dłużej.
Interfejs Work
Tworzenie i ponowne otwieranie zadań
Wybierz Work obok Chat, wpisz instrukcję, model i Uruchom. Pierwsza wiadomość tworzy zadanie, uruchomienie, trasę i trwały obszar.
Zadanie pozostaje na głównym pasku. Otwarcie przywraca rozmowę, Pliki, dostawcę/model i obszar. Starsze wiadomości są stronicowane. Możesz zmienić tytuł i trwale usunąć z menu lub paska.
Tylko jedno uruchomienie per zadanie. Kolejna instrukcja działa na tej samej rozmowie i plikach.
Kompozytor obsługuje dyktowanie: mikrofon używa API przeglądarki albo skonfigurowanego modelu mowa-na-tekst i dopisuje transkrypt do istniejącego tekstu. Pliki utworzone lub przeniesione pojawiają się jako klikalne etykiety pod aktywnością narzędzia; klik otwiera edytor Pliki i na wąskim ekranie przełącza obszar. Etykiety pochodzą tylko z narzędzi zmieniających, więc odczyt dwudziestu i zapis jednego pokazuje jeden artefakt.
Wynajmowanie agenta
Widok startowy oferuje Wynajmij jako agenta, gdy masz persony. Wybór tworzy trwałego nazwanego agenta zamiast zadania jednorazowego. Agent zachowuje personę między uruchomieniami — nazwa i prompt poprzedzają prompt Work, ale kontrakt piaskownicy zawsze ma pierwszeństwo. Pasek przypina agentów w grupie Agenci nad zadaniami, z awatarem, aktywnością i statusem. Po zwężeniu paska w szynie zostają tylko te przypięte awatary agentów; jednorazowe zadania Work wracają po rozwinięciu paska.
Status ma dwa poziomy. Dla agentów tanie wywołanie modelu bez narzędzi po uruchomieniu prosi o około 8 słów („Skrzynka pusta. 2 odpowiedzi gotowe.”); wynik to jedna linia 90 znaków, a błąd/time-out używa deterministycznej pierwszej linii końcowej odpowiedzi. Zadania jednorazowe i błędy używają tylko deterministycznej; WORK_STATUS_BLURB_MODEL=0 wyłącza model. Agent ma też wskaźnik nieprzeczytanego: otwarcie przesuwa monotoniczny znacznik widzenia synchronizowany między urządzeniami, a kropka oznacza późniejszy stan końcowy.
Agenci używają powiadomień: work-run-finished po sukcesie, work-run-attention przy danych lub błędzie, work-takeover przy prośbie o ekran. Banner widać tylko na karcie Ekran, więc push dociera gdzie indziej. Każde powiadomienie linkuje agenta.
Możesz użyć własnej lub udostępnionej persony; widok nie ujawnia pamięci właściciela. Po usunięciu persony agent działa bez niej i loguje ostrzeżenie. API przyjmuje personaId i isAgent; zadanie z personą jest agentem.
Karta Agent
Panel agenta otwiera dodatkową pierwszą kartę Agent:
- Tożsamość: awatar, nazwa, aktywność, status.
- Ekran: przy Work Computer kompaktowa bieżąca miniatura tylko do oglądania. Jest prawdziwym widzem liczonym do limitu; klik otwiera pełny Ekran z przejęciem, nauczaniem i audio.
- Rutyny: automatyzacje związane z zadaniem. Każde wystąpienie działa w tej samej przestrzeni i rozmowie z modelem/runtime agenta, nie jako nowe zadanie, więc poranny briefing gromadzi się razem. Wiersze opisują harmonogram i pauzę/wznowienie; formularz + Rutyna jest już związany. Wystąpienie przy zajętym agencie uczciwie kończy się
work-task-busy, nie kolejkuje. - Automatyczna kontrola: przełącznik zatwierdzeń dla agenta i zebrane reguły Zawsze zezwalaj (usunięcie reguły znów zamyka jej zakres). Gdy polityka zadania wymusza kontrolę, przełącznik jest zablokowany w pozycji włączonej.
- Nauczone umiejętności: procedury z trybu nauczania, z przełącznikiem.
Podłączone narzędzia (serwery MCP i OpenAPI)
Agenci Work wywołują te same serwery narzędzi co czat — MCP lub OpenAPI, rejestrowane przez administratora w Ustawienia → Narzędzia. Narzędzia są widoczne dla agenta pod nazwami z przestrzenią (server__tool), a wywołania biegną z zaplecza Libre WebUI przez utwardzoną bramę narzędzi (ruch wychodzący chroniony przed SSRF, poświadczenia per użytkownik, limity rozmiaru i czasu), nigdy z wnętrza piaskownicy.
Oferta uczciwie pokazuje, z czego autonomiczne uruchomienie naprawdę skorzysta:
- Zadanie offline nie dostaje żadnych: niezależnie od ruchu z zaplecza zadanie bez sieci pozostaje offline — tak samo jak przy
web_search. - Serwer wymagający osobistego poświadczenia, którego użytkownik nie zapisał, jest odfiltrowany przy ofercie, bo autonomiczne uruchomienie nie może się zatrzymać i o nie poprosić. Dodaj poświadczenie w Ustawienia → Narzędzia, a kolejne uruchomienie zaproponuje serwer.
- Tryb dostępu do narzędzi (tylko administratorzy lub wszyscy) i widoczność per serwer działają jak w czacie, a powiązania serwerów w personie zawężają listę widzianą przez wynajętego agenta.
- Przy aktywnych zatwierdzeniach podłączone narzędzia oznaczone przez serwer jako ze skutkami ubocznymi czekają na decyzję jak każde bramkowane działanie; narzędzia tylko do odczytu działają bez pytania.
Delegowanie między agentami (wzmianki @)
Wynajęci agenci mogą przekazywać sobie pracę. Wpisz @ w polu Work, aby wspomnieć innego swojego agenta; bieżący agent widzi listę współpracowników (nazwy i statusy) w instrukcjach i deleguje pasujące prośby narzędziem message_agent. Delegowanie to koordynacja wiadomościami, celowo nie wspólnymi komputerami: każdy agent ma własny izolowany obszar i piaskownicę, a odbiorca nie widzi rozmowy delegującej — prośba musi nieść własny kontekst.
Delegowanie jest asynchroniczne. Narzędzie wraca od razu, agent docelowy działa we własnym zadaniu (jego rozmowa pokazuje prośbę z etykietą Delegowane przez nadawcę), a po zakończeniu — ukończone, wymaga danych, błąd lub anulowane — jego końcowa odpowiedź trafia do rozmowy agenta delegującego jako wiadomość z etykietą Raport od tego agenta. Jeśli delegujący nadal działa, raport dociera do modelu w kolejnej rundzie; jeśli jest bezczynny, raport po prostu czeka w rozmowie — raport nigdy nie uruchamia przebiegu sam, więc dwaj agenci nie odbiją się w nieskończoność. Delegowane uruchomienia nie delegują dalej, zajęty odbiorca uczciwie kończy próbę zamiast kolejkować, a przy aktywnych zatwierdzeniach message_agent czeka na kontrolę jak każde działanie ze skutkami ubocznymi (reguła Zawsze zezwalaj obejmuje tylko tego jednego agenta docelowego).
Zatwierdzanie działań (Automatyczna kontrola)
Działania ze skutkami ubocznymi mogą czekać na twoją decyzję przed wykonaniem. Gdy zatwierdzenia są aktywne dla zadania — polityka Work ustawia Wymagaj zatwierdzenia działań ze skutkami ubocznymi albo przełącznik Automatyczna kontrola agenta jest włączony — uruchomienie zatrzymuje się przed wykonaniem run_command, computer_act, delete_file, move_file lub message_agent i pokazuje w rozmowie kartę decyzji: Zezwól raz, Zawsze zezwalaj lub Odmów.
- Zezwól raz wykonuje dokładnie to wywołanie i pyta ponownie następnym razem.
- Zawsze zezwalaj wykonuje wywołanie i zapisuje regułę w zadaniu: dla całego narzędzia przy działaniach na plikach i komputerze, ograniczoną do programu polecenia (jego pierwszego tokenu) przy
run_command— zatwierdzenienpm run buildzatwierdza z góry przyszłe polecenianpm, a nie całą powłokę — i ograniczoną do jednego agenta docelowego przymessage_agent. Reguły są wypisane w sekcji Automatyczna kontrola na karcie Agent i tam można je usunąć. - Odmów odrzuca wywołanie. Model dowiaduje się, że użytkownik odmówił i nie może ponowić działania w tej postaci; uruchomienie trwa dalej z tą odpowiedzią.
Oczekujące zatwierdzenie wywołuje też powiadomienie (w aplikacji oraz web push, gdy włączony), bo uruchomienie może być od minut bez nadzoru, gdy dojdzie do bramki. Jeśli nikt nie zdecyduje w ciągu pięciu minut, prośba wygasa, działanie nie zostaje wykonane, a uruchomienie kończy się jako Wymaga danych ze zwykłym przekazaniem zamiast czekać do wyczerpania budżetu.
Zatwierdzenia bramkują działania, nie widoczność: write_file i narzędzia tylko do odczytu pozostają bez bramki, a każda decyzja trafia do dziennika audytu bezpieczeństwa.
Stan zadania
Interfejs mapuje trwałe stany:
| Stan interfejsu | Stan zaplecza | Kolor |
|---|---|---|
| Bezczynne | idle | rgb(255, 255, 255) |
| Myślenie | preparing lub running | rgb(48, 121, 255) |
| Ukończone | completed | rgb(76, 212, 117) |
| Wymaga danych | needs_input lub cancelled | rgb(255, 204, 0) |
| Błąd | failed | rgb(255, 61, 129) |
Zatrzymanie zmienia stan na Wymaga danych i zachowuje pliki. Wyczerpanie budżetu rund lub narzędzi też kończy tak po końcowym przekazaniu bez narzędzi, więc nieukończona praca nie jest Ukończona.
Aktywne uruchomienie nie blokuje rozmowy: wiadomość dołącza natychmiast i trafia do modelu w następnej rundzie, więc można korygować bez zatrzymania; przycisk stop pozostaje obok wysyłania.
Zmiana rozmiaru obszaru
Na progu desktopowym xl Rozmowa i Obszar mają przeciągany podział:
- Domyślna szerokość rozmowy 45%.
- Preferowany zakres 30%–70% z minimalnymi szerokościami treści.
- Zapisana proporcja dotyczy użytkownika w tej przeglądarce.
- Strzałki przesuwają 2%; Shift 10%.
- Home/End wybierają minimum/maksimum.
- Enter lub dwuklik resetuje.
Sterowanie podąża za kierunkiem pisma. Po arabsku Rozmowa jest po prawej, Obszar po lewej, a wskaźnik i klawisze działają w oczekiwanym kierunku wizualnym.
Na mniejszych ekranach użyj przełącznika Rozmowa/Obszar w nagłówku.
Pliki
Karta Pliki przegląda bezpośrednie dzieci /workspace, otwiera tylko prawidłowy tekst UTF-8 i zapisuje do woluminu. Nieprawidłowe bajty są odrzucane zamiast stratnie zastępowane.
Edytor zapewnia:
- kolorowanie składni jasne/ciemne dla popularnych języków webowych, systemowych, skryptowych, danych i znaczników;
Cmd/Ctrl+Szapis;Shift+Alt+Fformatowanie;- optymistyczne wykrywanie konfliktu, by stary widok nie nadpisał zmiany;
- szkice per zadanie/ścieżka w pamięci sesji; oraz
- ostrzeżenia nawigacji przy niezapisanej zmianie.
Kolorowanie pauzuje ponad 8,000 znaków lub 400 linii. Formatowanie do 100,000 znaków i 4,000 linii dla JavaScript/JSX, TypeScript/TSX, JSON, CSS/SCSS/Less, HTML, Markdown/MDX i YAML.
Gdy model zmieni otwarty plik, karta pokazuje czerwono-zielony widok Zmiany od początku tury z ukrytymi długimi fragmentami bez zmian. Przełącznik zmienia diff/edytor, a +added −removed podsumowuje. Bazą jest treść widziana przez przeglądarkę przed turą; plik otwarty później nie ma diffu.
Szkice są wygodą, nie kopią. Znikają po zapisie/usunięciu zadania i zwykle końcu sesji.
Aktywność
Karta pokazuje wywołania, wyniki, operacje plików, wyjście i błędy. Metadane można rozwinąć w rozmowie. Wyjście jest LTR nawet w RTL.
Podczas uruchomienia Libre WebUI otwiera uwierzytelniony SSE. Strumień może nieść:
- początkowy
snapshoti zmianyrun_state; reasoning_deltaprzy jawnym rozumowaniu dostawcy;assistant_delta;tool_callitool_result;usage;skill_loadeddla instrukcji workera; oraz- końcowe
errorlubdone.
Dostępność rozumowania zależy od modelu i dostawcy. Libre pokazuje tylko treść z API, nie odzyska ukrytego chain-of-thought; niektóre modele nie mają strumienia. Tekst i narzędzia nadal mogą płynąć niezależnie.
Wyjście jest ograniczone. Ucięcie nie dowodzi braku dalszej treści; poproś o węższy wynik lub polecenie.
Git
Karta Git obsługuje lokalny /workspace:
- inicjalizację repozytorium z
main; - status porcelain, ahead/behind i do 20 commitów;
- ograniczony diff ścieżki;
- stage do 200 jawnych ścieżek;
- commit z nazwą i e-mailem administratora albo lokalnym no-reply;
- tworzenie gałęzi po pierwszym commicie; oraz
- przełączenie istniejącej gałęzi przy czystym worktree.
Powierzchnia jest tylko lokalna. Nie ma clone, fetch, pull, push, zarządzania remote, dowolnych poleceń, tokenów, kluczy SSH ani pull request. Potrzebny jest osobny zaufany broker poświadczeń, najlepiej GitHub App lub token instalacji ograniczony do jednego repozytorium i operacji. Nie wkładaj długotrwałych poświadczeń do /workspace, środowiska ani konfiguracji.
Odczyty mogą działać przy aktywnym zadaniu. Zapisy są odrzucane, gdy model, terminal lub podgląd posiada kontener; zmiana gałęzi wymaga czystego worktree. Zapobiega to wyścigom.
Każde polecenie UI to stała tablica argumentów wykonywana jako 1000:1000; wejście nigdy nie trafia do powłoki. Runtime wyłącza konfigurację systemową/globalną, prompty, hooki, helpery poświadczeń, podpisywanie, submoduły, zewnętrzne diffy, textconv i protokoły sieciowe. Odrzuca repozytorium, którego worktree nie jest dokładnie /workspace lub Git/common wychodzi poza. Zapis jest blokowany też przy wykonywalnym filtrze clean, smudge lub process.
Chroni to API Git. Administrator nadal może użyć Terminala, a model run_command, więc granicą dowolnych poleceń pozostaje piaskownica i wdrożenie.
Wbudowane umiejętności workera
Każde uruchomienie dostaje przewodnik serwera opisujący trwałe /workspace, tylko-do-odczytu root, tymczasowe procesy i /tmp, sieć, limity oraz podgląd. Umiejętności każą:
- sprawdzić instrukcje, manifesty, lockfile, skrypty i stan przed edycją;
- zachować niezwiązaną pracę i grupować niezależne odczyty;
- kontynuować implementację zamiast kończyć na planie;
- wykonać skupione testy przed szerszymi;
- diagnozować zamiast ślepo powtarzać; oraz
- sprawdzić aplikację przed podglądem jako końcowym długim procesem.
Przewodnik istnieje tylko w kontekście modelu. Libre nie tworzy AGENTS.md, katalogu umiejętności ani pliku sterującego. Instrukcje projektu nie przekraczają granicy kontenera/narzędzi.
Terminal
Karta Terminal łączy interaktywną powłokę z tą samą piaskownicą, aby administrator sprawdził stan, zbudował lub debugował w przeglądarce.
Powłoka ma identyczną politykę: nieuprzywilejowany 1000:1000, /workspace, wzmocniony kontener bez capabilities. Nie daje więcej niż run_command — to ludzki interfejs tej samej granicy.
Zachowanie:
- Uwierzytelnianie — przeglądarka wymienia nagłówek Authorization przez HTTP na krótki jednorazowy bilet związany z protokołem i zadaniem. Tylko bilet i ID są w
/ws/work-terminal. Przed wejściem Libre sprawdza konto, dostęp, istnienie i własność; cofnięcie zamyka i zwalnia dzierżawę. - Pochodzenie — przy
CORS_ORIGINlubBASE_URLprzeglądarka musi pasować. Skonfiguruj dla zdalnego wdrożenia. Brak Origin działa dla Electron/klientów nieprzeglądarkowych, ale nadal wymaga biletu i autoryzacji; kontroluj TLS, firewallem i proxy. - Dopuszczenie — otwarty terminal bierze dzierżawę i liczy się do
WORK_MAX_ACTIVE_RUNTIMES_*. - Żywotność — utrzymuje kontener i blokuje zatrzymanie bezczynności.
- Współbieżność —
WORK_TERMINAL_MAX_SESSIONS_PER_TASK(domyślnie 2). - Bezczynność —
WORK_TERMINAL_IDLE_TIMEOUT_MS(15 minut) zamyka i zwalnia. - Aktywna tura — karta wyjaśnia własność modelu i otwiera po zakończeniu.
Terminal używa bezpośrednio API Docker Engine, bo TTY wymaga przejętego strumienia. Używa WORK_DOCKER_SOCKET, inaczej DOCKER_HOST — unix:// lub zwykły tcp://, np. proxy przenoszące strumień przez Connection: Upgrade — inaczej /var/run/docker.sock. Nieobsługiwane ssh:// lub tcp:// z DOCKER_TLS_VERIFY zgłasza niedostępność z przyczyną, bez innego połączenia; reszta Work działa. Kubernetes używa exec TTY WebSocket przez API, z ramkami rozmiaru, bez Docker.
Sesje nie są nagrywane; polecenia nie trafiają do Aktywności.
Podgląd
Karta uruchamia, zatrzymuje, osadza i otwiera aplikację. Przy pustym poleceniu Libre:
- uruchamia skrypt
devz głównegopackage.jsonz hostem/portem; - serwuje główny
index.htmlwbudowanym serwerem bez zależności; albo - stosuje te reguły do jednej aplikacji zagnieżdżonej.
Główna ma pierwszeństwo. Kilka równych aplikacji lub brak wejścia daje użyteczny błąd, nie przypadkowe npm. Dla innych układów podaj polecenie przed Uruchom podgląd. Startuje w /workspace, np. cd apps/web && npm run dev -- --host 0.0.0.0 --port 4173. Proces musi słuchać 0.0.0.0 i WORK_PREVIEW_PORT; Work czeka 15 sekund.
Model może użyć start_preview. Tylko tak może zostawić proces. run_command sprząta potomków po zakończeniu.
Ekran (Work Computer)
Obejrzyj pełną demonstrację: prawdziwe, nieedytowane uruchomienie (30x, potem czas rzeczywisty), w którym agent sam przegląda galerie NASA, wybiera zdjęcia oraz buduje i testuje galerię Three.js — z jednego promptu.
Zadanie z polityką Work Computer otrzymuje kartę Ekran: bieżące okno na wirtualny pulpit w tej samej piaskownicy — menedżer okien, dock i Chromium na 1280×800. Możesz obserwować, przejąć mysz i klawiaturę, słuchać dźwięku i uczyć przez demonstrację. Otwarcie uruchamia GUI na żądanie (nic nie działa bez widza) i łączy widok VNC przez WebSocket.
Administrator włącza jednym kliknięciem: karta Work Computer z Włącz buduje dołączoną image GUI na daemonie wdrożenia (pierwszy raz kilka minut) i tworzy gotową politykę — bez ręcznego docker build. Za filtrowanym proxy punkt build jest celowo blokowany; pobierz image na hoście (ghcr.io/libre-webui/libre-work-computer, tag libre-work-computer:latest) lub zbuduj z deploy/work-computer/, a Włącz tylko utworzy politykę. Zadania muszą mieć sieć, bo ekran używa portu kontenera publikowanego na loopback jak podgląd.
Bezpieczeństwo: VNC w kontenerze słucha localhost za dwoma hasłami per sesja — tylko do oglądania dla widzów i pełnym tylko dla właściciela dzierżawy przejęcia, więc serwer sam ignoruje wejście innych. Bridge WebSocket jest jedyną powierzchnią, opublikowaną na loopback hosta i nie bezpośrednio. Każdy widz ma jednorazowy bilet sesji/zadania jak Terminal; dostęp jest sprawdzany przy każdym połączeniu i cofnięcie natychmiast rozłącza. Do czterech widzów, a oglądanie liczy się jako aktywność.
Oglądanie nie konkuruje z uruchomieniem: podczas tury łączy jej piaskownicę, nie blokuje następnej i sesja przeżywa zakończenie — także przy osobnym workerze team. Profil przeglądarki trwa w /workspace/.browser-profile, więc logowania przeżywają restart.
Sterowanie agenta: dwa narzędzia. computer_observe zwraca pełny screenshot, kursor, aktywne okno, URL, czy fokus klawiatury ma strona czy UI przeglądarki, opis elementu i hash. Sygnały pochodzą z DevTools na loopback i są nieobecne w starszych images. computer_act wykonuje do 24 działań (ruch, klik, dwuklik, prawy klik, wpisanie, klawisze, przewijanie, czekanie) i zwraca ustabilizowany ekran.
Trzy zabezpieczenia: type/key mogą zadeklarować focus i bezpiecznie odmawiają, gdy pole nie ma fokusu, aby tekst nie trafił do omniboxu; batch kończy się po pojawieniu okna, zmianie tytułu lub fokusu, bo współrzędne się zdezaktualizowały; może też zadeklarować oczekiwany tytuł, URL lub zmianę regionu, sprawdzane adaptacyjnym terminem — „pending” znaczy niezaobserwowane, nie sukces.
Po batchu ekran jest odpytywany do stabilności zamiast stałego opóźnienia. Wyniki mają dowody: klik raportuje zmianę pikseli, scroll_until przewija do tekstu/krawędzi i raportuje widoczność, obserwacja jest porównana z poprzednią. Jednoliniowy subgoal trwa jako checkpoint i wraca w promptach odzyskania. Pętla wykrywa uziemienie: trzy identyczne działania na niezmiennym ekranie dają ostrzeżenie, kolejne kończy z prośbą o dane; kolejne niezweryfikowane oczekiwania dają komunikat ponownego uziemienia. Telemetria — rundy, opóźnienia, screenshots, zabezpieczenia, werdykty — trafia do rekordów i podsumowania.
Screenshoty docierają jako prawdziwe obrazy każdą trasą — Ollama, Anthropic, Gemini, zgodny chat i Responses — więc wybierz model wizyjny. Jeśli dostawca odrzuci obrazy (model tekstowy), uruchomienie nie pada: obrazy są pomijane dalej, model polega na tekście, a transkrypt wyjaśnia degradację. Weryfikacja bez widzenia jest gorsza. Tylko najnowsze obrazy pozostają w kontekście; trwały transkrypt zapisuje tekst, nigdy bajty.
Przeglądarka ma blokowanie treści — uBlock Origin Lite dla reklam i trackerów (wersja przypięta i sprawdzona sumą przy budowie, tryb filtra wymuszony zarządzaną polityką) oraz automatyczne zamykanie banerów cookies — bo marnują screenshoty, tokeny i kliknięcia. Żądania reklam są neutralizowane jak uBlock: znane skrypty zastępują nieszkodliwe lokalne stubs, by strony działały. Agent nigdy nie wpisuje poświadczeń ani nie rozwiązuje CAPTCHA/2FA; zgłasza blokadę. Dla niezaufanych zadań łącz GUI z filtrującym DNS — przeglądarka zwiększa znaczenie egress.
Dźwięk: ekran jest domyślnie wyciszony (przeglądarka wymaga kliknięcia); głośnik streamuje dźwięk. PulseAudio gra do null sink, monitor jest przechwytywany jako PCM i serwowany drugim uwierzytelnionym bridge na loopback, z tym samym biletem, sprawdzaniem i limitem. Wymaga aktualnej image z deploy/work-computer/.
Przejęcie: Przejmij daje mysz i klawiaturę do logowania, CAPTCHA lub kroku zakazanego agentowi; Gotowe oddaje. Jedna sesja VNC ma pełne i widokowe hasło generowane per sesja, nigdy logowane; pełne tylko dla dzierżawy. TTL wygasa w dwie minuty, odnawia się przy otwartym UI i nie można odebrać innej osobie.
Polityka Zezwalaj na przejęcie ekranu może wyłączyć: ukrywa Przejmij/Naucz, punkt odmawia, a request_takeover mówi, że nie ma komu przekazać; oglądanie działa. Przy człowieku computer_observe i computer_act są blokowane, więc agent nie walczy ani nie fotografuje wpisywania. request_takeover może pokazać banner z powodem i czekać na zwrot. Poświadczenia idą z klawiatury do strony, nigdy modelu/transkryptu. Starsze images są tylko do oglądania.
Tryb nauczania: Naucz zadania nagrywa demonstrację — przejmujesz ekran z widocznym wskaźnikiem, a ruchy, klawisze i przewijanie są zapisywane na współrzędnych. Każdy klik jest zakotwiczony: tylko-do-odczytu probe ustala tag, ID, etykietę i URL, więc krok nazywa cel, np. „Kliknij "button#submit (Place order)"”, a współrzędne są tylko wskazówką.
Zapis buduje playbook deterministycznie, bez modelu: klawisze łączą się w tekst, klik/przeciąg używa progu 8 pikseli, pauzy są krokami czekania, a tekst z tajnym słownictwem lub kształtem poświadczenia (8+ znaków z trzech klas) jest redagowany i zastępowany request_takeover. Procedura w języku naturalnym używa najpierw kotwic, współrzędnych jako wskazówek i computer_observe; zawiera kiedy użyć, wejścia, kroki, weryfikację, dozwolony zakres z rzeczywiście odwiedzonych hostów (odtwarzanie musi pytać przed wyjściem; nie dziedziczy większej władzy), granice zatwierdzeń i stop-and-ask przy błędzie.
Playbook jest zwykłą umiejętnością (prefiks taught-) z wersjami, edycją i udostępnianiem. Uruchomienia komputerowe ładują włączone nauczone umiejętności właściciela i raportują je; odtwarzanie to zwykłe zadanie pasujące do procedury. Po zakończeniu etykiety oferują ocenę działa/nie działa, dopisując datowaną linię do Track record (najnowsza pierwsza, ograniczone, każda zwykłą wersją), więc historia zostaje z procedurą. Nie wpisuj prawdziwych haseł podczas nagrywania — pokaż do logowania, zapisz, a przy odtwarzaniu użyj request_takeover.
Dostawcy, routing i ujawnianie danych
Obsługiwane trasy
| Trasa | Walidacja i zachowanie |
|---|---|
| Lokalny Ollama | Zdrowy, dokładny model deklaruje narzędzia. |
| Ollama Cloud | Jawnie przez Ollama; przyrostek cloud pokazuje ujawnienie zdalne. |
| Wtyczka uzupełniania/czatu | Aktywna, zawiera dokładny model i poświadczenie administratora. |
| Wtyczka Anthropic | Adapter wiadomości i tool-use Work dla Anthropic. |
| Wtyczka Gemini | Adapter treści i function-calling Work dla Gemini. |
| Inne zgodne | Kształt OpenAI messages, tools i tool-choice. |
Typ dostawcy i ID wtyczki są w zadaniu i uruchomieniu. Sama nazwa nie wybiera trasy; wtyczka o nazwie Ollama nie przejmie zadania.
Co otrzymuje dostawca
Na rundę może otrzymać:
- prompt Work;
- umiejętności workera i limity;
- ostatnie 30 wiadomości, do 256 KB;
- definicje narzędzi;
- historię wywołań; oraz
- wyniki: listy, treść plików, wyszukiwanie, wyjście i błędy.
Wolumin nie jest wysyłany w całości. Treść zwrócona przez narzędzie wchodzi do rozmowy i trafia do dostawcy. Sprawdź retencję, trenowanie, ceny i użycie przed poufnym kodem.
Poświadczenia zostają na zapleczu, niezależnie od zakresu konfiguracji, i nigdy nie są montowane w Work.
Szyfrowanie poświadczeń nie szyfruje całego zadania. Rozmowy, wyniki, wyjście i metadane są zwykłą bazą; pliki są zwykłymi plikami woluminu/PVC. Użyj kontroli hosta i szyfrowania dysku, gdy potrzebne.
Ujawnienie zdalnego dostawcy
Modele wtyczek oraz Ollama z :cloud/-cloud są zdalne dla ujawnienia. Wybór pokazuje zamykane wyjaśnienie przepływu i wielu płatnych wywołań; preferencja jest per użytkownik.
Wszystkie trasy używają WORK_MAX_AGENT_ROUNDS, domyślnie 48. Nie ma ograniczenia plugin 12. Budżet narzędzi to większe z 128 lub ośmiu na rundę. Po wyczerpaniu Libre prosi o końcowe przekazanie bez narzędzi z pracą, testami, blokadami i krokami oraz zapisuje Wymaga danych, nie surowy wyjątek lub fałszywe ukończenie. Kolejna tura kontynuuje. Jedno uruchomienie może mieć wiele płatnych żądań.
Obszary w folderach hosta (opcjonalne)
Docker zwykle daje zadaniu własny wolumin, więc model nie widzi prawdziwych plików. Można powiązać zadanie z folderem hosta. Kubernetes odrzuca to i używa PVC.
Ustaw i zrestartuj:
WORK_HOST_WORKSPACES_ENABLED=true
WORK_HOST_WORKSPACE_ROOTS=/Users/you/Projects
WORK_HOST_WORKSPACE_ROOTS to lista rozdzielona :, domyślnie home serwera. Po włączeniu pojawia się pole Folder obszaru roboczego. Puste zachowuje izolowany wolumin.
Ścieżka musi być bezwzględna, istniejącym katalogiem, a po symlinkach mieścić się w root. .ssh, .gnupg, .aws, .config, .kube, .docker, .claude, .libre-webui, node_modules są zawsze odrzucane. Rozwiązana ścieżka jest zapisana i widoczna w nagłówku.
Model czyta i zapisuje prawdziwe pliki, a nie-root, capabilities i limity nie oddzielają go od katalogu. Zostaw wyłączone bez potrzeby, zawężaj rooty i preferuj kontrolę wersji.
Trwałość i cykl środowiska
Libre rozdziela stan:
| Stan | Pamięć | Czas życia |
|---|---|---|
| Własność, tytuł, dostawca, stan | Baza Libre WebUI | Do usunięcia zadania/użytkownika |
| Uruchomienia, błędy, wiadomości, aktywność | Baza Libre WebUI | Do usunięcia zadania |
| Pliki | Wolumin Docker lub PVC | Przetrwają anulowanie, stop podglądu i restarty |
| Rootfs i tymczasowe | Kontener lub Pod | Jednorazowe, zatrzymywane/odtwarzane |
| Proces podglądu | Aktywna piaskownica | Ulotny, tylko gdy zdrowy |
| Szkic edytora | Sesja przeglądarki | Tymczasowa wygoda |
Każde zadanie ma UUID serwera. Nazwy są wyprowadzane w zapleczu, nigdy przyjmowane z przeglądarki. Zasoby mają etykiety zarządzania i własności; przed użyciem/usunięciem etykieta jest sprawdzana i obcy zasób odrzucany.
Piaskownice powstają na żądanie. Pomocniki zatrzymują bezczynną, polecenia po ukończeniu, a zdrowy podgląd może ją utrzymać. Trwały obszar jest ponownie montowany.
Administratorzy definiują nazwane polityki środowiska na karcie Zarządzanie użytkownikami w Settings: image, limity pamięci/CPU/PID, rozmiar Kubernetes, bezczynność, sieć i dwa przełączniki. Work Computer (GUI + przeglądarka) daje pulpit/Ekran, Zezwalaj na przejęcie decyduje o przejęciu i nauczaniu. Zadanie używa polityki; puste pola dziedziczą globalne, usunięcie wraca do globalnych przy odtworzeniu. Polityka zmienia zasoby i funkcje, nie osłabia profilu bezpieczeństwa.
WORK_RUNTIME_IDLE_TIMEOUT_MS ogranicza okres podglądu: sweep zatrzymuje piaskownicę bez aktywności — polecenia, terminala, żądania podglądu — i zwalnia slot. Obszar trwa, podgląd restartuje się. Domyślne 0 zachowuje działanie do ręcznego stopu.
Przy starcie aktywne uruchomienia są oznaczane błędem, podgląd czyszczony. Driver jedną zapytaniem listuje zarządzane kontenery/Pody. Aktywne znanych zadań zatrzymuje, spoczywające zostawia, osierocone usuwa. Własność z etykiety, nie nazwy. Zakłada jedną instancję per namespace/daemon; nie kieruj dwóch. Gdy nie można dowieść czyszczenia, Work fail-closed próbuje co 10 sekund i blokuje zmiany.
Zachowanie sieci
Zadania bez polityki zaczynają z siecią. Administrator może stworzyć domyślnie offline, a twórca wybrać przy utworzeniu. Nie ma osobnego przełącznika; zmiana wymaga odtworzenia.
Docker dołącza do zarządzanego mostu (libre-webui-work, WORK_NETWORK_NAME) z com.docker.network.bridge.enable_icc=false. Zatem:
- piaskownice nie łączą się ze sobą; oraz
- nie osiągają kontenerów na wspólnym domyślnym moście, np. nieopublikowanej bazy/Ollama.
Jeśli sieć o nazwie istnieje, ale nie jest zarządzana, Libre odmawia zamiast dołączyć.
Kubernetes oznacza Pod etykietą. Helm instaluje default-deny, ingress tylko podglądu i internet egress dla sieciowych Podów z wykluczeniem work.networkPolicy.blockedEgressCidrs. Działa tylko przy CNI egzekwującym NetworkPolicy; zobacz Kubernetes.
Egress jest dozwolony dla pakietów, Git i API. To nie firewall. Kod może osiągnąć:
- usługi hosta Docker;
- lokalną sieć hosta;
- internet; oraz
- metadane infrastruktury.
Haki polityki egress
Łącz:
WORK_RUNTIME_DNS(Docker) — adresy resolverów oddzielone przecinkami wymuszane--dns. Filtr daje listy nazw. Nieadresy są odrzucane i logowane, więc nie wstrzykną flag.- Reguły firewalla hosta/upstream na stabilnym subnecie mostu.
WORK_NETWORK_NAMEdo wcześniej utworzonej sieci z etykietą zarządzaną i wyłączonym ICC.
DNS nie blokuje literalnych IP. Gwarancja wymaga firewalla hosta/klastra/upstream.
Nie zakładaj, że Work nie wysyła danych. Dostęp tylko zaufanym. Używaj polityki offline; nie ma globalnej zmiennej zmieniającej domyślną politykę.
Sieć nie dodaje poświadczeń. Libre nie montuje SSH, chmury, profili, home ani socketu. Kod może wysłać sekrety zapisane w /workspace.
Ruch piaskownicy jest osobny od modelu; żądania zawsze wychodzą z zaplecza do jawnej trasy.
Granica bezpieczeństwa piaskownicy
Kontener Docker Work:
- działa jako
1000:1000bez roota; - pracuje w
/workspace; - montuje tylko wolumin zadania;
- ma tylko-do-odczytu rootfs i ograniczone
/tmp; - usuwa wszystkie capabilities;
- włącza
no-new-privileges; - nie jest privileged i ma init;
- ma limity CPU, pamięci, procesów, czasu i wyjścia;
- ustawia swap równy pamięci (
--memory-swap=--memory); - dołącza do izolowanej sieci lub żadnej; oraz
- publikuje tylko port podglądu na loopback.
Wszystko jest sprawdzane przez docker inspect przed ponownym użyciem i hashowane w ai.libre-webui.policy. Kontener ze starą polityką jest niszczony i odtwarzany, więc wzmocnienia obejmują istniejące zadania.
Kubernetes stosuje odpowiednik: nie-root, tylko-do-odczytu, seccomp RuntimeDefault, bez eskalacji, capabilities usunięte, ograniczona pamięć efemeryczna i zasoby, bez tokenu ServiceAccount, PVC na /workspace. Sprawdza etykiety i odcisk przed użyciem/usunięciem.
Walidacja odrzuca ścieżki bezwzględne, traversal, backslash, NUL i za długie. Pomocniki rozwiązują realpath i symlinki. Zapis używa pliku tymczasowego i atomowej zmiany.
Kontrole ograniczają przypadkową ekspozycję; nie tworzą VM ani bezpiecznej analizy malware. Kontenery współdzielą jądro, a luka w Docker, Kubernetes, runtime, image, zależności lub jądrze może przekroczyć granicę.
Woluminy Docker nie mają niezależnego quota. Projekt może zapełnić pamięć; monitoruj i egzekwuj na hoście. Kubernetes żąda rozmiaru PVC, a egzekwowanie zależy od provisionera.
Lista wzmocnienia Docker w produkcji
Dotyczy Docker. Kubernetes sprawdza też RBAC namespace, security context, storageclass i CNI NetworkPolicy zgodnie z przewodnikiem.
Aplikacja ustawia flagi, waliduje ścieżki i chroni API, ale nie wymusza firewalla hosta, quota sterownika ani uprawnień demona. To jawna praca operatora.
1. Izolowanie sterowania Docker
Główny kontener potrzebuje kontroli demona. Zamontowany socket to poświadczenie płaszczyzny sterowania; przejęcie webapp może przejąć host.
docker-compose.socket-proxy.yml trzyma socket poza Libre. Proxy na sieci wewnętrznej przekazuje tylko containers, images, volumes, networks, exec, info, blokując swarm, secrets, configs, build, commit, system. Libre używa DOCKER_HOST=tcp://docker-socket-proxy:2375, bez mountu/grupy; CLI, terminal i diagnostyka podążają. Proxy zmniejsza API, nie skutki: tworzący kontenery bind-mountuje hosta.
Silniejsza granica to dedykowana VM bez innych zadań, dalej dedykowany rootless daemon lub osobny host. Sprawdź własność, routing, czyszczenie i terminal. Tylko-do-odczytu rootful socket nadal daje zapis API.
2. Blokowanie zarządzania hostem z piaskownicy
Wyłączenie ICC nie blokuje usług hosta. Sprawdź most/subnet:
docker network inspect libre-webui-work \
--format 'id={{.Id}} subnets={{range .IPAM.Config}}{{.Subnet}} {{end}}'
ss -lntup
Trwałym firewallem odrzuć ruch mostu do SSH, Docker API, baz i portów admin. Testuj z jednorazowego kontenera, dozwolone pobieranie i utrwal regułę. DOCKER-USER kontroluje forward, a ruch do hosta może wymagać INPUT na interfejsie mostu.
3. Ograniczanie celów wychodzących
Blokuj metadane chmury, prywatną infrastrukturę i LAN klienta bez potrzeby. Łącz DNS z firewallem. Literalne IP omija DNS, proxy HTTP nie wystarcza przy bezpośrednich połączeniach. Egzekwuj routing poza kontenerem.
Utrzymuj polityki offline, tylko-rejestr i otwarte. Polityka decyduje o sieci, zewnętrzne reguły o celach.
4. Egzekwowanie prawdziwych quota
Limity CPU/pamięci/PID nie ograniczają woluminu. Wybierz XFS project quota, logiczne woluminy lub sterownik PVC z rozmiarem. Docker local na ext4 nie dostaje quota od dokumentacji rozmiaru.
Monitoruj ai.libre-webui.managed=true i dataroot, alarmuj przed pełnym, testuj błąd. UI/du ostrzega, nie egzekwuje między kontrolami.
5. Weryfikacja wdrożonej polityki
Po zmianie utwórz jednorazowe zadanie i sprawdź docker inspect: UID, read-only, capabilities, no-new-privileges, pamięć/swap/CPU/PID, tylko wolumin i sieć. Sprawdź mounty aplikacji i wejście przez uwierzytelnione proxy/tunel, nie przypadkowe porty.
Bezpieczeństwo i osiągalność podglądu
Docker publikuje port dynamicznie na loopback; Kubernetes trafia w IP Poda. Model/przeglądarka nie wybierają upstream. Libre podpisuje URL dla zadania/punktu, przy każdym żądaniu sprawdza proces i proxy HTTP/WebSocket przez /api/work/previews. Stop/restart unieważnia URL.
Odpowiedzi usuwają poświadczenia Libre i cookies upstream. HTML ogranicza iframe sandbox i CSP ze skryptami, formularzami, modalami i pobieraniem bez same-origin; chroni też osobną kartę. Kod pozostaje niezaufany i może wysyłać dane obszaru lub wejścia. URL to krótki sekret.
Proxy działa na publicznym origin Libre, więc zdalny HTTPS bez portów/IP i mixed-content. Reverse proxy zachowuje WebSocket /api/work/previews/; dostarczony Nginx robi to.
Główna aplikacja dopuszcza własny origin i Turnstile jako frame. Podgląd omija główny Helmet, by streamować body i zastosować węższy sandbox. Cross-origin embedder pozostaje wyłączone, bo devserwery nie mają zgodnych nagłówków.
Macierz wdrożeń
Dostępność wynika z maszyny/procesu zaplecza, nie interfejsu.
| Wdrożenie | Uruchomienia i pliki | Podgląd |
|---|---|---|
Lokalne npx libre-webui | Obsługiwane przy zainstalowanym i osiągalnym Docker. | Podpisane proxy origin. |
| Lokalne źródła | Te same wymagania Docker/dostawcy. | Origin API na porcie 3001. |
| Electron | Warunkowo; używa zewnętrznego zaplecza bez osobnego runtime. | Proxy tego zaplecza. |
| Bare metal/VM zdalnie | Działa przy Docker na hoście. | Gdy proxy zachowuje HTTP/WebSocket. |
| Standardowy Docker Compose | Domyślnie na Docker Desktop: image ma CLI, Compose montuje socket, a porty Work idą przez host.docker.internal. Natywny Docker Engine wymaga dodatkowo osiągalnego, niepublicznego WORK_PREVIEW_BIND. | Ten sam publiczny origin. |
| Kubernetes/Helm | --set work.enabled=true: Pody z PVC (uruchomienia, pliki, polecenia, Git, terminale, ekran/audio Work Computer na IP Poda), Role namespace i default-deny NetworkPolicies — bez socketu. Zobacz Kubernetes. | Zaplecze in-cluster proxy do IP Poda. |
Uruchamianie Work, gdy Libre WebUI działa w Docker
Każdy Compose repozytorium włącza Work: image ma CLI, Compose montuje /var/run/docker.sock. Docker Desktop działa z dołączonymi domyślnymi ustawieniami routingu. Natywny Docker Engine wymaga dodatkowo WORK_PREVIEW_BIND na niepublicznym interfejsie hosta osiągalnym z kontenerów siostrzanych, jak opisano niżej.
Kontenery zadań są rodzeństwem Libre, widocznym w docker ps, i podlegają temu samemu cyklowi.
Socket w webapp daje równoważną rootowi kontrolę hosta. Work bez niego nie działa, więc Libre włącza jawnie: każdy administrator Libre WebUI jest administratorem hosta Docker. Operator odpowiada za daemon, sieć, cykl, kopie i dostęp. Usuń linię socketu, aby wyłączyć Work; nic innego jej nie potrzebuje.
Dla Work bez socketu w webapp użyj docker-compose.socket-proxy.yml i DOCKER_HOST. Zobacz Izolowanie sterowania Docker.
Trzy warunki, a panel nazywa błąd:
- CLI musi istnieć. Oficjalna image ma; niestandardowa wymaga
docker-clilubWORK_DOCKER_COMMAND. InaczejThe "docker" CLI is not installed…. - Socket musi być zamontowany. Inaczej
No Docker daemon is reachable…. - Użytkownik musi być w grupie socketu. Image działa jako
nodejs(uid 1001), socket maroot/docker, więc Compose dajegroup_add: ['${DOCKER_GID:-0}']. Domyślne dla Docker Desktop; Linux potrzebuje ID. InaczejThe Docker socket is mounted but the Libre WebUI user cannot open it….
# Read the socket's group as seen INSIDE a container. A macOS host reports a
# different value, because Docker Desktop proxies the socket through a VM.
echo "DOCKER_GID=$(docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
alpine stat -c '%g' /var/run/docker.sock)" >> .env
docker compose up -d --force-recreate
Porty podglądu są na loopback hosta i wystawione podpisanym proxy same-origin dla HTTP/WebSocket. Działa za HTTPS/tunelem bez otwierania portów; polityka sandbox, a stop unieważnia URL.
Przy zapleczu w Docker publikacja i łączenie mogą mieć inne adresy. Zachowaj WORK_PREVIEW_BIND=127.0.0.1, ustaw WORK_DOCKER_PUBLISHED_HOST na osiągalny host (host.docker.internal w Desktop). Dołączone profile Compose ustawiają obie wartości i mapują nazwę hosta. Linux musi nadpisać WORK_PREVIEW_BIND bramą mostka Docker (lub innym osiągalnym, niepublicznym interfejsem); sama mapa nie osiąga loopback. Nigdy nie binduj tych surowych portów tymczasowych do 0.0.0.0.
Limity: WORK_MAX_ACTIVE_RUNTIMES_PER_USER 2, WORK_MAX_ACTIVE_RUNTIMES_GLOBAL 3, więc druga praca może działać. Capabilities zgłasza limity i zajętość. Zwiększ przy zasobach.
Kubernetes instaluj z work.enabled=true, nie socketem node. Chart tworzy RBAC, namespace, polityki i Pod/PVC z przewodnika.
Konfiguracja środowiska uruchomieniowego
Work odczytuje:
| Zmienna | Domyślna | Cel |
|---|---|---|
WORK_RUNTIME_BACKEND | docker | Driver docker lub kubernetes |
WORK_RUNTIME_IMAGE | node:22.22-bookworm@sha256:2d178f2785b96dfbf62a416ca2e40f50e30150b4ff3320d706f0d96e90600eb3 | Image zadań |
WORK_DOCKER_COMMAND | docker | Plik CLI Docker |
WORK_COMMAND_TIMEOUT_MS | 120000 | Domyślny limit polecenia |
WORK_MAX_OUTPUT_CHARS | 50000 | Maksymalne wyjście poleceń/wyszukiwania |
WORK_MAX_AGENT_ROUNDS | 48 | Budżet rund per uruchomienie |
WORK_MEMORY_LIMIT | 2g | Pamięć kontenera |
WORK_CPU_LIMIT | 2 | CPU kontenera |
WORK_PIDS_LIMIT | 256 | Procesy kontenera |
WORK_PREVIEW_PORT | 4173 | Port aplikacji w kontenerze |
WORK_PREVIEW_BIND | 127.0.0.1 | Interfejs publikacji |
WORK_DOCKER_PUBLISHED_HOST | jak WORK_PREVIEW_BIND | Host/IP do portów publikowanych przez Docker |
WORK_COMPUTER_SCREEN_PORT | 6080 | Port WebSocket ekranu |
WORK_COMPUTER_AUDIO_PORT | 6081 | Port WebSocket audio |
WORK_RUN_LEASE_WAIT_MS | 60000 | Czekanie na tymczasową dzierżawę |
WORK_MAX_ACTIVE_RUNTIMES_GLOBAL | 3 | Równoczesne zadania per instancja |
WORK_MAX_ACTIVE_RUNTIMES_PER_USER | 2 | Równoczesne zadania per administrator |
WORK_MAX_TASKS_GLOBAL | 500 | Trwałe zadania per instancja |
WORK_MAX_TASKS_PER_USER | 100 | Trwałe zadania per administrator |
WORK_NETWORK_NAME | libre-webui-work | Zarządzany most |
WORK_RUNTIME_DNS | nieustawiona | Adresy DNS oddzielone przecinkami |
WORK_DOCKER_SOCKET | DOCKER_HOST, jeśli unix:// lub tcp://, inaczej /var/run/docker.sock | Punkt silnika dla terminali |
WORK_TERMINAL_MAX_SESSIONS_PER_TASK | 2 | Terminale per zadanie |
WORK_TERMINAL_IDLE_TIMEOUT_MS | 900000 | Bezczynność terminala |
WORK_RUNTIME_IDLE_TIMEOUT_MS | 0 (wyłączone) | Stop piaskownicy po bezczynności |
WORK_K8S_NAMESPACE | libre-webui-work | Namespace Pod/PVC |
WORK_K8S_STORAGE_CLASS | domyślna klastra | StorageClass PVC |
WORK_K8S_WORKSPACE_SIZE | 5Gi | Domyślny rozmiar PVC |
WORK_K8S_POD_READY_TIMEOUT_MS | 900000 | Czekanie na gotowość Poda |
WORK_K8S_POD_GONE_TIMEOUT_MS | 60000 | Czekanie na zniknięcie Poda |
W produkcji używaj stałej wersji/digestu. Zmienny tag może zmienić narzędzia i bezpieczeństwo bez zmiany Libre.
Uruchomienie, podgląd, pliki, polecenia i odtworzenie współdzielą pojemność procesu. Zagnieżdżona operacja na policzonym zadaniu nie liczy się drugi raz. Przekroczenie zwraca HTTP 429.
Stałe limity protokołu i interfejsu
| Element | Limit |
|---|---|
| Nowa wiadomość zadania/uruchomienia | 65,536 znaków i bajtów UTF-8 |
| ID modelu przy tworzeniu/zmianie | 500 znaków i bajtów UTF-8 |
| ID dostawcy wtyczki | 200 znaków |
| Aktywne uruchomienia per zadanie | 1 |
| Tekst polecenia | 20,000 znaków |
| Limit polecenia żądany przez narzędzie | od 1 do 600 sekund |
| Gotowość podglądu | 15 sekund |
| Odczyt/zapis pliku | 2,000,000 bajtów tekstu UTF-8 |
| Bezpośrednia lista katalogu | Pierwsze 1,000 pozycji |
| Strona wiadomości | Do 200 wiadomości i 1,000,000 bajtów |
| Trwała pojedyncza wiadomość | 100 KB |
| Kontekst wysłany do modelu | Ostatnie 30 wiadomości, do 256 KB |
| Trwałe wyjście narzędzia | Około 20,000 znaków źródłowych i znacznik |
| Kolorowanie edytora | 8,000 znaków i 400 linii |
| Formatowanie przeglądarki | 100,000 znaków i 4,000 linii |
| Wyjście statusu Git | 2,000,000 znaków |
| Wyjście diff Git | 600,000 znaków |
| Historia Git | 20 lokalnych commitów |
| Ścieżki w jednym stage | 200 |
| Wiadomość commit | 4,000 znaków |
| Pętla agenta | Domyślnie 48 rund przez WORK_MAX_AGENT_ROUNDS |
| Budżet wywołań | max(128, configured rounds × 8) wywołań |
Pliki to tekst UTF-8. Edytor nie obsługuje binarnych ani ponad 2 MB przez API.
Podsumowanie API
Wszystko pod /api/work wymaga uwierzytelnienia i bieżącego dostępu z bazy. Domyślnie admin; może otworzyć zwykłe operacje. Foldery hosta i polityki pozostają admin.
| Metoda | Ścieżka | Cel |
|---|---|---|
GET | /capabilities | Dostępność i limity |
GET | /tasks | Lista zadań administratora |
POST | /tasks | Zadanie i pierwsze uruchomienie |
GET | /tasks/:id | Stan i ostatnie wiadomości |
GET | /tasks/:id/messages | Starsze wiadomości |
PATCH | /tasks/:id | Nazwa lub trasa modelu |
DELETE | /tasks/:id | Usunięcie zadania i obszaru |
POST | /tasks/:id/runs | Dalsze uruchomienie |
POST | /tasks/:id/messages | Wiadomość podczas uruchomienia |
GET | /tasks/:taskId/runs/:runId/events | Uwierzytelniony SSE |
POST | /tasks/:id/cancel | Anulowanie |
GET | /tasks/:id/approvals | Oczekujące zatwierdzenia i stan Automatycznej kontroli |
PUT | /tasks/:id/approvals | Włączenie zatwierdzeń dla zadania |
POST | /tasks/:id/approvals/:approvalId | Decyzja o zatwierdzeniu (raz/zawsze, odmowa) |
DELETE | /tasks/:id/approval-rules/:ruleId | Usunięcie reguły Zawsze zezwalaj |
GET | /computer/setup | Stan instalacji Work Computer (admin) |
POST | /computer/setup | Budowa GUI i polityki (admin) |
POST | /tasks/:id/computer/start | Start sesji Work Computer |
GET | /tasks/:id/computer/control | Kto steruje; prośba agenta |
POST | /tasks/:id/computer/control | Przejęcie/odnowienie |
DELETE | /tasks/:id/computer/control | Zwrot agentowi |
POST | /tasks/:id/computer/teach | Zapis demonstracji jako umiejętności |
POST | /tasks/:id/computer/anchor | Element pod kliknięciem |
POST | /computer/skills/:slug/trace | Linia działa/nie działa |
GET | /tasks/:id/files | Lista katalogu |
GET | /tasks/:id/file | Odczyt tekstu |
PUT | /tasks/:id/file | Zapis tekstu |
GET | /tasks/:id/git | Chroniony status/historia |
GET | /tasks/:id/git/diff | Ograniczony diff |
POST | /tasks/:id/git/init | Inicjalizacja |
POST | /tasks/:id/git/stage | Stage ścieżek |
POST | /tasks/:id/git/commit | Commit |
POST | /tasks/:id/git/branches | Gałąź |
POST | /tasks/:id/git/switch | Przełączenie czystej gałęzi |
POST | /tasks/:id/preview/start | Start podglądu |
POST | /tasks/:id/preview/stop | Stop podglądu |
ID jest sprawdzane z uwierzytelnionym właścicielem. Stan konta, rola i polityka są czytane per żądanie, więc cofnięcie działa mimo starego JWT.
Schemat zachowuje wewnętrzne networkEnabled dla zgodności, ale UI go nie wystawia. Wybierz politykę z właściwą siecią; nie używaj surowego pola jako trwałego API.
Usuwanie, zmiany kont i kopie
Usuwanie zadania
Usunięcie jest destrukcyjne:
- Zaplecze oznacza wycofywanie i blokuje nowe zmiany.
- Anuluje aktywne i zatrzymuje piaskownicę.
- Sprawdza etykiety własności.
- Usuwa kontener/Pod i wolumin/PVC.
- Usuwa bazę kaskadowo.
- Po sukcesie czyści szkice.
Jeśli czyszczenie runtime zawiedzie, rekord zostaje i wraca błąd, aby naprawić i ponowić. Metadane nie znikają przy nieśledzonym zasobie.
Stop uruchomienia/podglądu zachowuje wolumin i rozmowę.
Degradacja administratora i usunięcie użytkownika
Degradacja najpierw utrwala cofnięcie. Każde żądanie sprawdza rolę. Zaplecze zawiesza zadania i próbuje zatrzymać. Błąd nie przywraca dostępu, ale jest zgłaszany do ponowienia.
Usunięcie innej osoby najpierw czyści jej zasoby. Błąd zachowuje rekord i metadane własności.
Pełna kopia zadania
Wymaga:
- bazy Libre WebUI z własnością, nazwami zasobów, routingiem, uruchomieniami, wiadomościami i aktywnością; oraz
- każdego woluminu/PVC
ai.libre-webui.managed=truez plikami.
Kontenery i podglądy nie wymagają kopii. Dla spójności zatrzymaj nowe działania i zaplecze, użyj procedury snapshotów.
Przywracaj bazę i obszary razem. Odtwórz dokładne nazwy i metadane ai.libre-webui.task=<task UUID>, ai.libre-webui.managed=true. Same pliki nie zachowują etykiet; sama baza nie ma plików; sama pamięć nie ma własności i nazw.
Przy szyfrowanych poświadczeniach zachowaj katalog danych i klucz zgodnie z główną instrukcją.
Lokalizacja i arabski RTL
Work jest przetłumaczony na 25 języków: angielski, arabski, bengalski, czeski, duński, niemiecki, hiszpański, francuski, hindi, indonezyjski, islandzki, włoski, japoński, koreański, malajski, niderlandzki, polski, portugalski, rosyjski, szwedzki, tajski, turecki, ukraiński, wietnamski i chiński.
Arabski ustawia lang="ar" i dir="rtl" przed React. Pasek idzie w prawo, Rozmowa po prawej, Obszar po lewej, ikony lustrzane, nawigacja RTL i wizualne przeciąganie.
Techniczne treści pozostają LTR:
- kod i składnia;
- ścieżki;
- ID modeli;
- polecenia i logi;
- wyjście/metadane; oraz
- bloki kodu.
Nazwy zadań, prompty, błędy, pliki i polecenia używają automatycznego kierunku.
Rozwiązywanie problemów
Środowisko niedostępne przy npx
npx libre-webui nie instaluje Docker. Uruchom docker info jako ten sam użytkownik. Zainstaluj/uruchom lub napraw prawa, przeładuj Work.
Sprawdź też zdrowe Ollama lub aktywną wtyczkę z modelem i poświadczeniem administratora.
Niedostępne w Docker lub Kubernetes
Compose nie powinien tego zgłaszać: image ma CLI, plik mountuje socket. Panel wskazuje brak CLI, mountu lub grupy. Dla grupy ustaw DOCKER_GID i odtwórz. Zobacz Uruchamianie Work, gdy Libre WebUI działa w Docker.
Na Kubernetes --set work.enabled=true; Libre zgłasza kubernetes, bada API i używa Pod/PVC. Nie montuj socketu node; zobacz Kubernetes.
Brak zgodnych modeli
Ollama musi deklarować tools. Wtyczka:
- typ completion/chat;
- aktywna;
- model w mapie;
- klucz administratora; oraz
- obsługa wywołań.
Brak fallbacku do innego dostawcy.
Instalacja pakietu lub zdalny Git nie działa
Sprawdź sieć wybranej polityki, potem DNS, proxy, firewall/NetworkPolicy, rejestr, certyfikat, runtime, upstream i obecność polecenia.
Karta Git jest lokalna. Terminal/model tylko przy zamierzonym dostępie i poświadczeniach. Nie wklejaj długiego tokenu.
Uruchomienie zatrzymuje limit agenta
Wyczerpano rundy/narzędzia. Work prosi o końcowe przekazanie; sprawdź pracę i kroki. Wymaga danych jest końcowe bez twierdzenia o ukończeniu. Kontynuuj lub świadomie zwiększ WORK_MAX_AGENT_ROUNDS przy zasobach i kosztach.
HTTP 429 przy starcie
Osiągnięto limit runtime lub zadań. Poczekaj, usuń stare lub zwiększ właściwe WORK_MAX_* przy zasobach.
Podgląd nie jest gotowy
Polecenie musi działać, wiązać 0.0.0.0 i słuchać WORK_PREVIEW_PORT w 15 sekund. Puste wykrywa dev w package.json lub index.html, także jedną zagnieżdżoną. Przy wielu/braku podaj polecenie. Start w /workspace, użyj cd <app-directory> && ....
Podgląd działa na serwerze, nie zdalnie
Sprawdź build z podpisanym proxy i restart. Dla hot reload zachowaj WebSocket /api/work/previews/. Port Docker zostaje loopback bez firewalla.
Pliki zostały, podgląd zatrzymany
Oczekiwane po anulowaniu, restarcie, stopie lub błędzie gotowości. Proces ulotny, wolumin trwały. Uruchom ponownie.
Pliku nie można otworzyć/zapisać
API przyjmuje UTF-8 do 2 MB. Przy konflikcie przeładuj, by nie nadpisać modelu/przeglądarki.
Składnia przechodzi w tekst ponad 8,000 znaków/400 linii; formatowanie ma 100,000/4,000 i tylko wymienione rodziny.
Work odzyskuje piaskownice
Nie dowiedziono zatrzymania. Work fail-closed próbuje co 10 sekund. Przywróć daemon/API i sprawdź log. Nie usuwaj wierszy przed uzgodnieniem zasobów.
Usunięcie zadania nie działa
Sprawdź runtime. Konflikt bez ai.libre-webui.task jest odrzucany. Ostrożnie rozwiąż nazwę/własność i ponów.
Podsumowanie bezpieczeństwa
Przed włączeniem:
- Domyślnie admin; otwarcie wszystkim czyni każde konto operatorem. Foldery hosta zawsze admin.
- Zaplecze kontroluje daemon lub namespace.
- Kontenery to nie VM.
- Bez polityki offline jest egress; cele są obowiązkiem operatora.
- Woluminy bez własnego quota.
- Git lokalny, bez zdalnych poświadczeń.
- Firewall, izolacja, egress i quota pozostają po stronie operatora.
- Zdalny dostawca dostaje wyniki i może kosztować wiele wywołań.
- Porty podglądu są loopback przez podpisane odwoływalne URL.
- Compose daje Docker, Kubernetes/Helm Pod/PVC przy
work.enabled=true. - Pełna kopia wymaga bazy i woluminów.