AI 程式設計教程中文版
從原理到實戰

04 · 工具系統與終端後端

區分 Hermes toolsets、tools、terminal backends、後臺程序、Nous Tool Gateway 和整體許可權風險。

Hermes 的工具系統決定 agent 能做什麼。**終端後端(terminal backend)**決定這些動作在哪裡發生。新手必須把這兩個問題分開——否則會把"開了 terminal toolset(終端工具集)"和"命令在本機執行"混成一件事,結果讓一個不可信任務在本機直接跑命令。

官方資料:Tools & ToolsetsConfigurationToolsets ReferenceTools ReferenceSecurity

先給結論toolset 是「能力開關」(讓 agent 能調什麼),backend 是「執行位置」(動作真正發生在哪臺機器)。先開最小 toolset,再選隔離合適的 backend;不要讓本機 local backend 承擔不可信任務——一條刪 ~/ 的命令在 local 沒有任何攔截。

Toolset 不是 backend

**Toolset(工具集)**是按用途分組的工具包,常見有:

  • web / search:搜尋和抽取網頁內容。
  • file:讀寫檔案。
  • terminal:執行 shell 命令。
  • browser:頁面導航、快照、視覺自動化(playwright 風)。
  • memory / session_search:長期記憶寫入與跨 session 歷史檢索。
  • skills:載入可複用流程(agent 自創 + 手動 skill)。
  • cronjob / messaging:定時任務和訊息投遞。
  • delegation / code_execution:委派子代理和程式化 Python 執行。

完整工具清單按官方 Toolsets Reference 當前列表為準——具體工具集隨版本更新。

**Terminal backend(終端後端)**是 shell 命令的執行環境:

  • local:本機直接跑——快但沒有任何隔離,命令對本機有完全許可權。
  • docker:在一個長生命週期 Docker 容器內跑——有隔離但容器內狀態會持久共享(詳見下文 Docker 的誤區)。
  • ssh:透過 SSH 跑到遠端伺服器——把"Hermes 在哪"和"命令在哪"完全解耦。
  • singularity:HPC(高效能運算)或 Docker 不可用的共享機器,常見於科研叢集。
  • modal / daytona:雲端 sandbox(隔離沙箱)/ workspace——閒置免費、按需啟動的 serverless 環境。
  • vercel_sandbox:Vercel 的 microVM(微型虛擬機器)+ 快照支援的雲端執行環境。

一句話總結:toolset 決定它能拿什麼工具,backend 決定命令實際在哪裡跑——兩個問題獨立配置,互不替代

把這兩件事放在同一張圖裡看,就是橫軸×縱軸的矩陣——任意一條命令都對應"開了哪個 toolset"+"跑在哪個 backend"兩個獨立座標:

flowchart TB
    subgraph TS["② toolset 維度 · 調什麼"]
        T1["web<br/>搜尋"]
        T2["file<br/>讀寫"]
        T3["terminal<br/>執行"]
        T4["browser<br/>瀏覽"]
        T5["memory<br/>記憶"]
        T6["skills<br/>技能"]
    end
    subgraph BE["① backend 維度 · 在哪跑"]
        B1["local<br/>本機直跑<br/>無隔離"]
        B2["docker<br/>容器<br/>持久共享"]
        B3["ssh<br/>遠端主機"]
        B4["modal/daytona<br/>vercel_sandbox<br/>雲端 sandbox"]
        B5["singularity<br/>HPC"]
    end
    TS -->|"決定 agent<br/>能調什麼"| RUN["⚡ 命令實際執行"]
    BE -->|"決定 shell 命令<br/>實際在哪臺機器"| RUN
    style B1 fill:#fde2e2,stroke:#c43d3d
    style RUN fill:#fde7c2,stroke:#d4761a

紅色 local 是預設且最危險的——開了 terminal toolset 不等於隔離,命令會直接跑在你開啟 Hermes 的那臺機器上關鍵 mismatch:很多事故來自只看到 toolset 維度("我開了哪些工具"),卻沒意識到 backend 維度("命令實際在哪臺機器")始終是另一個獨立維度。

最小工具集

按任務開工具:

查资料        -> web/search
读文件        -> file read
改文件        -> file + patch
跑测试        -> terminal + 明确 backend
操作页面      -> browser
回查历史      -> session_search
长期事实      -> memory
复用流程      -> skills
定时任务      -> cronjob
跨平台通知    -> messaging/send_message

工具越多,許可權越大,錯誤來源也越多。第一次使用只開最少能力:普通對話穩定後,再讀檔案,再執行低風險命令。

Backend 選擇

local

最快,直接影響本機。只適合可信專案和低風險命令。

docker

適合隔離未知程式碼和臨時依賴。注意容器在 Hermes 程序內持久共享。

ssh

適合遠端 GPU、VPS、隔離診斷機或不想碰本機環境的任務。

singularity

適合 HPC 或 Docker 不可用的共享機器。

modal / daytona

適合雲端執行、臨時算力和遠端持久 workspace。

vercel_sandbox

適合 Vercel microVM(微型虛擬機器)和 snapshot-backed(快照支援的)雲端執行——快速冷啟動 + 檔案系統快照持久化。

local 沒有隔離。docker 有隔離但不是每條命令全新容器。ssh 有主機邊界但需要管理遠端憑據。雲 sandbox 有成本、持久化和憑據同步邊界。

Docker 的誤區

Hermes Docker backend 是一個長生命週期容器。它會把後續 terminal、file、execute_code 呼叫透過 docker exec 送進去,程序生命週期內會保留包、檔案和工作目錄狀態。

這有兩個後果:

  • 好處:一次安裝的依賴後續可用,像遠端開發容器。
  • 風險:並行 subagents、/new/reset 仍可能共享同一容器狀態。

如果你需要並行隔離,不能只說“用 Docker”。還要規劃每個任務的工作目錄、volume、env、寫入路徑和清理方式。

後臺程序

測試、構建、服務啟動、長時間診斷適合後臺程序。它們必須能啟動、輪詢、讀取日誌、等待和終止。

terminal(command="pytest -v tests/", background=true)
process(action="poll", session_id="proc_abc123")
process(action="log", session_id="proc_abc123")
process(action="kill", session_id="proc_abc123")

不要把釋出、刪除、資料庫遷移、賬單變更這類高風險動作直接後臺化。後臺不是降低風險,只是讓任務離開當前互動視線。

Nous Tool Gateway 的邊界

Nous Portal 付費使用者可以透過 Tool Gateway 使用 web search、image generation、TTS、browser automation 等能力,減少單獨配置工具 API key 的成本。

但 Tool Gateway 只解決“工具供應商憑據”問題,不解決“哪些人和平臺能呼叫工具”的問題。Gateway 使用者、toolsets、terminal backend、allowlist 仍要單獨管。

風險不只來自 shell

即使關閉 terminal,也仍有副作用:

  • file 可以讀寫檔案。
  • browser 可以操作網頁和登入態。
  • messaging 可以外發內容。
  • memory 會影響後續 session。
  • skills 可能載入指令碼和金鑰需求。
  • MCP tools 可能連線資料庫、GitHub、Slack 或瀏覽器。

安全邊界要按整體工具能力設計,而不是隻盯 shell。

驗收清單

你應該能用一句話回答下面 7 個問題。任何一項答不上來,說明工具 / 後端邊界沒真正搞清楚——先停下來弄清,再開下一個工具

  • 當前啟用了哪些 toolset?(hermes config showtoolsets 欄位)
  • 每個 toolset 為什麼需要?(不能回答 = 應該關掉)
  • Terminal backend 是 localdockerssh 還是雲端?(hermes config showterminal.backend 欄位,或直接看 ~/.hermes/config.yaml
  • 命令實際在哪個環境執行?(讓 Hermes 跑一條 pwd && hostname 驗證)
  • 哪些 env vars(環境變數)會進入 backend?(敏感變數是否會洩漏到容器或遠端)
  • 日誌、輸出檔案和後臺程序狀態在哪裡看?(~/.hermes/logs/ + process(action="log")
  • 不需要的工具如何關閉?(hermes config set toolsets.<name> false 或編輯 yaml)

官方資料

下一步

本頁目錄