Work: không gian làm việc biệt lập
Work là giao diện agent lập trình tích hợp của Libre WebUI. Mỗi task kết hợp hội thoại bền vững, route provider rõ ràng và filesystem /workspace riêng. Model có thể xem, sửa file, chạy command trong Docker container hoặc Kubernetes Pod của task và khởi động preview.
Work được triển khai native, không dùng Libre Claw hay daemon riêng.
Mọi API yêu cầu account đã xác thực và có quyền. Mặc định chỉ administrator; có thể mở cho mọi user active. Folder host luôn chỉ dành cho administrator vì mount path server. Work chủ ý có thể chạy shell command tùy ý trong sandbox. Task dùng egress trừ khi policy được chọn tắt mạng. Hãy coi mọi user được phép là operator runtime đáng tin cậy, không chỉ là user chat.
Khả năng chính của bản phát hành
- Mode Work và Chat riêng với selector hiển thị.
- Task trong danh sách bên chính, vị trí ổn định và xóa trực tiếp.
- Identity sandbox riêng cùng Docker volume bền vững hoặc Kubernetes PVC cho mỗi task; có thể dừng/tạo lại environment mà không mất file.
- Hội thoại, trạng thái run, hoạt động tool, lựa chọn model và owner task được lưu trong database Libre WebUI.
- Stream đã xác thực cho text assistant, reasoning provider công bố, tool call/result, usage, skill và thay đổi state.
- Workflow skill thuộc server dạy model inspect, edit, test và mở preview mà không tạo file điều khiển trong project.
- Model Ollama local có tool, Ollama Cloud và plugin provider đã cấu hình.
- Split Conversation/Workspace thích ứng, resize bằng mouse/keyboard trên desktop và switch trên màn hình nhỏ.
- View Files, Activity, Git, Terminal, Preview, Screen tích hợp; Screen hiển thị desktop Work Computer.
- Syntax highlighting sáng/tối, formatting trong browser, phát hiện save conflict và draft tạm.
- Data disclosure theo user có thể đóng khi chọn provider remote.
- Dịch Work đầy đủ 25 ngôn ngữ, gồm layout RTL Arab native nhưng giữ LTR cho code, path, model ID và output.
Đơn vị bền vững là workspace task, không phải container luôn chạy. Libre khởi động, dừng và khi cần tạo lại container trong khi giữ named volume.
Kiến trúc
Libre WebUI—không phải model hay browser—chọn tên sandbox/workspace, image, volume mount, user, limit, network mode và preview port. Model chỉ nhận các tool sau:
list_filesread_filewrite_filedelete_filemove_filesearch_filesrun_commandstart_previewstop_preview
delete_file và move_file không thể ra khỏi workspace, không theo symlink, cần recursive flag rõ cho directory và không ghi đè destination. Vì dùng file helper, tool vẫn hoạt động trong preview khi run_command bị chặn.
Request model do server thực hiện, không phải container Work, nên không phụ thuộc network policy của container.
Yêu cầu
- Docker: daemon đã cài và truy cập được, process server có quyền gọi
dockerhoặc program trongWORK_DOCKER_COMMAND. - Kubernetes: API credential Role/RoleBinding giới hạn namespace, namespace sandbox và NetworkPolicies do Helm tạo khi
work.enabled=true.
Ngoài ra:
- Model có tool qua Ollama/Ollama Cloud khỏe hoặc plugin completion/chat active với model chính xác và credential administrator.
- Đủ memory cho image environment, project và dependency local.
- Account đã xác thực có quyền Work; mặc định chỉ administrator nhưng có thể mở cho mọi user active.
Libre kiểm tra capability Ollama và từ chối model không có tools. Model plugin phải hỗ trợ protocol tool-calling của provider. Lỗi kết thúc run mà không fallback im lặng.
Chạy local
Cách đơn giản nhất trên một máy:
docker info
npx libre-webui@latest
Mở http://localhost:8080, login administrator, chọn Work và model tương thích rồi mô tả task.
Nếu Docker thiếu hoặc không truy cập được, Work hiển thị Runtime unavailable cùng lý do và tắt start. Command không bao giờ chạy trực tiếp trên host.
Lần dùng đầu, image environment được kiểm tra và tự download nếu thiếu, nên có thể lâu hơn.
Giao diện Work
Tạo và mở lại
Chọn Work, nhập chỉ dẫn, chọn model rồi nhấn Run. Message đầu tạo task, run đầu, route provider và workspace bền vững.
Task nằm trong sidebar chính. Mở lại khôi phục hội thoại gần đây, tab Files, provider/model hiện tại và workspace. Message cũ load theo trang. Có thể rename từ title và delete qua menu/sidebar.
Chỉ một run active mỗi task; chỉ dẫn tiếp theo dùng cùng hội thoại và filesystem.
Composer hỗ trợ đọc chính tả: nút microphone dùng speech API của browser hoặc model nhận dạng giọng nói đã cấu hình và thêm transcript vào text. File được tạo/di chuyển hiện thành badge có thể click dưới action tool; click mở editor và chuyển sang workspace trên màn hình hẹp. Chỉ tool mutation tạo badge, nên hai mươi read và một write chỉ hiện một artifact.
Thuê làm agent
Nếu có persona, Hire as agent biến task thành agent có tên bền vững. Persona tồn tại giữa các run; tên và system prompt đứng trước prompt Work nhưng contract sandbox luôn ưu tiên. Sidebar đặt agent trong nhóm Agents phía trên task một lần, với avatar, activity và state. Khi sidebar thu gọn, chỉ những avatar agent đã ghim còn lại trên thanh rail; task Work một lần trở lại khi mở rộng sidebar.
Dòng state có hai tầng. Sau run agent, request model rẻ không tool hỏi status khoảng 8 từ (“Hộp thư trống. 2 câu trả lời sẵn sàng.”); response giới hạn một dòng 90 ký tự. Nếu error/timeout, dùng dòng đầu của answer cuối. Task một lần và run lỗi chỉ dùng fallback deterministic này; WORK_STATUS_BLURB_MODEL=0 tắt request. Mở task tăng marker viewed monotonic đồng bộ giữa device; dấu chấm báo terminal run mới hơn.
Agent báo công việc qua notification: work-run-finished, work-run-attention, work-takeover. Banner Screen chỉ hiện ở tab mở; push notification đến user ở nơi khác. Mỗi link đi thẳng tới agent.
Dùng persona riêng hoặc shared; view shared không lộ memory owner. Nếu persona bị xóa, agent tiếp tục không có nó và ghi warning. API nhận personaId, isAgent; task có persona tự thành agent.
Tab Agent
Tab bổ sung đầu là Agent:
- Identity: avatar, tên, indicator activity và dòng state cuối.
- Screen: nếu có Work Computer, thumbnail live read-only. Đây là connection đầy đủ được tính vào limit; click mở full screen với takeover, teaching và audio.
- Routines: automation gắn task. Mỗi trigger chạy trong cùng workspace/hội thoại với model/environment của agent, không phải task mới, nên morning report tích lũy một nơi. Dòng hiện schedule và pause toggle; form + Routine đã gắn agent. Trigger khi agent bận kết thúc
work-task-busymà không vào queue. - Auto Review: công tắc approval của agent và các rule Always-allow agent đã thu thập (xóa một rule để đóng lại phạm vi đó). Khi policy của task bắt buộc review, công tắc bị khóa ở trạng thái bật.
- Taught skills: routine đã demo với enable toggle.
Công cụ kết nối (máy chủ MCP và OpenAPI)
Agent Work gọi được cùng máy chủ công cụ đã cấu hình cho chat — MCP hoặc OpenAPI, do administrator đăng ký ở Cài đặt → Công cụ. Công cụ hiện với agent theo tên có namespace (server__tool) và lệnh gọi chạy từ backend Libre WebUI qua gateway công cụ đã gia cố (egress chặn SSRF, credential theo user, giới hạn kích thước và thời gian), không bao giờ từ trong sandbox.
Danh sách chào ra trung thực với những gì một run tự chủ dùng được thật:
- Task offline không được chào công cụ nào: dù egress đi qua backend, task không có network vẫn là offline — cùng lý do với
web_search. - Máy chủ đòi credential cá nhân mà user chưa lưu bị lọc bỏ ngay khi chào công cụ, vì run tự chủ không thể dừng lại để hỏi. Thêm credential ở Cài đặt → Công cụ thì run sau sẽ chào máy chủ đó.
- Chế độ truy cập công cụ (chỉ administrator hoặc mọi user) và mức hiển thị theo máy chủ áp dụng đúng như trong chat; ràng buộc máy chủ công cụ của persona thu hẹp danh sách mà agent thuê từ persona đó nhìn thấy.
- Khi approval đang bật, công cụ kết nối được máy chủ xếp là có tác dụng phụ sẽ dừng chờ quyết định của bạn như mọi hành động bị chặn khác; công cụ chỉ đọc chạy thẳng không hỏi.
Ủy quyền giữa các agent (@-mention)
Agent đã thuê chuyển việc cho nhau được. Gõ @ trong ô soạn Work để nhắc một agent khác của bạn; agent hiện tại thấy danh sách đồng nghiệp (tên và dòng state) trong instruction và ủy quyền yêu cầu phù hợp bằng công cụ message_agent. Ủy quyền là phối hợp bằng message, cố ý không dùng máy chung: mỗi agent giữ workspace và sandbox cô lập riêng, agent nhận không thấy hội thoại đã ủy quyền — yêu cầu phải tự mang đủ context.
Ủy quyền là bất đồng bộ. Công cụ trả về ngay, agent nhận chạy trong task riêng (hội thoại của nó hiện yêu cầu gắn nhãn Delegated by người gửi), và khi xong — hoàn tất, cần input, lỗi hay bị hủy — câu trả lời cuối được đưa lại vào hội thoại của agent ủy quyền dưới dạng message gắn nhãn Report from agent đó. Nếu agent ủy quyền còn chạy, báo cáo đến model ở round sau; nếu đang rảnh, báo cáo chỉ nằm chờ trong hội thoại — báo cáo không bao giờ tự khởi động run, nên hai agent không thể chuyền qua lại mãi. Run được ủy quyền không ủy quyền tiếp, agent đích đang bận thì lệnh thất bại thẳng thay vì vào queue, và khi approval đang bật thì message_agent dừng chờ review như mọi hành động có tác dụng phụ khác (rule Always-allow chỉ áp cho đúng agent đích đó).
Approval hành động (Auto Review)
Hành động có tác dụng phụ có thể dừng chờ quyết định của bạn trước khi chạy. Khi approval đang bật cho một task — policy Work đặt Require approval for side-effecting actions, hoặc công tắc Auto Review của agent đang bật — run dừng trước khi thực thi run_command, computer_act, delete_file, move_file hoặc message_agent và hiện thẻ quyết định trong hội thoại: Allow once, Always allow hoặc Deny.
- Allow once chạy đúng lệnh gọi này và lần sau hỏi lại.
- Always allow chạy lệnh gọi và lưu một rule trên task: theo cả công cụ với hành động file và computer, theo chương trình của lệnh (token đầu tiên) với
run_command— duyệtnpm run buildlà duyệt trước các lệnhnpmsau này, không phải cả shell — và theo đúng một agent đích vớimessage_agent. Rule được liệt kê ở mục Auto Review trong tab Agent và xóa được tại đó. - Deny từ chối lệnh gọi. Model được báo là user đã từ chối hành động và không được thử lại y nguyên; run tiếp tục với câu trả lời đó.
Approval đang chờ cũng phát notification (trong app, và web push nếu bật), vì run có thể đã chạy không người trông nhiều phút khi chạm cổng chặn. Nếu không ai quyết trong năm phút, yêu cầu hết hạn, hành động không được thực thi, và run kết thúc ở Cần input với handoff bình thường thay vì chờ hết budget.
Approval chặn hành động chứ không chặn hiển thị: write_file và các công cụ chỉ đọc vẫn không bị chặn, và mọi quyết định đều vào log kiểm toán bảo mật.
State task
| Giao diện | State server | Màu |
|---|---|---|
| Idle | idle | rgb(255, 255, 255) |
| Đang xử lý | preparing hoặc running | rgb(48, 121, 255) |
| Sẵn sàng | completed | rgb(76, 212, 117) |
| Cần input | needs_input hoặc cancelled | rgb(255, 204, 0) |
| Lỗi | failed | rgb(255, 61, 129) |
Dừng run active chuyển thành Cần input và giữ file. Hết budget round/tool cũng kết thúc vậy sau handoff cuối không tool; việc chưa xong không được đánh dấu Sẵn sàng.
Run active không chặn hội thoại: message tham gia ngay và đến model ở round sau, cho phép hướng dẫn, sửa và thêm context không cần stop.
Resize
Ở chiều rộng desktop xl, hội thoại/workspace tách bằng divider kéo được:
- Chiều rộng hội thoại mặc định 45%.
- Phạm vi ưa thích 30%–70%, tính minimum content width.
- Ratio đã lưu thuộc user login trong browser này.
- Phím mũi tên dịch 2%, với Shift là 10%.
- Home/End chọn minimum/maximum.
- Enter hoặc double-click reset split.
Control theo hướng viết. Với tiếng Arab, hội thoại bên phải, workspace bên trái; pointer/arrow theo hướng visual.
Trên màn hình nhỏ, dùng switch trong header task.
Files
Tab Files liệt kê trực tiếp /workspace, chỉ mở file text UTF-8 hợp lệ và save thay đổi vào volume task. Chuỗi byte invalid bị từ chối, không thay thế gây mất data.
Editor cung cấp:
- syntax highlighting sáng/tối cho language phổ biến;
- save bằng
Cmd/Ctrl+S; - format bằng
Shift+Alt+F; - phát hiện save conflict lạc quan;
- draft theo task/path trong session memory; và
- warning khi rời với thay đổi chưa save.
Live highlighting dừng trên 8.000 ký tự/400 dòng. Formatting đến 100.000 ký tự/4.000 dòng cho JavaScript/JSX, TypeScript/TSX, JSON variant, CSS/SCSS/Less, HTML, Markdown/MDX và YAML.
Khi model sửa file mở, tab hiện diff đỏ/xanh từ đầu round và thu gọn vùng dài không đổi. Toggle chuyển diff/editor; counter +added −removed tóm tắt. Baseline là content browser thấy trước round; file mới mở sau đó không có diff.
Draft chỉ để tiện, không phải backup; bị xóa sau save, delete task hoặc kết thúc session.
Activity
Tab hiện tool call/result, thao tác file, command output và error. Metadata mở rộng được. Output vẫn LTR trong UI RTL.
Run active mở stream SSE đã xác thực với event:
snapshot,run_state;reasoning_deltanếu provider công bố reasoning;assistant_delta;tool_call,tool_result;usage;skill_loaded; vàerror,done.
Reasoning phụ thuộc model/provider; Libre chỉ hiện content API trả về và không thể tái tạo chain-of-thought ẩn. Một số model không gửi. Text và action tool có thể stream độc lập.
Output cố ý bounded; kết quả bị cắt không chứng minh không còn phần sau. Yêu cầu model kiểm tra kết quả hẹp hơn.
Git
Tab Git thực hiện thao tác local trong /workspace:
- init repository với branch
main; - hiện status porcelain, ahead/behind và tối đa 20 commit;
- hiện diff bounded;
- stage tối đa 200 path;
- tạo commit bằng tên/email administrator hoặc địa chỉ no-reply local;
- tạo branch sau commit đầu; và
- switch sang branch có sẵn nếu working tree sạch.
Bề mặt chỉ local: không clone, fetch, pull, push, quản lý repository remote, command tùy ý, token, SSH key hay pull request. Dùng broker credential tin cậy riêng, tốt nhất GitHub App hoặc installation token giới hạn một repository/action. Không lưu credential dài hạn trong workspace, environment container hoặc config repository.
Git read có khi task idle/active. Write bị từ chối khi run model, terminal hoặc preview sở hữu container; switch branch cần tree sạch. Điều này ngăn race.
Command UI dùng array argument cố định và chạy dưới 1000:1000; input không được shell evaluate. Environment tắt config system/global, prompt, hook, credential helper, signing, submodule, external diff, textconv và network protocol. Repository bị từ chối nếu work tree không phải /workspace hoặc Git dir ra ngoài. Write cũng bị chặn nếu có filter clean/smudge/process executable.
Điều này bảo vệ Git API Libre WebUI. Administrator qua terminal và model qua run_command vẫn chạy được Git command thường; command tùy ý bị giới hạn bởi sandbox và boundary deployment.
Workflow skill tích hợp
Mỗi run nhận reference thuộc server về boundary /workspace bền vững, root read-only, process tạm và /tmp, network, limit, lifecycle preview. Skill yêu cầu:
- kiểm tra instruction, manifest, lockfile, script và state repository trước edit;
- giữ công việc không liên quan và batch read độc lập;
- tiếp tục implementation, không dừng ở plan;
- kiểm tra targeted trước kiểm tra rộng;
- diagnosis error, không retry mù; và
- verify app trước khi start preview làm process dài cuối.
Reference chỉ có trong context model. Libre không tạo AGENTS.md, directory skill hay file control khác. Instruction project không thể override security boundary.
Terminal
Shell tương tác nối vào cùng sandbox để administrator kiểm tra state, build và debug project.
Cùng policy được áp dụng: 1000:1000 không privilege, directory /workspace và container hardened không capability. Terminal không cho nhiều privilege hơn run_command; chỉ cung cấp giao diện người dùng tới cùng boundary.
- Xác thực — header Authorization đổi qua HTTP thành ticket dùng một lần, ngắn hạn, gắn protocol và task chính xác. Chỉ ticket và task ID có trong
/ws/work-terminal. Account, access, task và owner được kiểm tra lại trước mỗi input; revocation đóng session và nhả lease. - Kiểm tra origin — nếu đặt
CORS_ORIGINhoặcBASE_URL, origin browser phải khớp. Đặt ít nhất một cho deployment remote. Client Electron/non-browser có thể không gửi Origin nhưng vẫn cần ticket và check; quản lý bằng TLS, firewall và proxy. - Admission — terminal lấy runtime lease và được tính trong
WORK_MAX_ACTIVE_RUNTIMES_*. - Tuổi container — terminal kết nối giữ container khỏi idle stop.
- Concurrency —
WORK_TERMINAL_MAX_SESSIONS_PER_TASKmặc định 2. - Idle timeout —
WORK_TERMINAL_IDLE_TIMEOUT_MSmặc định 15 phút. - Run active — terminal chờ model turn kết thúc.
TTY cần stream hai chiều được capture nên terminal truy cập Docker Engine API trực tiếp. Thứ tự: WORK_DOCKER_SOCKET, rồi DOCKER_HOST—socket unix:// hoặc HTTP thường tcp:// qua proxy với tunnel Connection: Upgrade—sau đó /var/run/docker.sock. ssh:// hoặc tcp:// với DOCKER_TLS_VERIFY không được hỗ trợ và làm terminal unavailable kèm giải thích, không ảnh hưởng Work khác. Kubernetes dùng TTY WebSocket của exec API subresource, gồm resize, không cần Docker.
Session tương tác không được record và command không hiện trong Activity.
Preview
Preview start, stop, embed và mở app. Field command rỗng phát hiện:
- script
devtrong rootpackage.jsonvới host/port cần thiết; - root
index.htmldo static server tích hợp phục vụ; hoặc - một app trong directory nested.
App root được ưu tiên. Nhiều app nested tương đương hoặc thiếu entry point tạo error rõ, không phải npm command ngẫu nhiên. Với project khác, nhập command trước Start preview; bắt đầu tại /workspace, ví dụ cd apps/web && npm run dev -- --host 0.0.0.0 --port 4173. Process phải listen trên 0.0.0.0 và WORK_PREVIEW_PORT, ready trong 15 giây.
Model có thể dùng start_preview, cách duy nhất được hỗ trợ để giữ process dài. run_command dọn child process background khi hoàn tất.
Screen (Work Computer)
Demo đầy đủ: run thật không edit (30x rồi real time), agent tự browse NASA, chọn ảnh, build và test gallery Three.js từ một prompt.
Policy Work Computer thêm tab Screen: cửa sổ live của desktop ảo trong cùng sandbox, với window manager, panel và Chromium 1280×800. Bạn có thể quan sát agent, takeover mouse/keyboard, nghe audio máy tính và dạy action bằng demo. Mở tab start session đồ họa on-demand (không gì chạy trước observer) và nối view VNC qua WebSocket.
Administrator dùng Enable một click: Libre tạo image đồ họa tích hợp trên Docker daemon của deployment (lần đầu vài phút) và policy sẵn mà không cần docker build thủ công. Sau proxy lọc, build endpoint cố ý đóng; pull image ghcr.io/libre-webui/libre-work-computer tag libre-work-computer:latest trên host hoặc build từ deploy/work-computer/, rồi nút chỉ tạo policy. Task cần network vì Screen truy cập qua loopback port như preview.
VNC server trong container listen localhost và dùng hai password mỗi session: mỗi observer được phép nhận password view-only, chỉ control-lease owner nhận password đầy đủ. Server bỏ input khác. WebSocket bridge là surface duy nhất truy cập được, chỉ publish trên loopback host. Mỗi observer authenticate bằng ticket session/task dùng một lần như terminal; Work access được check mỗi connection và revocation ngắt Screen ngay. Tối đa bốn observer; viewing tính là activity task.
Viewing không cạnh tranh execution: mở trong run nối cùng sandbox, Screen quan sát không block run sau và session tồn tại sau completion kể cả deployment team với worker ngoài. Browser profile lưu ở /workspace/.browser-profile nên login sống qua container restart.
Control agent dùng hai tool. computer_observe trả full screenshot, pointer position, active window, current browser URL, focus trang/UI browser, tóm tắt element focused và hash screenshot. Semantic signal đến từ DevTools trên loopback container và không có ở image cũ. computer_act chạy batch tối đa 24 action—move, click, double/right click, type, key combo, scroll, wait—rồi trả screenshot sau khi ổn định.
Guard ở ba nơi: action type/key có thể khai báo focus mong đợi và fail safe nếu field không focused để text không vào address bar; batch dừng nếu window, title hoặc focus đổi vì coordinate còn lại stale; batch có thể khai báo title, URL hoặc region change mong đợi và environment verify bằng deadline adaptive—waiting không phải success.
Sau batch, Screen được poll đến ổn định thay vì delay cố định. Kết quả có evidence: click báo pixel gần thay đổi, scroll_until scroll đến text/edge và báo visibility, mỗi observation so với trước và no-change được nói rõ. subgoal một dòng lưu làm checkpoint và lặp khi recovery. Ba action giống trên Screen không đổi gây warning; lặp lại dừng run với yêu cầu input. Wait chưa confirm liên tiếp cần observation mới. Telemetry round, delay, screenshot, guard và verdict được log cùng tool/outcome.
Screenshot gửi như image thật trên mọi route—Ollama, Anthropic, Gemini và Chat/Responses tương thích OpenAI—nên model vision tốt hơn cho control. Nếu provider từ chối image, run không fail: screenshot bị bỏ cho phần còn lại, model chuyển sang observation text và log giải thích. Verification yếu hơn. Chỉ screenshot gần đây trong context; log bền vững chỉ lưu text, không lưu byte image.
Content blocking tích hợp browser gồm uBlock Origin Lite cho quảng cáo/tracker (version pinned và checksum verify khi build; filter mode do policy quản lý) và tự đóng cookie-consent banner. Quảng cáo không tốn screenshot, token hay click. Script quảng cáo biết được thay bằng stub local an toàn. Agent bị cấm nhập credential hoặc vượt CAPTCHA/2FA; agent báo blocker. Với task không tin cậy, kết hợp policy đồ họa với DNS filtering.
Audio mặc định tắt vì browser cần click. Nút speaker stream audio máy tính real time. PulseAudio phát vào null sink; monitor mang PCM raw qua WebSocket đã xác thực thứ hai trên loopback với ticket, access recheck và observer limit như nhau. Cần image mới từ deploy/work-computer/.
Take over control cho mouse/keyboard để login, CAPTCHA hoặc bước chỉ người; Done trả Screen. Session VNC dùng password full/view được tạo và không log; password full chỉ cho lease owner. Lease hết sau hai phút, được UI mở gia hạn và không bị giành từ user khác.
Policy Allow screen takeover có thể cấm control hoàn toàn: nút takeover/teaching ẩn, endpoint từ chối, request_takeover báo unavailable; viewing vẫn còn. Khi người control, computer_observe/computer_act bị block để agent không can thiệp hay capture input. request_takeover hiện banner lý do và chờ trả. Credential đi từ keyboard thẳng đến trang, không qua model/log. Image cũ chỉ hỗ trợ viewing.
Mode Teach task ghi demo: người control Screen với indicator thấy được và action lưu dạng coordinate. Mỗi click còn bind vào tag read-only, ID, label thấy được và current URL, nên step đặt tên target, ví dụ “Click button#submit (Place order)”; coordinate là hint.
Save tạo script deterministic không model: keystroke gộp thành string, click khác drag với threshold 8 pixel, pause thành wait; text khớp secret lexicon hoặc credential pattern (8+ ký tự từ ba class) bị redact và thay request_takeover. Routine ngôn ngữ tự nhiên dùng target đã bind rồi coordinate và reinterpret qua computer_observe. Routine có condition, input, step, verification, scope được phép từ host thật đã ghé (phải stop và hỏi trước khi ra), approval boundary và stop khi fail.
Script lưu như skill thường prefix taught- với versioning, edit, sharing. Run Work Computer load/list taught skill active của owner; replay là run thường với routine phù hợp. Sau run, badge thêm đánh giá success/error có ngày vào Track record bằng một click (mới nhất trên, số lượng bounded, mỗi record là version thường). Không nhập password thật khi record: chỉ demo flow đến login, save rồi dùng request_takeover khi replay.
Provider, routing và data disclosure
Route được hỗ trợ
| Route | Kiểm tra và hành vi |
|---|---|
| Ollama local | Ollama khỏe; model chính xác khai báo tool support. |
| Ollama Cloud | Route rõ qua Ollama; cloud suffix hiển thị disclosure. |
| Plugin completion/chat | Active, có model chính xác và credential administrator hiện tại. |
| Plugin Anthropic | Dùng adapter message/tool Anthropic cho Work. |
| Plugin Gemini | Dùng adapter content/function-call Gemini cho Work. |
| Tương thích khác | Dùng form OpenAI cho message, tool và tool choice. |
Loại provider và plugin ID được lưu trên task và mỗi run. Tên model một mình không chọn route; plugin cùng tên không chiếm task có sẵn.
Dữ liệu provider nhận
- system prompt Work;
- workflow skill và limit environment hiện tại;
- 30 message cuối của user/assistant, tối đa 256 KB;
- tool definition;
- tool-call history; và
- result gồm list, file content, search, output và error.
Volume không được upload toàn bộ, nhưng content tool trả về trở thành phần hội thoại và gửi provider. Kiểm tra retention, training, pricing và điều khoản trước công việc nhạy cảm.
Credential ở server-side và không bao giờ mount vào container Work.
App mã hóa credential không nghĩa mã hóa toàn task. Hội thoại, result, output và metadata là content database thường; file là file volume/PVC thường. Áp dụng host control và disk encryption theo threat model.
Disclosure provider remote
Model plugin và tên Ollama chứa :cloud hoặc -cloud được coi remote. Khi chọn, notification có thể đóng giải thích data flow và nhiều paid call; preference lưu theo user.
Mọi route dùng WORK_MAX_AGENT_ROUNDS, mặc định 48 round; không có limit 12 riêng plugin. Tool budget là max(128, configured rounds × 8) call. Khi hết, Libre yêu cầu handoff cuối không tool về công việc, check, blocker và phần còn lại, rồi ghi Cần input, không phải exception hoặc completion giả. Tiếp tục dùng cùng workspace. Một run vẫn có thể tạo nhiều request trả phí.
Folder host (tùy chọn)
Docker thường dùng named volume nên model không thấy file thật. Task có thể bind vào directory host thật. Kubernetes từ chối directory này và dùng PVC.
WORK_HOST_WORKSPACES_ENABLED=true
WORK_HOST_WORKSPACE_ROOTS=/Users/you/Projects
WORK_HOST_WORKSPACE_ROOTS là danh sách root phân tách :; mặc định là home của user server. Folder workspace tùy chọn; giá trị rỗng giữ isolation.
Path phải là directory tuyệt đối tồn tại và vẫn trong root sau resolve symlink. .ssh, .gnupg, .aws, .config, .kube, .docker, .claude, .libre-webui và node_modules luôn bị từ chối. Path được phép được lưu và hiển thị.
Model đọc và sửa file thật; user không privilege, capability đã drop và limit không còn tách model khỏi directory. Để feature tắt trừ khi cần, đặt root hẹp và ưu tiên directory có version control.
Persistence và lifecycle
| State | Lưu trữ | Tuổi |
|---|---|---|
| Owner, title, provider, state | Database Libre | Đến khi task/user bị xóa |
| Run, error, message, activity | Database Libre | Đến khi task bị xóa |
| File | Docker volume hoặc K8s PVC | Qua cancel, stop preview, restart |
| Hệ thống root và file tạm | Container hoặc Pod | Ephemeral; có thể stop/recreate |
| Process preview | Sandbox đang chạy | Tạm; chỉ giữ nếu health verify |
| Draft chưa save | Session browser | Tiện ích tạm |
Server tạo task UUID và chỉ server đặt resource name. Label management/owner được check trước reuse/delete; resource của task khác bị từ chối.
Sandbox chuẩn bị on-demand. File helper dừng environment idle, command nhả khi xong và preview verified có thể giữ nó. Workspace bền vững được mount lại.
Administrator định nghĩa runtime policy có tên: image, limit memory/CPU/PID, size Kubernetes, idle timeout, network và toggle Work Computer (GUI + browser) cùng Allow screen takeover (cũng xác định teaching). Task dùng policy đã chọn; field rỗng inherit giá trị global và xóa policy trả lại ở lần recreate sau. Policy chỉ đổi resource/feature, không thể yếu hóa mode không privilege, root read-only, capability đã drop hoặc network isolation.
WORK_RUNTIME_IDLE_TIMEOUT_MS dừng sandbox và nhả slot nếu không có command, terminal hoặc request preview có chữ ký. Workspace được giữ và preview start lại. Mặc định 0 giữ environment đến khi stop rõ.
Khi server startup, run active đánh dấu failed và state preview được clear. Driver lấy container/Pod managed trong một query. Environment của task biết đang chạy bị stop, đã stop không đổi, orphan bị xóa. Owner xác định bằng label, không phải tên. Chỉ một instance Libre mỗi namespace/daemon. Nếu cleanup không chứng minh được, Work fail closed, retry mỗi 10 giây và block operation mutation.
Mạng
Không có policy có tên thì network active. Administrator có thể tạo policy mạng mặc định tắt và author chọn khi tạo task. Không có toggle mỗi task; đổi policy cần recreate environment.
Docker nối task có mạng vào bridge managed (libre-webui-work, WORK_NETWORK_NAME) với com.docker.network.bridge.enable_icc=false:
- sandbox không thể nối nhau; và
- mặc định không tới container deployment trên bridge chung, gồm database hoặc Ollama chưa publish.
Network cùng tên không label management bị từ chối.
Trên Kubernetes, Pod nhận network label. Helm tạo default-deny, ingress chỉ preview và internet egress cho Pod được phép, trừ work.networkPolicy.blockedEgressCidrs. Chỉ hiệu quả nếu CNI hỗ trợ; xem Kubernetes.
Egress được phép cho package, Git và API. Đây không phải egress firewall. Code có thể tới:
- service host Docker;
- LAN host;
- internet; và
- endpoint metadata infrastructure.
Công cụ policy egress
WORK_RUNTIME_DNS(Docker) — địa chỉ IPv4/IPv6 phân tách dấu phẩy, ép bằng--dns; resolver filter cung cấp list tên. Địa chỉ invalid bị từ chối/log nên không inject flag.- Firewall host hoặc upstream trên subnet ổn định của bridge managed.
WORK_NETWORK_NAMEcho network precreated với option riêng, management label và ICC tắt.
DNS không giới hạn IP trực tiếp; cần firewall để đảm bảo.
Không coi Work là bảo vệ exfiltration. Chỉ cho user tin cậy access. Với task tự trị, chọn policy offline có tên; không có biến môi trường global đổi mặc định.
Network không thêm credential: SSH key, cloud credential, browser profile, home host hoặc Docker socket không mount vào task. Code vẫn có thể gửi secret ghi trong /workspace.
Traffic sandbox tách request model; Ollama và plugin luôn được server gọi qua route rõ.
Boundary bảo mật sandbox
Docker container:
- chạy non-root dưới
1000:1000; - dùng
/workspacelàm working directory; - chỉ mount volume task đã chọn;
- dùng root read-only và
/tmpbounded; - drop mọi Linux capability;
no-new-privileges;- không privileged và dùng init process;
- áp dụng limit CPU, memory, process, time, output;
- khóa swap (
--memory-swap=--memory); - nối network managed không ICC hoặc không network; và
- chỉ publish preview port trên loopback đã đặt.
Mọi property được verify lại bằng docker inspect và hash trong ai.libre-webui.policy. Container policy cũ bị hủy và recreate sau update.
Kubernetes áp dụng tương đương: user không privilege, root read-only, seccomp RuntimeDefault, không privilege escalation, capability đã drop, resource tạm bounded, không ServiceAccount token và PVC tại /workspace. Label và fingerprint được verify.
Path validation từ chối path tuyệt đối, traversal, backslash, NUL và length quá mức. Helper resolve real path và từ chối escape qua symlink. Write dùng file tạm và atomic rename.
Các biện pháp giảm host exposure ngoài ý muốn nhưng không biến Work thành VM hoặc environment phân tích malware an toàn. Container dùng chung kernel host; vulnerability Docker, Kubernetes, runtime, image, dependency hoặc kernel có thể vượt boundary.
Docker volume không có quota độc lập. Project có thể dùng hết storage; theo dõi tăng trưởng và áp dụng host limit. Enforcement size PVC Kubernetes phụ thuộc storage provider.
Checklist hardening Docker
Trên Kubernetes, kiểm tra thêm RBAC namespace, bảo mật Pod, storage class và CNI NetworkPolicy enforcement theo hướng dẫn.
App đặt flag container, validate path và bảo vệ API, nhưng không thể cung cấp host firewall, storage quota hoặc mức privilege daemon. Đây là trách nhiệm operator.
1. Cô lập control Docker
Container chính cần control daemon; socket là credential control plane. Compromise app có thể dẫn đến compromise host.
docker-compose.socket-proxy.yml không đưa socket cho app. Proxy chỉ cho containers, images, volumes, networks, exec và info; block swarm, secrets, configs, build, commit và system. Libre dùng DOCKER_HOST=tcp://docker-socket-proxy:2375 không mount socket/group; CLI, terminal và diagnostics theo địa chỉ này. API surface nhỏ hơn nhưng blast radius còn: tạo container cho phép mount host path.
Boundary mạnh hơn là VM riêng không workload không liên quan; mạnh hơn nữa là daemon rootless riêng hoặc runtime host riêng. Trước rollout, verify file ownership, routing, cleanup và terminal. Mount socket thường read-only không làm API read-only.
2. Chặn host control từ sandbox
Tắt ICC không block service host. Kiểm tra bridge và subnet thật:
docker network inspect libre-webui-work \
--format 'id={{.Id}} subnets={{range .IPAM.Config}}{{.Subnet}} {{end}}'
ss -lntup
Firewall bền vững phải từ chối traffic bridge đến SSH, Docker API, database và admin port. Test rule bằng container một lần và download được phép rồi persist. DOCKER-USER control traffic forwarded; access host có thể cần rule INPUT.
3. Giới hạn target egress
Block cloud metadata, infrastructure private và LAN client nếu không cần. Kết hợp DNS/firewall. IP trực tiếp bypass DNS; HTTP proxy không đủ cho connection trực tiếp. Áp dụng policy ngoài container.
Tạo policy riêng không network, registry-only và egress mở. Policy xác định network attachment; rule ngoài xác định target được phép.
4. Storage quota thực
Limit CPU, memory và PID không giới hạn volume. Dùng XFS project quota, logical volume có quota hoặc volume/PVC driver enforce size. Docker local trên ext4 không có quota tin cậy chỉ từ size khai báo.
Theo dõi mọi volume ai.libre-webui.managed=true và Docker data root, alert trước khi đầy và test hành vi failure. UI hoặc du chỉ warning, không enforce limit giữa check.
5. Verify policy
Sau thay đổi, tạo task một lần và kiểm tra qua docker inspect: UID, root read-only, capability, no-new-privileges, memory, swap, CPU, PID, một task volume và network. Container chính chỉ có mount mong đợi; public ingress phải qua proxy/tunnel đã xác thực, không qua port Docker hoặc preview.
Bảo mật và reachability của preview
Docker publish preview động trên loopback server; Kubernetes dùng IP Pod. Model/browser không chọn origin tùy ý. Libre sign URL cho task/endpoint chính xác, verify process mỗi request và proxy HTTP/WebSocket qua /api/work/previews. Stop/restart revoke URL.
Response bỏ credential Libre và cookie upstream. HTML bị giới hạn bởi iframe sandbox/CSP cho script, form, modal và download không same-origin; bảo vệ cũng áp dụng tab riêng. Generated code vẫn không tin cậy và có thể gửi data workspace/browser. URL là secret ngắn hạn.
Browser load cùng public origin nên HTTPS remote hoạt động không mở port/IP Pod và không mixed content. Reverse proxy phải giữ WebSocket cho /api/work/previews/; Nginx tích hợp làm vậy.
App chính chỉ cho origin riêng và Turnstile trong frame. Preview bypass Helmet policy global để chuyển body và áp dụng sandbox hẹp hơn. Cross-origin embedder policy tắt vì development server hiếm có header cần.
Ma trận deployment
| Deployment | Run/file | Preview |
|---|---|---|
npx libre-webui local | Hỗ trợ nếu Docker đã cài/truy cập được. | Proxy có chữ ký trên origin app. |
| Run từ source local | Yêu cầu giống nhau. | Origin API development tại port 3001. |
| Electron | Có điều kiện: dùng backend ngoài không runtime Work riêng. | Proxy có chữ ký của backend đó. |
| Bare metal/VM remote | Chạy nếu host có Docker. | Reverse proxy HTTP/WebSocket. |
| Compose chuẩn | Mặc định hỗ trợ trên Docker Desktop: image có CLI, Compose mount socket và cổng Work đi qua host.docker.internal. Docker Engine thuần cần thêm một WORK_PREVIEW_BIND không công khai nhưng tới được. | Cùng public origin. |
| Kubernetes/Helm | --set work.enabled=true: Pod/PVC qua IP Pod cho run, file, command, Git, terminal, Screen/audio Work Computer, Role namespace và default-deny NetworkPolicies; không socket. Xem Kubernetes. | Proxy trong cluster đến IP Pod. |
Work khi Libre WebUI ở trong Docker
Mọi file Compose repository gồm Work: image có CLI và mount /var/run/docker.sock. Docker Desktop chạy được với mặc định định tuyến có sẵn. Docker Engine thuần cần đặt thêm WORK_PREVIEW_BIND thành một giao diện host không công khai nhưng các vùng chứa anh em tới được, như mô tả bên dưới.
Container task là sibling của container Libre WebUI, thấy trong docker ps và được quản lý cùng lifecycle.
Socket cho control host tương đương root. Work không chạy nếu thiếu; hệ quả rõ: mọi administrator Libre WebUI thực tế là administrator host Docker. Bảo mật, network, lifecycle, backup và access là trách nhiệm operator. Xóa dòng socket để tắt Work; feature khác không phụ thuộc.
Lựa chọn khác là docker-compose.socket-proxy.yml qua DOCKER_HOST; xem cô lập control.
Ba điều kiện:
- Docker CLI có. Image chính thức gồm nó; image custom cần
docker-clihoặcWORK_DOCKER_COMMAND. Nếu không:The "docker" CLI is not installed…. - Socket đã mount. Nếu không:
No Docker daemon is reachable…. - User thuộc group socket. Image chạy như
nodejsuid 1001; socket thường thuộcroothoặcdockernên Compose dùnggroup_add: ['${DOCKER_GID:-0}']. Mặc định hợp Docker Desktop; Linux cần ID riêng. Nếu không:The 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
Preview port giữ trên loopback host và truy cập qua proxy có chữ ký cùng origin cho HTTP/WebSocket. Hoạt động với HTTPS/tunnel, áp dụng sandbox và revoke URL cũ.
Trên Docker, địa chỉ publish/connect có thể khác. Giữ WORK_PREVIEW_BIND=127.0.0.1; đặt WORK_DOCKER_PUBLISHED_HOST thành địa chỉ host truy cập được (host.docker.internal trên Docker Desktop). Các profile Compose đi kèm đặt sẵn cả hai giá trị và ánh xạ tên host này. Bản triển khai Linux thuần phải ghi đè WORK_PREVIEW_BIND bằng gateway cầu nối Docker (hoặc một interface host nonpublic truy cập được khác); mapping một mình không làm loopback reachable. Đừng bao giờ bind các cổng tạm thời thô này vào 0.0.0.0.
Concurrency bounded: WORK_MAX_ACTIVE_RUNTIMES_PER_USER 2 và WORK_MAX_ACTIVE_RUNTIMES_GLOBAL 3. Response capability báo busy state. Chỉ tăng nếu đủ resource.
Với Kubernetes dùng work.enabled=true; chart tạo RBAC, namespace, policy và Pod/PVC theo hướng dẫn.
Cấu hình runtime
| Biến | Mặc định | Mục đích |
|---|---|---|
WORK_RUNTIME_BACKEND | docker | Backend sandbox: docker hoặc kubernetes |
WORK_RUNTIME_IMAGE | node:22.22-bookworm@sha256:2d178f2785b96dfbf62a416ca2e40f50e30150b4ff3320d706f0d96e90600eb3 | Image sandbox task |
WORK_DOCKER_COMMAND | docker | Docker CLI executable |
WORK_COMMAND_TIMEOUT_MS | 120000 | Command timeout mặc định |
WORK_MAX_OUTPUT_CHARS | 50000 | Output capture tối đa |
WORK_MAX_AGENT_ROUNDS | 48 | Round model/tool mỗi run |
WORK_MEMORY_LIMIT | 2g | Limit memory container |
WORK_CPU_LIMIT | 2 | Limit CPU container |
WORK_PIDS_LIMIT | 256 | Limit process container |
WORK_PREVIEW_PORT | 4173 | App port trong container |
WORK_PREVIEW_BIND | 127.0.0.1 | Interface publish host |
WORK_DOCKER_PUBLISHED_HOST | như WORK_PREVIEW_BIND | Host/IP cho port Work publish |
WORK_COMPUTER_SCREEN_PORT | 6080 | Port WebSocket bridge Screen |
WORK_COMPUTER_AUDIO_PORT | 6081 | Port WebSocket bridge audio |
WORK_RUN_LEASE_WAIT_MS | 60000 | Chờ owner runtime lease tạm |
WORK_MAX_ACTIVE_RUNTIMES_GLOBAL | 3 | Task container concurrent toàn instance |
WORK_MAX_ACTIVE_RUNTIMES_PER_USER | 2 | Task concurrent mỗi administrator |
WORK_MAX_TASKS_GLOBAL | 500 | Tối đa task bền vững instance |
WORK_MAX_TASKS_PER_USER | 100 | Tối đa task bền vững mỗi administrator |
WORK_NETWORK_NAME | libre-webui-work | Bridge managed cho sandbox có mạng |
WORK_RUNTIME_DNS | chưa đặt | IP resolver phân tách dấu phẩy |
WORK_DOCKER_SOCKET | DOCKER_HOST nếu unix:///tcp://, nếu không /var/run/docker.sock | Docker Engine endpoint cho terminal/diagnostics |
WORK_TERMINAL_MAX_SESSIONS_PER_TASK | 2 | Terminal browser concurrent mỗi task |
WORK_TERMINAL_IDLE_TIMEOUT_MS | 900000 | Terminal idle timeout |
WORK_RUNTIME_IDLE_TIMEOUT_MS | 0 (tắt) | Dừng sandbox idle, gồm preview |
WORK_K8S_NAMESPACE | libre-webui-work | Namespace Pod/PVC sandbox Kubernetes |
WORK_K8S_STORAGE_CLASS | mặc định cluster | StorageClass cho workspace PVC |
WORK_K8S_WORKSPACE_SIZE | 5Gi | Size PVC workspace mỗi task |
WORK_K8S_POD_READY_TIMEOUT_MS | 900000 | Chờ Pod sandbox Running |
WORK_K8S_POD_GONE_TIMEOUT_MS | 60000 | Chờ Pod đã xóa biến mất |
Trong production, dùng version image hoặc digest cố định, verified. Tag mutable có thể đổi CLI tool và security boundary mà Libre WebUI không đổi.
Run, preview, file helper, command và recreate sandbox dùng capacity accounting chung. Operation nested của task đã tính không tính lại. Vượt limit trả HTTP 429.
Limit protocol và UI cố định
| Mục | Limit |
|---|---|
| Message task/run mới | 65.536 ký tự và byte UTF-8 |
| Model ID lúc create/change | 500 ký tự và byte UTF-8 |
| ID provider plugin | 200 ký tự |
| Run active mỗi task | 1 |
| Text command | 20.000 ký tự |
| Timeout command tool | 1–600 giây |
| Preview readiness | 15 giây |
| Read/write file | 2.000.000 byte text UTF-8 |
| List directory trực tiếp | 1.000 mục đầu |
| Trang message | 200 message, 1.000.000 byte |
| Một message lưu | 100 KB |
| Context hội thoại model | 30 message cuối, 256 KB |
| Output tool lưu | Khoảng 20.000 source character và truncation marker |
| Live editor highlight | 8.000 ký tự/400 dòng |
| Browser formatting | 100.000 ký tự/4.000 dòng |
| Output state Git | 2.000.000 ký tự |
| Output diff Git | 600.000 ký tự |
| History Git | 20 commit local |
| Path trong một request stage | 200 |
| Commit message | 4.000 ký tự |
| Agent loop | 48 round mặc định qua WORK_MAX_AGENT_ROUNDS |
| Tool-call budget | max(128, configured rounds × 8) call |
File API dùng text UTF-8. Editor tích hợp không edit file binary; file trên 2 MB không mở qua Work API.
Tổng quan API
Mọi endpoint nằm dưới /api/work và cần xác thực cùng quyền Work hiện tại từ database. Work mặc định chỉ administrator; operation thường có thể mở cho user active. Chọn folder host và admin endpoint cho policy/access vẫn chỉ administrator.
| Phương thức | Path | Mục đích |
|---|---|---|
GET | /capabilities | Availability và limit environment/provider |
GET | /tasks | List task administrator hiện tại |
POST | /tasks | Tạo task và run async đầu |
GET | /tasks/:id | Load state và message mới |
GET | /tasks/:id/messages | Load message cũ |
PATCH | /tasks/:id | Rename hoặc đổi route model chính xác |
DELETE | /tasks/:id | Xóa task và workspace bền vững |
POST | /tasks/:id/runs | Start run sau |
POST | /tasks/:id/messages | Gửi message cho agent trong run |
GET | /tasks/:taskId/runs/:runId/events | Stream event SSE đã xác thực |
POST | /tasks/:id/cancel | Hủy run active |
GET | /tasks/:id/approvals | Approval đang chờ và state Auto Review của task |
PUT | /tasks/:id/approvals | Bật/tắt approval theo task |
POST | /tasks/:id/approvals/:approvalId | Quyết định approval đang chờ (cho một lần/luôn, từ chối) |
DELETE | /tasks/:id/approval-rules/:ruleId | Xóa rule Always-allow |
GET | /computer/setup | State setup Work Computer cho administrator |
POST | /computer/setup | Tạo image GUI và policy |
POST | /tasks/:id/computer/start | Start session Work Computer |
GET | /tasks/:id/computer/control | Controller hiện tại và request takeover |
POST | /tasks/:id/computer/control | Takeover hoặc gia hạn control |
DELETE | /tasks/:id/computer/control | Trả control cho agent |
POST | /tasks/:id/computer/teach | Lưu demo thành skill |
POST | /tasks/:id/computer/anchor | Resolve element dưới click |
POST | /computer/skills/:slug/trace | Thêm outcome vào skill |
GET | /tasks/:id/files | List directory workspace |
GET | /tasks/:id/file | Read file text |
PUT | /tasks/:id/file | Save file text |
GET | /tasks/:id/git | Read state/history Git hardened |
GET | /tasks/:id/git/diff | Read diff local bounded |
POST | /tasks/:id/git/init | Init Git local |
POST | /tasks/:id/git/stage | Stage path rõ |
POST | /tasks/:id/git/commit | Commit thay đổi staged |
POST | /tasks/:id/git/branches | Tạo branch local |
POST | /tasks/:id/git/switch | Switch branch sạch |
POST | /tasks/:id/preview/start | Start preview managed |
POST | /tasks/:id/preview/stop | Dừng preview managed |
Task ID luôn được check với owner đã xác thực. State account, role và access policy được đọc từ database mỗi request nên revocation vẫn áp dụng khi JWT có role claim stale.
Schema update task giữ field server networkEnabled cho compatibility nội bộ. Field không hiện thành control Work riêng. Khi create, chọn policy có tên với network state mặc định mong muốn; không dùng field raw làm API config bền vững.
Xóa, thay đổi account và backup
Xóa task
Xóa có chủ ý destructive:
- Server đánh dấu task đang decommission và block mutation mới.
- Run active bị hủy và sandbox dừng.
- Libre WebUI verify label ownership resource runtime.
- Container hoặc Pod cùng named volume/PVC bị xóa.
- Task cascade-delete khỏi database cùng run/message.
- Draft browser được clear khi thành công.
Nếu cleanup runtime lỗi, Libre WebUI giữ record và trả error để operator sửa Docker/Kubernetes rồi retry. Metadata không bị xóa im lặng để lại resource không theo dõi.
Dừng run/preview khác delete: execution dừng nhưng volume và hội thoại được giữ.
Downgrade administrator và xóa user
Khi downgrade, Libre WebUI lưu role revocation trước; mỗi request sau check quyền hiện tại. Server suspend task và thử stop run/sandbox. Cleanup error không khôi phục access và báo operator retry.
Khi xóa user khác, resource managed của họ bị xóa trước. Nếu cleanup lỗi, record user được giữ để không mất metadata ownership.
Backup task đầy đủ
Backup Work đầy đủ cần:
- database Libre WebUI với ownership, tên resource Docker/Kubernetes, routing, run, message và activity; và
- mọi Docker volume/Kubernetes PVC có label
ai.libre-webui.managed=truechứa file Work.
Container ephemeral và process preview không cần copy. Để copy nhất quán, dừng activity Work mới và server rồi dùng procedure snapshot storage.
Restore database và workspace tương ứng cùng nhau. Tạo mỗi volume/PVC với tên ghi chính xác; restore label ai.libre-webui.task=<task UUID> và ai.libre-webui.managed=true. Chỉ file thì mất label; chỉ database thì thiếu file; chỉ storage thì mất ownership và tên resource.
Nếu installation còn có credential provider mã hóa, theo procedure backup chính cho data directory và key.
Localization và RTL Arab
Work được dịch đầy đủ sang 25 ngôn ngữ: Anh, Arab, Bengali, Séc, Đan Mạch, Đức, Tây Ban Nha, Pháp, Hindi, Indonesia, Iceland, Ý, Nhật, Hàn, Malay, Hà Lan, Ba Lan, Bồ Đào Nha, Nga, Thụy Điển, Thái, Thổ Nhĩ Kỳ, Ukraina, Việt Nam và Trung Quốc.
Tiếng Arab đặt lang="ar" và dir="rtl" trước React render: sidebar/hội thoại sang phải, workspace sang trái, icon hướng mirror, tab/resize theo RTL.
Content kỹ thuật ảnh hưởng correctness vẫn LTR:
- code và highlighting;
- filesystem path;
- model ID;
- command và log preview;
- tool output và metadata; và
- content code block.
Title task, prompt ngôn ngữ tự nhiên, error, filename và preview command dùng hướng text tự động.
Khắc phục sự cố
Runtime unavailable với npx
npx libre-webui start server trên host nhưng không cài Docker. Chạy docker info dưới cùng OS user. Cài/start Docker hoặc sửa permission rồi reload Work. Verify Ollama khỏe hoặc plugin active với model và credential administrator hiện tại.
Runtime unavailable trong Docker hoặc Kubernetes
Compose repository không nên báo error này: image có CLI và file mount host socket. Panel nêu lý do—thiếu CLI, socket hoặc group. Với group, đặt DOCKER_GID và recreate container. Xem Work trong Docker.
Trên Kubernetes đặt --set work.enabled=true. Libre báo kubernetes, check API và launch Pod với PVC. Không mount runtime socket của node; xem Kubernetes.
Không có model tương thích Work
Với Ollama chọn model khai báo tools. Với plugin, kiểm tra:
- loại completion/chat;
- activation;
- model chính xác trong mapping;
- API key của administrator hiện tại; và
- tool-call support của model.
Work không bao giờ switch provider khác làm fallback.
Package không cài hoặc Git remote lỗi
Đảm bảo policy có tên được chọn cho network; không có toggle mỗi task. Sau đó kiểm tra DNS, proxy, firewall/NetworkPolicy, registry, certificate, runtime, service upstream và command. Tab Git chỉ local; dùng terminal/model cho Git remote chỉ với network/credential được phép rõ. Không paste token dài hạn.
Run dừng ở limit agent
Budget round/call có thể hết. Work yêu cầu handoff cuối không tool; review công việc và phần còn. Cần input là terminal state của run, không claim hoàn thành. Start run sau hoặc tăng WORK_MAX_AGENT_ROUNDS có chủ ý nếu resource/cost cho phép.
HTTP 429 trong run
Đã đạt limit runtime active hoặc task bền vững. Chờ operation khác, stop preview không cần, xóa task cũ hoặc tăng WORK_MAX_* liên quan nếu đủ resource.
Preview không ready
Command phải tiếp tục chạy, bind 0.0.0.0 và listen WORK_PREVIEW_PORT trong 15 giây. Field rỗng tìm dev trong package.json, index.html đơn giản hoặc một app nested. Nếu nhiều/không có, nhập command rõ. Bắt đầu ở /workspace; dùng cd <app-directory> && ... cho app nested.
Preview chạy trên server, không trên browser remote
Kiểm tra build proxy có chữ ký và restart URL cũ. Reverse proxy/tunnel phải cho WebSocket tại /api/work/previews/. Docker port publish phải giữ loopback và không cần mở firewall.
File còn, preview dừng
Đây là expected sau cancel, server restart, stop rõ hoặc readiness check lỗi. Process tạm, volume bền vững. Mở task và start preview lại.
File không mở hoặc save
API nhận text UTF-8 đến 2 MB. Nếu file đổi sau khi mở, reload trước save. Highlighting thành text thường trên 8.000 ký tự/400 dòng; formatting có limit 100.000 ký tự/4.000 dòng và chỉ loại documented.
Work báo recovery sandbox
Khi startup/shutdown, sandbox biết không chứng minh đã stop. Work fail closed và retry mỗi 10 giây. Sửa access API Docker/Kubernetes và check server log. Không xóa dòng database đến khi resource có label được reconcile.
Không thể xóa task
Đảm bảo runtime reachable. Resource conflict không label ai.libre-webui.task mong đợi bị cố ý từ chối. Sửa conflict cẩn thận rồi retry.
Tóm tắt bảo mật
- Work mặc định chỉ administrator; mở cho tất cả biến mọi account active thành operator sandbox. Folder host luôn admin.
- Server phải control Docker daemon hoặc Kubernetes namespace đã cấu hình.
- Container giảm access filesystem nhưng không phải VM.
- Task không policy offline có egress; giới hạn target là trách nhiệm operator.
- Volume Work không có disk quota độc lập.
- Git chỉ local; credential remote không mount hoặc API nhận.
- Firewall, daemon isolation, egress limit và quota thật do operator cung cấp.
- Provider remote nhận result được yêu cầu và có thể tạo nhiều paid call.
- Preview port giữ loopback và chỉ truy cập qua URL có chữ ký, revoke được.
- Compose chuẩn cung cấp Docker; Kubernetes/Helm cung cấp Pod/PVC với
work.enabled=true. - Backup đầy đủ cần database Libre WebUI và volume Work.