AnyBot/docs/plan-2026-11-computer-use.md

20 KiB
Raw Blame History

規劃:Computer-Use 順暢度優化 + Docker 登入資訊持久化(2026-11)

狀態:僅規劃,未動工。依據:對本 repo(src/cloudbox.rs、src/computer.rs、src/agent.rs、src/browser.rs、src/vnc.rs、box/*、deploy/、install.sh、BUGS.md)的程式碼研究,與 2026-11 的網路調查。 行號以 2026-11-06 的程式碼為準。


一、現況盤點(從程式碼看到的)

1. 三條 computer-use 路徑

目標 派發點 執行端 截圖來源
Box(Bot 的電腦,Docker 容器) src/agent.rs:1114 → cloudbox::computer_run 一步一條 docker exec 內跑 xdotool(src/cloudbox.rs:1223-1227) 容器內 ImageMagick import -window root(src/cloudbox.rs:1249)
地端本機(Mac / Linux 桌面) src/agent.rs:1122 → computer::run_by Mac:CGEvent+screencapture(src/computer.rs:915-931,1100-1137);Linux:X11 XTEST / wlr 協定 / Portal(src/x11.rs、src/wl.rs、src/portal.rs) screencapture / X11 GetImage / wlr-screencopy
帳號內其他電腦(手腳/螢幕) src/agent.rs:1106 → remote::run_on_device(src/remote.rs:1146-1169) 對端本機執行,JSON+base64 JPEG 原路回傳(src/remote.rs:645-647) 對端本機截圖

工具規格統一為 9 個 computer_use_*(src/computer.rs:15,250-282)+ hand_over_computer;瀏覽器走 CDP 的 18 個 browser_*(src/browser.rs:314-333)。編號截圖(set-of-mark)由 AT-SPI 控件編號(src/marks.rs、box/a11y)與網頁端注入 JS 編號(src/browser.rs:103-179)實作,方向與業界 2026 主流一致。

2. Box 每一步的延遲預算(估,待 Phase 0 量測確認)

階段 估計 來源
模型回合(TTFT+生成) 2000–8000 ms 瓶頸主因,非程式碼可消
docker exec 進程生成+RPC 50–200 ms 程式註解自估(src/cloudbox.rs:1225-1226),遠端 Docker host 更高
動作(xdotool) 10–100 ms 按鍵 delay 8ms~click repeat 80ms(src/cloudbox.rs:90-91)
固定 SETTLE 500 ms src/computer.rs:18、src/cloudbox.rs:1414
截圖 import(1280x800→JPEG) 100–400 ms ImageMagick 每次冷啟動,CPU 编码
AT-SPI 讀取 0–3000 ms(預算制) --budget 3(src/cloudbox.rs:1501),Chromium 常接近頂
編號繪製+回傳 10–50 ms src/computer.rs:284-325

結論:模型回合佔 6–8 成,環境端開銷約 0.7–3.5 秒/步。因此「減少模型回合數」(批次動作)比「壓榨環境延遲」的性價比更高;兩者都做,順序見後。

3. 已知痛點(BUGS.md + 程式註解)

  • 多 Bot 共用 box 無隔離、VNC 無密碼(B18,已修);修飾鍵卡死(B19,已修);取消指令留孤兒進程(B24,已修,用 ANYBOT_JOB 標記)。
  • box 15 分鐘休眠凍死 noVNC(N3,已修:大腦端不休眠 src/cloudbox.rs:753-776)。
  • 舊 box 兩套 Chromium profile 登入互不相通(box/browser:11-21,已合併為 anybot-profile symlink)。
  • mousemove --sync 會永久阻塞(src/cloudbox.rs:1305-1306);大截圖塞爆 pipe(src/cloudbox.rs:461-463)。
  • VNC 即時畫面走 docker exec python3 橋接容器內 5900(src/vnc.rs:27-39):橋接每字節多一层 exec 管線,人在遠端看 box 畫面卡。
  • keep_to_chosen 以關鍵字改寫 computer 參數可被注入(B26,設計弱點,已收窄)。
  • 無每步計時遥測:順暢度只能靠感覺,無法歸因。

4. 登入資訊現況(持久化)

  • Chromium profile:容器內 /home/bot/.config/anybot-profile → symlink 到 .config/chromium(box/browser:18-25),--password-store=basic(cookie 以本機金鑰加密存檔,容器內可解密,跨重建有效)。
  • 持久化:/home/bot 掛 named volume anybot-box-home(src/cloudbox.rs:60,612,617)。
  • 三種重建(src/cloudbox.rs:1009-1057):
    • Update(含自動版本更新):先存快照 → docker rm -f 容器 → 重開,volume 不動,登入保留 ✅
    • Reset:docker volume rm -f anybot-box-home → 登入全消失 ⚠️
    • Restore:先殺 volume,從本機快照 snapshot.tar.gz 還原
  • 快照:docker exec tar 打包整個 /home/bot(排除各快取目錄,src/cloudbox.rs:839-844),存到 AnyBot 資料夾;每日+閒置 900 秒自動存(src/cloudbox.rs:82-85,778-782)。
  • 伺服器部署:box 與 volume 在大腦容器的宿主 Docker 上(deploy/server/docker-compose.yml,大腦掛 /var/run/docker.sock);快照存進 anybot-data volume——與 box volume 同一顆碟(同一故障域)。
  • 全 repo 沒有任何 docker volume rm(除 Reset/Restore)、down -v、prune:更新流程本身不會清登入 ✅

二、網路調查摘要(2026-11,可用什麼)

1. 模型/框架層(少數可直接借鏡的點)

專案/文件 要點 對 AnyBot 的用法
Anthropic computer-use 官方文件+2026-05 最佳實務文(computer_toolset_20260801) Batch actions:模型一次回傳一串動作依序執行,批次結尾自動附截圖省一個回合;官方明言批次適用「填多欄表、串捷徑」,不適用探索/失誤恢復;系統提示要模型「每批以截圖結尾」「一句話驗證畫面」 高價值,直接對應瓶頸(模型回合數)。做成 computer_use_batch 工具(見 Phase 1)
Anthropic harness 設計三原則(2026-04) 用模型已熟的工具、砍掉多餘 scaffolding、邊界給模型 檢查 9+18+11 個工具是否可收斂,工具描述精簡=省 token=省 TTFT
cua-speedrun(arXiv 2609.40284) 速度瓶頸主要在 harness/模型選擇與推理預算;「環境 I/O 變快有時整體反而變慢」;統一量測很重要 佐證:先做遥測與批次(回合數),再做環境微優化;KasmVNC 類優化排後面
OSWorld-Human(MLSys 2026) 現有最佳 agent 步數遠多於人類,效率(WES)是新賽點 支持「批次+經驗庫(示範重播)」降步數
Agent S4(Simular,OSWorld 2.0 開源 SOTA) 讓 agent 從任務經驗中「演化自己的工具介面」;經驗庫(experience retrieval) 對應現有 teach(示範錄影):進階成「示範→可重播巨集→檢索重用」
UI-TARS-2 / OpenCUA 開源 GUI 模型族(7B–72B,OSWorld-Verified 27–45%),UI-TARS Desktop 是最完整開源桌面 agent app 作為離線/本機模型(Ollama 路徑)的未來選項;短期不整合
browser-use(含 Browser Harness)、Stagehand、Playwright MCP、chrome-devtools-mcp、agent-browser(Vercel)、Skyvern 瀏覽器 agent 分三條跑道:全權 agent / 純工具層(MCP)/ 工作流產品;CDP+a11y 樹是主流讀頁方式;Playwright MCP 的 AX snapshot 吃 token 兇(4.4M/任務 vs Harness 2.1M) 我們的 browser_*(CDP+ref 編號)已是主流形態;借鏡:snapshot 壓縮、只回傳變化部分;偵測牆重的站點才考慮雲端 stealth 層

2. 雲端沙箱/瀏覽器服務(對應「雲端電腦」)

服務 形態 適配評估
E2B Desktop Firecracker microVM 桌面沙箱,pause/autopause、持久 FS、BYOC/自架 runtime 開源(Apache-2.0) 語意最接近 box 的雲端替代品。適合做 cloudbox provider 適配器 spike(Phase 4),保留快照/喚醒語意,隔離比容器強(microVM)
Daytona 桌面 VM 沙箱(含 Windows/macOS),snapshot API,<90ms 冷起;2026-06 起核心閉源 需要 Windows/macOS 雲端手腳時再評估
Modal / Novita / Vercel Sandbox / Cloudflare Sandbox / Blaxel 通用 code sandbox(gVisor/容器) 偏程式執行,非 GUI;不是 box 的替代品
Steel(開源可自架)、Browserbase、Kernel、Hyperbrowser、Browser Use Cloud、Anchor、Browserless 雲端瀏覽器即服務(session 持久化、stealth、CAPTCHA、Kernel 有 auth vault 代管登入) 是「瀏覽器層」的雲端延伸,不是整台電腦。AnyBot 本地優先+自架哲學 → 若做,先 spike Steel 自架(Apache/MIT,可跑在自己伺服器),當 browser 的第二後端;登入代管需求強再看 Kernel
Kasm Workspaces/kasmweb 映像、linuxserver Webtop、accetto ubuntu-vnc-xfce-g3、testcontainers all-in-one-sandbox 容器化桌面+串流的現成做法 印證 box 架構是業界常規;Kasm 系列的亮點在串流引擎(下條)

3. 串流/畫面順暢度(人看 box 的 VNC)

方案 重點 評估
KasmVNC(開源) 脫離 RFB 規格:WebP/JPX 自適應壓縮、多執行緒編碼、WebCodecs H.264/AV1、WebRTC UDP、內建 web client、多語系鍵盤轉譯 人機畫面體驗的天花板;代價大:現有 src/vnc.rs 的 RFB 代理與「人操作偵測」失效,需改用其 web client+整合 hand_over 流程 → 做實驗性 box flavor,不全面替换
TurboVNC / TigerVNC 調參(UltraZoom、品質、縮色) 保留 RFB,改編碼參數即可 便宜的中間方案:viewer 端參數先調(-Scale、-Quality、CompressLevel),零架構風險
直接把 noVNC 走已發布的 loopback 埠(16080) 本地 Docker 時現行 exec 橋接可整個繞過(src/vnc.rs 只在遠端/中繼需要) 快速獲益:本地看 box 畫面立刻順(Phase 2)
Sunshine/Moonlight、Looking Glass WebRTC 遊戲級串流,需 GPU 無頭容器不適用

4. 持久化/備份(對應「登入資訊不丟」)

做法 來源 適用
named volume 跨容器重建保留(現行做法) Docker 官方 volumes 文件 ✅ 已做,Update 重建安全
docker run --rm --volumes-from <box> -v $PWD:/backup alpine tar czf ... 離 volume 備份 Docker 官方「back up/restore volumes」 現行快照(docker exec tar)等效且更好(在 Mac 端落地);重點是多代+離機
「持久 ≠ 備份」:volume 擋得住容器重建,擋不住磁碟損壞、volume prune、Docker Desktop「Clean/Purge data」、整機遺失 Docker Desktop backup/restore 文件;多篇 2026 自架備份指南 見第三章風險清單
restic/borg 加密增量備份到物件儲存/另一台機 自架備份指南(2026-08) data_dir(含快照、secrets)的離機備份正解;relay 已有加密備份通道可先复用
瀏覽器登入本身的過期問題(伺服器端 session、2FA、IP 跳變風控) browser infra 各家(Kernel 的 vault 賣點就是這個) volume 救不了過期:需要「登入健康檢查+通知接手」與穩定出口 IP(egress via Mac 已有此雛形)

三、登入資訊持久化:風險清單與方案

現行已安全的情境

情境 結果
AnyBot 升級、box 自動/手動「重建電腦」(Update) 登入保留(volume 不動)✅
容器崩潰、docker rm、Docker 引擎重啟 登入保留 ✅
Chromium 被 kill -9 SingletonLock 有清(box/browser:40)、crash-bubble 已藏 ✅

會丢登入的情境(依風險排序)

  1. Reset/Restore 重建:直接 docker volume rm -f(src/cloudbox.rs:1036,1047)。Restore 有快照墊底,Reset 目前無任何补救。
  2. 快照只有一代:snapshot.tar.gz 每日覆蓋(src/cloudbox.rs:395-397)。快照裡登入了過期 cookie、或存到一半被污染,後代無法回退。
  3. 同一故障域:伺服器部署時快照在 anybot-data、volume 在同機 Docker 儲存——整機/磁碟遺失或 Docker Desktop「Clean/Purge data」、重裝 Docker,全沒。
  4. docker volume prune / system prune --volumes(使用者手動):box 被 rm -f 後、重開前的空檔,volume 是 dangling 狀態,prune 會殺;ANYBOT_BOX_NAME 改名後舊 volume 也成 dangling。
  5. 切換 docker_host(src/cloudbox.rs:292-307):新 host 上 box 從無到有,volume 是全新的——登入看起來「消失」。
  6. 登入自然過期/風控:cookie 在 volume 裡好好活著,但伺服器端 session 失效、2FA 要求、IP 大跳(雲端 host)被要求重登。

方案(P1 先做 1–4,P2 做 5–7)

# 項目 內容 落點
L1 快照多代輪替 snapshot-YYYYMMDD-HHMM.tar.gz,保留最近 7 日+4 週,save_snapshot 寫新檔、清舊檔;UI 顯示代數與時間 src/cloudbox.rs:395-397,835-880 + 設定頁
L2 殺 volume 前強制快照 run_rebuild(Reset/Restore) 進入 cleaning-up 前,若 box 在跑必先 save_snapshot(標記 pre-reset),失敗即中止重建 src/cloudbox.rs:1032-1056
L3 新 volume 自動回灌 create_container 偵測 volume 為空且快照存在 → 自動 copy_in_snapshot(開機即回登入住家);UI 可開關「自動回灌」 src/cloudbox.rs:605-618
L4 防 prune 網 容器被殺後的空檔用「無特權佔位容器」掛住 volume(docker run -d --name anybot-box-home-holder -v anybot-box-home:/h busybox sleep infinity);make doctor 加 volume 健康檢查 src/cloudbox.rs + Makefile
L5 快照離機備份 復用 relay 的加密備份通道把 snapshot 推到帳號伺服器(伺服器打不开);或一鍵「匯出快照」成檔給使用者自管(Time Machine/rclone/restic 都吃得下);文件寫明「持久≠備份」 src/remote.rs+快照 UI+README
L6 切 docker_host 帶家走 set_docker_host 前:舊 host 存快照 → 新 host 建 box 後自動回灌;失敗時明確告知「登入在舊主機快照裡」 src/cloudbox.rs:292-307
L7 登入健康檢查 排程(每週)用 CDP 開 2–3 個常用站查登入態標記;掉登入→通知+hand_over_computer 請人重新登入(登入動作本來就該人做)。配合 egress-via-Mac 保持出口 IP 穩定 排程器+botbrowser/browser 層

配套原則(不動程式也要守的慣例):

  • 更新伺服器只用 docker compose up -d --build,絕不用 down -v;文档註明。
  • 永不在 box 所在 host 跑 docker system prune --volumes。
  • 快照內容=登入住家:檔案權限 600(現行已做),含快照的備份視為敏感資料。

四、Computer-Use 順暢度優化方案(依投資報酬排序)

Phase 0:先量測(半週)

  • 每步分段計時(exec spawn/動作/settle/截圖/a11y/編碼/模型 TTFT)寫入現有 build-activity log 與使用統計;設定頁加「電腦卡」顯示每步中位數。
  • 準則依據(cua-speedrun):先歸因再優化。驗收:能回答「一步的 2.5 秒花在哪」。

Phase 1:減少模型回合+環境微優化(box 優先,1–2 週)

  1. computer_use_batch 工具:一次工具呼叫依序跑 [{click|type|key|scroll...}...],結尾自動附一張截圖+控件清單。對照 Anthropic 官方語意(依序執行、失敗即停並回報未執行項、批次適用表單/捷徑、探索任務不用)。與 HELD_BY_PERSON/重複攔截(src/agent.rs:492-509)整合:每個子動作前檢查人接管。
  2. 長駐 daemon 取代 per-step docker exec:box 內跑一個 Python 常駐服務(unix socket,經一條持久 docker exec 橋接),處理 xdotool 序列+import 截圖+AT-SPI 快取。每步省 50–200 ms 與進程冷啟動;遠端 docker host 情境受益最大。
  3. 自適應 settle:500ms 固定等待改為「動作後輪詢 X 畫面差(daemon 內 XShmGetImage 縮圖 diff),穩定即截」(上限仍 500ms、下限 80ms)。靜態頁面省下 ~400ms/步。
  4. 截圖換引擎:daemon 內直接 XShm 取 framebuffer(免 ImageMagick 冷啟動),Rust 端统一 JPEG(現成 src/computer.rs:284-325 管線)。a11y 讀取與截圖併發。
  5. Prompt 微調(零風險,先行):依 Anthropic 2026-05 文:加「用一句話說明截圖顯示了什麼、步驟是否成功」「可批次時優先批次」;保留現有「畫面沒變就換方法」與 ref 制。
  6. (地端 Mac 同步受益)computer_use_batch 在 computer::run_by 實作同一工具面,三條路徑語意一致。

驗收:表單類任務步數 -30% 以上;box 每步環境時間中位數 -30%(以 Phase 0 基線計);無新增 B 級 bug。

Phase 2:人機畫面體驗(3–5 天)

  1. 本地 Docker 時 viewer 直連已發布的 127.0.0.1:16080(跳過 exec 橋接);遠端情境保留 vnc.rs/relay 路徑。
  2. TigerVNC 端編碼調參(Tight/UltraZoom 品質、允許 32bpp)+noVNC 端 quality/compression 參數化進設定頁。
  3. (實驗)KasmVNC box flavor 原型:一個分支用 KasmVNC 取代 TigerVNC+noVNC,iframe 掛其 web client,評估 fps/延遲/整合成本,量化後再決定是否併入 vnc.rs 協議層。不動主線。

驗收:本地看 box 畫面可互動不卡;遠端情境有 A/B 數據。

Phase 3:持久化落地(1 週)

  • 实施 L1–L4(P1),接著 L5–L7(P2)。
  • 驗收:情境演練——(a) Reset 後能从 pre-reset 快照救回;(b) 手動 docker volume rm 後重開 box 自動回灌登入;(c) 模擬快照全丢,能從 relay 加密備份還原;(d) doctor 能報出 volume 缺失。

Phase 4:雲端選項研究(spike,各 2–3 天,不進主線)

  1. E2B Desktop spike:實作一個 cloudbox provider 介面(create/pause/snapshot/exec/截圖),跑通 E2B Desktop 模板→同一組 computer_use_* 工具打雲端 microVM;記錄延遲、成本、快照語意差异(E2B 快照=檔案+記憶體態,比 tar 快照更完整)。
  2. Steel 自架 spike:在自家伺服器跑 Steel(開源),把 browser_* 的 CDP 端點指過去(CDP 相容=改 URL 即可),驗證雲端瀏覽器 session(登入持久化由服務端 vault 管)與成本。
  3. 產出比較表(本機 box vs E2B vs Steel)後再開立項討論。

後續候選(不排程,記錄方向)

  • 示範→巨集重播(接 teach 錄影,Agent S 式經驗庫):把成功軌跡壓成可重放的 ref 序列,重複性任務直接重播,是最徹底的降步數手段。
  • 模型端:OpenCUA/UI-TARS 開源模型作為 Ollama 路的 computer-use 專用小模型。
  • box 多 Bot 隔離升級(B18 群):每 Bot 一個 box(volume 每 Bot 一份,登入也每 Bot 一份)——順帶解決「登入互相踩」的問題。

五、執行順序總覽

週 內容 風險
W1 Phase 0 遥測;Prompt 微調;L1/L2/L3/L4(持久化四件套) 低
W2–3 Phase 1(batch 工具→daemon→settle→截圖引擎,逐項上線逐項量) 中(daemon 是新常駐面,需守 person-takeover/取消/逾時)
W4 Phase 2(viewer 直連+調參;KasmVNC 原型);L5/L6 低–中
W5 L7 登入健康檢查;Phase 4 spikes;開會決定雲端路線 —

六、主要參考(2026-11-06 查證)

  • Anthropic:Computer use tool 文件(batch actions、computer_toolset_20260801)、Best practices for computer and browser use(2026-05,computer_batch/browser_batch)、Agent harness design(2026-04)。
  • 研究:cua-speedrun(arXiv:2609.40284,速度瓶頸歸因)、OSWorld-Human(MLSys 2026,步數效率)、OSWorld 2.0。
  • 開源框架:Agent S(simular-ai,S4)、UI-TARS Desktop / Agent TARS(bytedance)、OpenCUA(xlang.ai)、Cua(trycua)。
  • 瀏覽器:browser-use/Browser Harness、Stagehand(Browserbase)、Playwright MCP(Microsoft)、chrome-devtools-mcp、agent-browser(Vercel)、Skyvern。
  • 串流:KasmVNC(kasmtech,WebP/WebRTC/多緒編碼)、kasmweb 映像庫、accetto ubuntu-vnc-xfce-g3、TigerVNC 調參指南(2026-02)。
  • 雲端沙箱:E2B(含 Desktop、自架 runtime)、Daytona(2026-06 起閉源)、Modal、Novita、Vercel Sandbox;雲端瀏覽器:Steel(開源自架)、Browserbase、Kernel(auth vault)、Hyperbrowser、Browser Use Cloud。
  • 持久化:Docker volumes 官方文件(back up/restore/migrate)、Docker Desktop backup-and-restore、「持久≠備份」自架備份架構指南(2026-08,restic/borg)。