跳到主要內容

OpenHands

將編碼任務委託給 OpenHands CLI(模型無關,基於 LiteLLM)。

技能元數據

來源可選 — 使用 hermes skills install official/autonomous-ai-agents/openhands 安裝
路徑optional-skills/autonomous-ai-agents/openhands
版本0.1.0
作者Tim Koepsel (xzessmedia), Hermes Agent
許可證MIT
平臺linux, macos
標籤Coding-Agent, OpenHands, Model-Agnostic, LiteLLM
相關技能claude-code, codex, opencode, hermes-agent

參考:完整 SKILL.md

信息

以下是 Hermes 在觸發此技能時加載的完整技能定義。這是技能激活時代理所看到的指令。

OpenHands CLI

通過 terminal 工具將編碼任務委託給 OpenHands CLI。OpenHands 與模型無關:支持任何 LiteLLM 支持的提供商(OpenAI、Anthropic、OpenRouter、DeepSeek、Ollama、vLLM 等)。

此技能是用於批量或一次性委託的無頭模式包裝器。Hermes 不使用交互式文本 UI。

何時使用

  • 用戶希望將編碼任務特別委託給 OpenHands。
  • 用戶希望使用可以在非 Anthropic / 非 OpenAI 提供商(DeepSeek、Qwen、Ollama、vLLM、Nous 等)上運行的編碼代理 — 兄弟技能 claude-codecodex 綁定於單一供應商。
  • 在工作空間內進行多步文件編輯 + Shell 命令。

對於 Claude 原生場景,首選 claude-code。對於 OpenAI 原生場景,首選 codex。對於 Hermes 原生子代理,使用 delegate_task

先決條件

  1. 安裝上游依賴(需要 Python 3.12+ 和 uv):

    terminal(command="uv tool install openhands --python 3.12")

    驗證:openhands --version(撰寫本文時為 OpenHands CLI 1.16.0 / SDK v1.21.0)。

  2. 選擇模型併為 --override-with-envs 設置環境變量:

    export LLM_MODEL=openrouter/openai/gpt-4o-mini       # or any LiteLLM slug
    export LLM_API_KEY=$OPENROUTER_API_KEY
    export LLM_BASE_URL=https://openrouter.ai/api/v1 # omit for native OpenAI

    LLM_MODEL 使用 LiteLLM 的完整 slug。當提供商為 OpenRouter 時,slug 具有雙重前綴:openrouter/<vendor>/<model>(例如 openrouter/anthropic/claude-sonnet-4.5)。對於原生 Anthropic:anthropic/claude-sonnet-4-5。對於原生 OpenAI:openai/gpt-4o-mini

  3. 抑制啟動橫幅,以免 JSON 輸出前出現 ASCII 藝術字:

    export OPENHANDS_SUPPRESS_BANNER=1

如何運行

始終通過 terminal 工具調用。始終傳遞 --headless --json --override-with-envs --exit-without-confirmation 以實現自動化。

一次性任務

terminal(
command="OPENHANDS_SUPPRESS_BANNER=1 LLM_MODEL=openrouter/openai/gpt-4o-mini LLM_API_KEY=$OPENROUTER_API_KEY LLM_BASE_URL=https://openrouter.ai/api/v1 openhands --headless --json --override-with-envs --exit-without-confirmation -t 'Add error handling to all API calls in src/'",
workdir="/path/to/project",
timeout=600
)

長時間任務的後臺運行

terminal(command="<same as above>", workdir="/path/to/project", background=true, notify_on_complete=true)
process(action="poll", session_id="<id>")
process(action="log", session_id="<id>")

恢復之前的對話

OpenHands 在每次運行結束時打印 Conversation ID: <32-hex>Hint: openhands --resume <dashed-uuid> 行。使用帶連字符的形式進行恢復:

terminal(
command="OPENHANDS_SUPPRESS_BANNER=1 LLM_MODEL=... openhands --headless --json --override-with-envs --exit-without-confirmation --resume <dashed-uuid> -t 'Now fix the bug you found'",
workdir="/path/to/project"
)

實際標誌列表

已針對 openhands --help(CLI 1.16.0)進行驗證。不在此表中的任何內容都不是標誌 — 請通過環境變量或設置文件傳遞。

標誌效果
--headless無 UI,需要 -t-f。自動批准所有操作(此模式下無 --llm-approve)。
--jsonJSONL 事件流(需要 --headless)。
-t TEXT任務提示。
-f PATH從文件讀取任務。
--resume [ID]恢復對話。無 ID → 列出最近的內容。
--last恢復最近的對話(與 --resume 一起使用)。
--override-with-envs應用 LLM_API_KEY / LLM_BASE_URL / LLM_MODEL 環境變量。如果沒有此標誌,OpenHands 將使用 ~/.openhands/settings.json 並忽略環境變量。
--exit-without-confirmation不顯示“你確定嗎”退出對話框。
--always-approve / --yolo自動批准每個操作(--headless 模式下的默認行為)。
--llm-approve基於 LLM 的安全網關(僅交互式 — 在無頭模式下不起作用)。
--version / -v打印版本並退出。

沒有 --model--max-iterations--workspace--sandbox--sandbox-type 標誌。 模型由 LLM_MODEL 指定。工作區是你傳遞給 terminal 工具的 workdir。沙箱/運行時由 RUNTIMESANDBOX_VOLUMES 環境變量指定。

JSON 事件架構

使用 --json --headless 時,OpenHands 發出 JSONL — 每行一個 JSON 對象,加上少量非 JSON 狀態行(Initializing agent...Agent is workingAgent finished、最終摘要框、Goodbye!Conversation ID:Hint:)。過濾以 { 開頭的行。

頂層 kind 字段用於區分事件:

  • MessageEvent — 用戶/代理文本輪次。sourceuseragent
  • ActionEvent — 代理選擇了工具。讀取 tool_namefile_editorterminalfinish)和 action.kindFileEditorActionTerminalActionFinishAction)。
  • ObservationEvent — 工具結果。observation.is_error 是成功標誌。sourceenvironment
  • ActionEvent 內的 FinishActionaction.message 中攜帶代理的最終消息。

CLI 首先打印來自 LiteLLM/Authlib 的所有 stderr — 參見陷阱。僅逐行解析 stdout,忽略不以 { 開頭的行。

陷阱

  • 每次調用都有 LiteLLM 警告。 CLI 將 bedrock-runtimesagemaker-runtime 警告打印到 stderr,因為未安裝 botocore。此外還有 Authlib 棄用警告。這些是噪音,並非失敗。將 stderr 重定向到 /dev/null 或在向用戶顯示之前將其過濾掉。
  • 橫幅垃圾信息。 如果不設置 OPENHANDS_SUPPRESS_BANNER=1,每次運行開始時都會出現一個多行的 +--+ ASCII 框來宣傳 SDK。請始終導出該環境變量。
  • 自動化必須使用 --override-with-envs 如果不使用它,OpenHands 會忽略 LLM_API_KEY / LLM_BASE_URL / LLM_MODEL 並回退到 ~/.openhands/settings.json。在全新安裝時,此文件不存在,CLI 會掛起以等待首次運行設置。
  • 模型 slug 是 LiteLLM 的,而非提供商的。 openrouter/openai/gpt-4o-mini 有效;而指向 OpenRouter 時使用 openai/gpt-4o-mini 則無效。anthropic/claude-sonnet-4-5(連字符)是原生 Anthropic;openrouter/anthropic/claude-sonnet-4.5(點號)是通過 OpenRouter。如果弄錯,會導致晦澀的 LiteLLM 400 錯誤。
  • pip install openhands-ai 是錯誤的包。 那是遺留的 V0 SDK。新的 CLI 安裝命令是 uv tool install openhands --python 3.12。沒有維護中的 conda 包。
  • 恢復 ID 格式很棘手。 CLI 結束時顯示 Conversation ID: f46573d9cfdb45e492ca189bde40019b(無連字符),然後顯示 Hint: openhands --resume f46573d9-cfdb-45e4-92ca-189bde40019b(有連字符)。請使用帶連字符的形式。
  • 無頭模式忽略 --llm-approve 如果傳遞該參數,你會收到 argparse 錯誤。無頭模式硬編碼為始終批准。
  • 上游不支持 Windows。 OpenHands 文檔要求在 Windows 上使用 WSL。因此,此技能限定為 [linux, macos]
  • ~/.openhands/conversations/<id>/ 會累積。 每次運行都會持久化軌跡。如果批量運行,請清理它。
  • 安裝量大(約 200 個包)。 使用 uv tool install(隔離的虛擬環境)以避免與當前項目的依賴衝突。

驗證

terminal(
command="OPENHANDS_SUPPRESS_BANNER=1 LLM_MODEL=openrouter/openai/gpt-4o-mini LLM_API_KEY=$OPENROUTER_API_KEY LLM_BASE_URL=https://openrouter.ai/api/v1 openhands --headless --json --override-with-envs --exit-without-confirmation -t 'Print the string OPENHANDS_OK to stdout via the terminal tool.'",
workdir="/tmp",
timeout=120
)

如果 JSONL 流以 FinishAction 結尾,且其 action.message 提及 OPENHANDS_OK,則安裝成功。

  • OpenHands GitHub
  • OpenHands CLI 命令參考
  • 同級技能:claude-code(僅限 Anthropic)、codex(僅限 OpenAI)、opencode(通過 OpenCode 支持多提供商)、hermes-agent(通過 delegate_task 的 Hermes 子代理)。