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-code和codex綁定於單一供應商。 - 在工作空間內進行多步文件編輯 + Shell 命令。
對於 Claude 原生場景,首選 claude-code。對於 OpenAI 原生場景,首選 codex。對於 Hermes 原生子代理,使用 delegate_task。
先決條件
-
安裝上游依賴(需要 Python 3.12+ 和
uv):terminal(command="uv tool install openhands --python 3.12")驗證:
openhands --version(撰寫本文時為OpenHands CLI 1.16.0/SDK v1.21.0)。 -
選擇模型併為
--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 OpenAILLM_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。 -
抑制啟動橫幅,以免 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)。 |
--json | JSONL 事件流(需要 --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。沙箱/運行時由 RUNTIME 和 SANDBOX_VOLUMES 環境變量指定。
JSON 事件架構
使用 --json --headless 時,OpenHands 發出 JSONL — 每行一個 JSON 對象,加上少量非 JSON 狀態行(Initializing agent...、Agent is working、Agent finished、最終摘要框、Goodbye!、Conversation ID:、Hint:)。過濾以 { 開頭的行。
頂層 kind 字段用於區分事件:
MessageEvent— 用戶/代理文本輪次。source為user或agent。ActionEvent— 代理選擇了工具。讀取tool_name(file_editor、terminal、finish)和action.kind(FileEditorAction、TerminalAction、FinishAction)。ObservationEvent— 工具結果。observation.is_error是成功標誌。source為environment。ActionEvent內的FinishAction在action.message中攜帶代理的最終消息。
CLI 首先打印來自 LiteLLM/Authlib 的所有 stderr — 參見陷阱。僅逐行解析 stdout,忽略不以 { 開頭的行。
陷阱
- 每次調用都有 LiteLLM 警告。 CLI 將
bedrock-runtime和sagemaker-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 子代理)。