24 KiB
24 KiB
工具可攜性盤點
日期:2026-09-14。範圍:目前工作區 LazyBoy2 原始碼,非尚未實作的理想架構。本次僅新增盤點文件,未改動程式、金鑰、provider 或 Docker 設定。
已核對 51 個核心工具 + 8 個團隊新增名稱,共 59 個不同工具名稱。各角色看到的子集不同,send_message 同名用途也依角色不同;這不是所有工具在每個 turn 同時出現的保證。MCP 服務內部動態工具不包含在此數量。
主要結論
- 直接與主模型供應商耦合的是 web_search(web_fetch 只有拒絕純 HTTP 時的 fallback 才耦合);spawn_subagent/delegate_task/spawn_agent 會繼承或使用共享模型設定。
- 其餘工具的底層大多不綁模型供應商,但模型必須能透過目前的 Chat Completions/串流 tool_calls 介面正確呼叫它們。這個共同前提不滿足,所有 agent 工作都可能停住。
- 模型 adapter 目前沒有任意 provider capability discovery、Responses/Messages 自動適配,也沒有每個子 agent 的獨立 provider 選擇。換環境變數不會改變已運行 daemon 捕捉的 Config;需重啟相應程序。
- 換電腦最容易丟失的是 Docker volume、網站登入、本地 CLI/MCP 授權、絕對路徑、team/session資料,以及無法直接遷移的活動程序。
- Docker 並未包含全部狀態:主程式、模型/MCP編排、SQLite、對話與大型結果快取仍可能在本地。
實際檢查到的環境
- 正式容器:lazyboy-box,映像 lazyboy-box:local。
- 已掛載 lazyboy-box-workspace → /workspace、lazyboy-box-home → /home/box。
- 全域預設 ~/.lazyboy/mcp.json 與此工作區 .lazyboy/mcp.json 均不存在:有 MCP 管理工具,不代表目前已配置任何 MCP 連線。
- 本次檢查程序未帶入 LAZYBOY_WEB_*/LAZYBOY_BASE_URL/LAZYBOY_API_KEY/XAI_API_KEY 等已檢查變數。不能據此推定你另一個 terminal/daemon 也沒有設定;本次未讀取其他程序的憑證,亦未發送付費模型或第三方服務測試請求。
完整工具清單
「底層不綁 provider」均受上述模型協議相容前提限制。
| 工具 | 執行位置 | 換 provider | 換電腦/程序 | 所需準備或限制 |
|---|---|---|---|---|
add_mcp_server |
本地主機 MCP 設定檔 | 不綁模型 provider | 依賴可寫入的 MCP 設定路徑;添加成功不等於相應服務可用 | 搬設定並檢查來源;workspace 設定與全域設定需一起盤點 |
answer_task |
team daemon/SQLite/Unix socket | 查詢/控制不直接依賴provider;任務繼續與記憶整理仍需模型 | 不搬 DB 就沒有原 agent、task、記憶;active 任務不能只靠同名ID繼續 | 搬整個 team 持久資料,重建 socket/lock,使用既有 recovery 流程核對狀態 |
await_shell |
Docker /tmp/gb-jobs | 底層不綁 provider | 正在執行的程序不能隨檔案搬移;重新建立容器也不保留 /tmp job 紀錄 | 搬家前完成工作,不把舊 session_id 當成新機器的活動命令 |
browser_click |
預設 Docker Chromium/Playwright | 底層不綁 provider,切模型不會自動換 profile | 需 Docker image、home volume、網站授權仍有效;upload/download 另需 workspace;即時 tab/連線不是單靠程式碼就能搬 | 沿用完整 profile;重連後重新觀察,網站仍可能要求再次登入。local 相容模式另需本機 Node/Playwright/Chromium與舊 profile |
browser_download |
預設 Docker Chromium/Playwright | 底層不綁 provider,切模型不會自動換 profile | 需 Docker image、home volume、網站授權仍有效;upload/download 另需 workspace;即時 tab/連線不是單靠程式碼就能搬 | 沿用完整 profile;重連後重新觀察,網站仍可能要求再次登入。local 相容模式另需本機 Node/Playwright/Chromium與舊 profile |
browser_eval |
預設 Docker Chromium/Playwright | 底層不綁 provider,切模型不會自動換 profile | 需 Docker image、home volume、網站授權仍有效;upload/download 另需 workspace;即時 tab/連線不是單靠程式碼就能搬 | 沿用完整 profile;重連後重新觀察,網站仍可能要求再次登入。local 相容模式另需本機 Node/Playwright/Chromium與舊 profile |
browser_handoff |
預設 Docker Chromium/Playwright | 底層不綁 provider,切模型不會自動換 profile | 需 Docker image、home volume、網站授權仍有效;upload/download 另需 workspace;即時 tab/連線不是單靠程式碼就能搬 | 沿用完整 profile;重連後重新觀察,網站仍可能要求再次登入。local 相容模式另需本機 Node/Playwright/Chromium與舊 profile |
browser_navigate |
預設 Docker Chromium/Playwright | 底層不綁 provider,切模型不會自動換 profile | 需 Docker image、home volume、網站授權仍有效;upload/download 另需 workspace;即時 tab/連線不是單靠程式碼就能搬 | 沿用完整 profile;重連後重新觀察,網站仍可能要求再次登入。local 相容模式另需本機 Node/Playwright/Chromium與舊 profile |
browser_press |
預設 Docker Chromium/Playwright | 底層不綁 provider,切模型不會自動換 profile | 需 Docker image、home volume、網站授權仍有效;upload/download 另需 workspace;即時 tab/連線不是單靠程式碼就能搬 | 沿用完整 profile;重連後重新觀察,網站仍可能要求再次登入。local 相容模式另需本機 Node/Playwright/Chromium與舊 profile |
browser_read_page |
預設 Docker Chromium/Playwright | 底層不綁 provider,切模型不會自動換 profile | 需 Docker image、home volume、網站授權仍有效;upload/download 另需 workspace;即時 tab/連線不是單靠程式碼就能搬 | 沿用完整 profile;重連後重新觀察,網站仍可能要求再次登入。local 相容模式另需本機 Node/Playwright/Chromium與舊 profile |
browser_release |
預設 Docker Chromium/Playwright | 底層不綁 provider,切模型不會自動換 profile | 需 Docker image、home volume、網站授權仍有效;upload/download 另需 workspace;即時 tab/連線不是單靠程式碼就能搬 | 沿用完整 profile;重連後重新觀察,網站仍可能要求再次登入。local 相容模式另需本機 Node/Playwright/Chromium與舊 profile |
browser_scroll |
預設 Docker Chromium/Playwright | 底層不綁 provider,切模型不會自動換 profile | 需 Docker image、home volume、網站授權仍有效;upload/download 另需 workspace;即時 tab/連線不是單靠程式碼就能搬 | 沿用完整 profile;重連後重新觀察,網站仍可能要求再次登入。local 相容模式另需本機 Node/Playwright/Chromium與舊 profile |
browser_select |
預設 Docker Chromium/Playwright | 底層不綁 provider,切模型不會自動換 profile | 需 Docker image、home volume、網站授權仍有效;upload/download 另需 workspace;即時 tab/連線不是單靠程式碼就能搬 | 沿用完整 profile;重連後重新觀察,網站仍可能要求再次登入。local 相容模式另需本機 Node/Playwright/Chromium與舊 profile |
browser_snapshot |
預設 Docker Chromium/Playwright | 底層不綁 provider,切模型不會自動換 profile | 需 Docker image、home volume、網站授權仍有效;upload/download 另需 workspace;即時 tab/連線不是單靠程式碼就能搬 | 沿用完整 profile;重連後重新觀察,網站仍可能要求再次登入。local 相容模式另需本機 Node/Playwright/Chromium與舊 profile |
browser_tabs |
預設 Docker Chromium/Playwright | 底層不綁 provider,切模型不會自動換 profile | 需 Docker image、home volume、網站授權仍有效;upload/download 另需 workspace;即時 tab/連線不是單靠程式碼就能搬 | 沿用完整 profile;重連後重新觀察,網站仍可能要求再次登入。local 相容模式另需本機 Node/Playwright/Chromium與舊 profile |
browser_type |
預設 Docker Chromium/Playwright | 底層不綁 provider,切模型不會自動換 profile | 需 Docker image、home volume、網站授權仍有效;upload/download 另需 workspace;即時 tab/連線不是單靠程式碼就能搬 | 沿用完整 profile;重連後重新觀察,網站仍可能要求再次登入。local 相容模式另需本機 Node/Playwright/Chromium與舊 profile |
browser_upload |
預設 Docker Chromium/Playwright | 底層不綁 provider,切模型不會自動換 profile | 需 Docker image、home volume、網站授權仍有效;upload/download 另需 workspace;即時 tab/連線不是單靠程式碼就能搬 | 沿用完整 profile;重連後重新觀察,網站仍可能要求再次登入。local 相容模式另需本機 Node/Playwright/Chromium與舊 profile |
browser_wait |
預設 Docker Chromium/Playwright | 底層不綁 provider,切模型不會自動換 profile | 需 Docker image、home volume、網站授權仍有效;upload/download 另需 workspace;即時 tab/連線不是單靠程式碼就能搬 | 沿用完整 profile;重連後重新觀察,網站仍可能要求再次登入。local 相容模式另需本機 Node/Playwright/Chromium與舊 profile |
call_mcp_tool |
host 啟動 stdio server,或 host 呼叫 HTTP server | 不直接綁模型 provider;依賴 MCP server 自己的 schema與授權 | stdio 需本地主機 command/runtime/env;HTTP 需服務地址與 headers;設定檔不隨 Docker 搬移 | 搬 MCP 設定、重新安裝 server 與授權;目前不自動導入瀏覽器cookies或 OpenCode 的 MCP 設定 |
cancel_task |
team daemon/SQLite/Unix socket | 查詢/控制不直接依賴provider;任務繼續與記憶整理仍需模型 | 不搬 DB 就沒有原 agent、task、記憶;active 任務不能只靠同名ID繼續 | 搬整個 team 持久資料,重建 socket/lock,使用既有 recovery 流程核對狀態 |
check_subagent |
本地程序內 subagent registry | 控制動作本身不綁 provider;被控制的 agent 依賴其原 model client | 換電腦/重啟程序後沒有原先的活動子代理 | 不把舊 subagent_id 當成可控制的活動任務 |
copy_from_box |
本地 ↔ Docker | 底層不綁 provider | 同時依賴本地路徑、工作區權限與 box 資料 | 搬檔案並修正新電腦路徑;只搬 volume 不足以保存本地輸出 |
copy_to_box |
本地 ↔ Docker | 底層不綁 provider | 同時依賴本地路徑、工作區權限與 box 資料 | 搬檔案並修正新電腦路徑;只搬 volume 不足以保存本地輸出 |
delegate_task |
team daemon + 模型 + SQLite | 新工作用 daemon 的共享 Config;不是每個 agent 任選 provider | 需 daemon、team DB、workspace、profile;搬家不能保留正在執行的模型連線 | 停 daemon 後一致備份 SQLite 資料,再修正路徑與 provider 設定 |
external_await_command |
本地主機程序 | 底層不綁 provider | session_id/stdin/程序都是目前程序狀態,不能搬移 | 先完成或停止命令;移機後明確重新執行,不能假裝接續原程序 |
external_edit_file |
本地主機檔案 | 底層不綁 provider;grep/glob 是 Rust 內建,不要求系統 grep/rg | 依賴工作區檔案、路徑、符號連結與讀寫權限 | 搬工作區並修正 session/task 保存的 cwd 與絕對路徑 |
external_exec_command |
本地主機 shell | 底層不綁 provider | 受作業系統、sh/PATH、已安裝CLI、工作目錄、環境变量、CLI登入影響 | 新機器重建依賴與授權;不能只複製 LazyBoy2 執行檔 |
external_glob |
本地主機檔案 | 底層不綁 provider;grep/glob 是 Rust 內建,不要求系統 grep/rg | 依賴工作區檔案、路徑、符號連結與讀寫權限 | 搬工作區並修正 session/task 保存的 cwd 與絕對路徑 |
external_grep |
本地主機檔案 | 底層不綁 provider;grep/glob 是 Rust 內建,不要求系統 grep/rg | 依賴工作區檔案、路徑、符號連結與讀寫權限 | 搬工作區並修正 session/task 保存的 cwd 與絕對路徑 |
external_list_dir |
本地主機檔案 | 底層不綁 provider;grep/glob 是 Rust 內建,不要求系統 grep/rg | 依賴工作區檔案、路徑、符號連結與讀寫權限 | 搬工作區並修正 session/task 保存的 cwd 與絕對路徑 |
external_read_file |
本地主機檔案 | 底層不綁 provider;grep/glob 是 Rust 內建,不要求系統 grep/rg | 依賴工作區檔案、路徑、符號連結與讀寫權限 | 搬工作區並修正 session/task 保存的 cwd 與絕對路徑 |
external_search_files |
本地主機檔案 | 底層不綁 provider;grep/glob 是 Rust 內建,不要求系統 grep/rg | 依賴工作區檔案、路徑、符號連結與讀寫權限 | 搬工作區並修正 session/task 保存的 cwd 與絕對路徑 |
external_shell |
本地主機 shell | 底層不綁 provider | 受作業系統、sh/PATH、已安裝CLI、工作目錄、環境变量、CLI登入影響 | 新機器重建依賴與授權;不能只複製 LazyBoy2 執行檔 |
external_write_file |
本地主機檔案 | 底層不綁 provider;grep/glob 是 Rust 內建,不要求系統 grep/rg | 依賴工作區檔案、路徑、符號連結與讀寫權限 | 搬工作區並修正 session/task 保存的 cwd 與絕對路徑 |
external_write_stdin |
本地主機程序 | 底層不綁 provider | session_id/stdin/程序都是目前程序狀態,不能搬移 | 先完成或停止命令;移機後明確重新執行,不能假裝接續原程序 |
find_agents |
team daemon/SQLite/Unix socket | 查詢/控制不直接依賴provider;任務繼續與記憶整理仍需模型 | 不搬 DB 就沒有原 agent、task、記憶;active 任務不能只靠同名ID繼續 | 搬整個 team 持久資料,重建 socket/lock,使用既有 recovery 流程核對狀態 |
get_mcp_server_status |
host 啟動 stdio server,或 host 呼叫 HTTP server | 不直接綁模型 provider;依賴 MCP server 自己的 schema與授權 | stdio 需本地主機 command/runtime/env;HTTP 需服務地址與 headers;設定檔不隨 Docker 搬移 | 搬 MCP 設定、重新安裝 server 與授權;目前不自動導入瀏覽器cookies或 OpenCode 的 MCP 設定 |
get_mcp_tools |
host 啟動 stdio server,或 host 呼叫 HTTP server | 不直接綁模型 provider;依賴 MCP server 自己的 schema與授權 | stdio 需本地主機 command/runtime/env;HTTP 需服務地址與 headers;設定檔不隨 Docker 搬移 | 搬 MCP 設定、重新安裝 server 與授權;目前不自動導入瀏覽器cookies或 OpenCode 的 MCP 設定 |
get_task |
team daemon/SQLite/Unix socket | 查詢/控制不直接依賴provider;任務繼續與記憶整理仍需模型 | 不搬 DB 就沒有原 agent、task、記憶;active 任務不能只靠同名ID繼續 | 搬整個 team 持久資料,重建 socket/lock,使用既有 recovery 流程核對狀態 |
message_subagent |
本地程序內 subagent registry | 控制動作本身不綁 provider;被控制的 agent 依賴其原 model client | 換電腦/重啟程序後沒有原先的活動子代理 | 不把舊 subagent_id 當成可控制的活動任務 |
read |
Docker | 底層不綁 provider | 需 Docker、映像、volume;自裝套件若位於容器 writable layer,重建後可能消失 | 搬 workspace/home volume;自裝依賴寫入 Dockerfile 或另存映像 |
remove_mcp_server |
本地主機 MCP 設定檔 | 不綁模型 provider | 依賴可寫入的 MCP 設定路徑;添加成功不等於相應服務可用 | 搬設定並檢查來源;workspace 設定與全域設定需一起盤點 |
report_blocked |
LazyBoy2 runtime/session | 本身不綁 provider;仍需模型正確產生工具呼叫 | 工具可重新使用;計畫、待回答問題、歷史紀錄需另搬 session/team 資料 | 搬持久化資料;不搬 live socket/lock;重新確認尚未完成的互動 |
report_done |
LazyBoy2 runtime/session | 本身不綁 provider;仍需模型正確產生工具呼叫 | 工具可重新使用;計畫、待回答問題、歷史紀錄需另搬 session/team 資料 | 搬持久化資料;不搬 live socket/lock;重新確認尚未完成的互動 |
report_progress |
LazyBoy2 runtime/session | 本身不綁 provider;仍需模型正確產生工具呼叫 | 工具可重新使用;計畫、待回答問題、歷史紀錄需另搬 session/team 資料 | 搬持久化資料;不搬 live socket/lock;重新確認尚未完成的互動 |
request_box_help |
Docker desktop + 本地 viewer | 底層不綁 provider | 需桌面服務、可用的本機 6080 埠;等待中的人工步驟另依賴 task/session 紀錄 | 搬 Docker 與 task/session;重新顯示桌面並觀察 |
request_user_confirm |
LazyBoy2 runtime/session | 本身不綁 provider;仍需模型正確產生工具呼叫 | 工具可重新使用;計畫、待回答問題、歷史紀錄需另搬 session/team 資料 | 搬持久化資料;不搬 live socket/lock;重新確認尚未完成的互動 |
request_user_input |
LazyBoy2 runtime/session | 本身不綁 provider;仍需模型正確產生工具呼叫 | 工具可重新使用;計畫、待回答問題、歷史紀錄需另搬 session/team 資料 | 搬持久化資料;不搬 live socket/lock;重新確認尚未完成的互動 |
screenshot |
Docker desktop + 本地 viewer | 底層不綁 provider | 需桌面服務、可用的本機 6080 埠;等待中的人工步驟另依賴 task/session 紀錄 | 搬 Docker 與 task/session;重新顯示桌面並觀察 |
search_memory |
team daemon/SQLite/Unix socket | 查詢/控制不直接依賴provider;任務繼續與記憶整理仍需模型 | 不搬 DB 就沒有原 agent、task、記憶;active 任務不能只靠同名ID繼續 | 搬整個 team 持久資料,重建 socket/lock,使用既有 recovery 流程核對狀態 |
send_message |
LazyBoy2 runtime/session | 本身不綁 provider;仍需模型正確產生工具呼叫 | 工具可重新使用;計畫、待回答問題、歷史紀錄需另搬 session/team 資料 | 搬持久化資料;不搬 live socket/lock;重新確認尚未完成的互動 |
shell |
Docker | 底層不綁 provider | 需 Docker、映像、volume;自裝套件若位於容器 writable layer,重建後可能消失 | 搬 workspace/home volume;自裝依賴寫入 Dockerfile 或另存映像 |
spawn_agent |
team daemon + 模型 + SQLite | 新工作用 daemon 的共享 Config;不是每個 agent 任選 provider | 需 daemon、team DB、workspace、profile;搬家不能保留正在執行的模型連線 | 停 daemon 後一致備份 SQLite 資料,再修正路徑與 provider 設定 |
spawn_subagent |
本地編排 + 當前模型服務 | 繼承父層 model client,沒有自行選擇第二供應商的能力 | 正在執行的子代理 registry 是程序內狀態,不能藉搬 session JSON 恢復 | 先完成工作;模型連線與工具呼叫相容性需另外驗證 |
stop_subagent |
本地程序內 subagent registry | 控制動作本身不綁 provider;被控制的 agent 依賴其原 model client | 換電腦/重啟程序後沒有原先的活動子代理 | 不把舊 subagent_id 當成可控制的活動任務 |
update_plan |
LazyBoy2 runtime/session | 本身不綁 provider;仍需模型正確產生工具呼叫 | 工具可重新使用;計畫、待回答問題、歷史紀錄需另搬 session/team 資料 | 搬持久化資料;不搬 live socket/lock;重新確認尚未完成的互動 |
wait_task |
team daemon/SQLite/Unix socket | 查詢/控制不直接依賴provider;任務繼續與記憶整理仍需模型 | 不搬 DB 就沒有原 agent、task、記憶;active 任務不能只靠同名ID繼續 | 搬整個 team 持久資料,重建 socket/lock,使用既有 recovery 流程核對狀態 |
web_fetch |
host 直接匿名 HTTP GET;僅網站拒絕純 HTTP 時退回 xAI 遠端瀏覽 | 主路徑不綁 provider;fallback 只在官方 xAI 設定存在時啟用,其他 provider 直接回報抓取失敗 | 直接搬即可;不會搬移瀏覽器 cookies;程序內快取不持久 | fallback 的 provider 抽象化 |
web_search |
host → xAI API 或相容 web gateway | 直接耦合:官方 xAI 自動使用當前 model/base/key;換其他 provider 可能直接報未設定 | 需重新設定模型與 web 服務的 endpoint/key;不會搬移瀏覽器 cookies | 獨立 web 設定與 capability adapter;目前 xAI fetch 為模型整理內容 |
要搬的資料
| 資料 | 目前預設位置 | 注意事項 |
|---|---|---|
| Box 工作檔 | lazyboy-box-workspace volume | Git clone 不會帶過去 |
| Box profile/家目錄 | lazyboy-box-home volume | 包含登入資料;搬完網站仍可能因裝置/IP變動要求重登 |
| 系統套件 | Docker image/容器 writable layer | 只有 /workspace、/home/box 是命名 volume;例如 apt 裝到 /usr 的套件,僅搬 volume 不會帶走 |
| Team身分/記憶/任務 | ~/.lazyboy/team,或 LAZYBOY_DATA_DIR | SQLite在寫入時不能只草率複製主db檔;採一致備份,不搬 live socket/lock |
| 單次/REPL session | ~/.lazyboy/sessions,或 LAZYBOY_SESSIONS_DIR | 保存的cwd、附件、輸出絕對路徑需修正 |
| 較大工具結果/命令輸出 | 工作區 .lazyboy-output | .gitignore 已忽略;只 clone repo 不會帶走 |
| 本地相容瀏覽器 | runtime/team 指定的 profile 目錄 | 只有 LAZYBOY_BROWSER_SURFACE=local 才用;與 Docker profile 分開 |
| MCP設定 | LAZYBOY_MCP_CONFIG 或 ~/.lazyboy/mcp.json,加工作區 .lazyboy/mcp.json | server二進位、runtime、env、headers/登入另依各服務處理 |
| 模型/Web設定 | LAZYBOY_、XAI_、OPENAI_* 等環境設定 | 不是 repo 內完整可攜的 provider profile;多個來源同時存在時有優先順序,不能只改key忽略base/model |
| 主程式與建置資源 | repo、box/、tools/playwright/、符合新平台的binary | Box建置目錄目前用編譯時 CARGO_MANIFEST_DIR 推導;搬舊binary可能仍指向舊路徑。新機重建,或正確設 LAZYBOY_BOX_DIR並保留相鄰 tools/playwright 結構 |
目前程式含 UnixListener/UnixStream 與 Unix-specific flock 等依賴,不能宣稱同一份binary或直接在原生Windows即能運作;跨系統需要另做移植/在合適Linux環境部署。Docker在本機執行,不等於所有資料已放在遠端雲端。
優先改善順序(尚未實作)
- 把 web fetch、web search 的供應商/model/key 設定與主模型完全分離,並提供獨立抓頁實作與明確capability檢查。
- 加入provider adapter與啟動時相容性檢查,區分模型協議、tool calling、原生搜尋;避免只改base URL。
- 建立可攜部署包:版本固定的Dockerfile/依賴、volume與team/session一致備份、路徑重新對應、secret引用。
- 列出每個MCP服務的runtime與授權來源,支援在box內執行適合容器化的stdio MCP服務。
- 搬移後做健康檢查:模型工具呼叫、Docker命令、profile存在與登入確認、MCP連線、舊任務恢復。健康檢查通過仍不能保證任何網站或外部服務永遠成功。