Skip to content

feat(skills): add optional openhands skill — closes #477#32261

Merged
teknium1 merged 1 commit into
mainfrom
hermes/hermes-f4407bd2
May 25, 2026
Merged

feat(skills): add optional openhands skill — closes #477#32261
teknium1 merged 1 commit into
mainfrom
hermes/hermes-f4407bd2

Conversation

@teknium1

@teknium1 teknium1 commented May 25, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds an optional openhands skill under optional-skills/autonomous-ai-agents/ so the agent can delegate coding tasks to the OpenHands CLI alongside claude-code / codex / opencode. OpenHands is the model-agnostic member of that family — any LiteLLM-supported provider (OpenAI, Anthropic, OpenRouter, DeepSeek, Ollama, vLLM, etc.).

Closes #477.

Why a ground-truth rewrite of #19325

#19325 (by @xzessmedia / Tim Koepsel) was drafted with OpenHands itself, and the LLM hallucinated several flags that don't exist in the real CLI:

PR claimed Reality
--model anthropic/claude-sonnet-4-5 No --model flag. Use LLM_MODEL env var.
--max-iterations N Not a flag.
--workspace <path> Not a flag. Workspace is the workdir you pass through.
--sandbox docker / --sandbox local Not flags. Sandbox is RUNTIME / SANDBOX_VOLUMES env.
pip install openhands-ai That's the legacy V0 SDK. Real install is uv tool install openhands --python 3.12.
conda install -c conda-forge openhands Doesn't exist.
openhands models subcommand Doesn't exist. Subcommands are acp/serve/web/mcp/cloud/login/logout/view.
platforms: [linux, macos, windows] (inherited from sibling skills) Upstream docs require WSL on Windows; no native support. Gated [linux, macos].

Rewrote from scratch against a verified install + a real --headless --json end-to-end run on openrouter/openai/gpt-4o-mini. Author credit preserved in the author: frontmatter (Tim Koepsel (xzessmedia), Hermes Agent) and via an AUTHOR_MAP entry in scripts/release.py. Original PR will be closed with credit + a link to this one.

Changes

File What
optional-skills/autonomous-ai-agents/openhands/SKILL.md New skill (~140 lines). Flag table verified against openhands --help (CLI 1.16.0 / SDK 1.21.0). Pitfalls section sourced from the real run.
website/docs/user-guide/skills/optional/autonomous-ai-agents/autonomous-ai-agents-openhands.md Auto-gen per-skill page (only the new one — other auto-gen drift discarded).
website/docs/reference/optional-skills-catalog.md One new row.
website/sidebars.ts One new entry under Optional → Autonomous AI Agents.
scripts/release.py AUTHOR_MAP entry for 3153586+xzessmedia@users.noreply.github.comxzessmedia.

Validation

Live install + end-to-end run in ~/scratch/openhands-spike/:

$ uv tool install openhands --python 3.12     # success
$ openhands --version                          # OpenHands CLI 1.16.0 (SDK v1.21.0)
$ OPENHANDS_SUPPRESS_BANNER=1 LLM_MODEL=openrouter/openai/gpt-4o-mini ... \
    openhands --headless --json --override-with-envs --exit-without-confirmation \
    -t 'Create a file hello.txt with the contents: Hello from OpenHands. Then list files.'
# → FileEditorAction (create) → TerminalAction (ls) → FinishAction. ~10s. Sub-cent.

$ ... --resume f46573d9-cfdb-45e4-92ca-189bde40019b -t 'Now read hello.txt'
# → FileEditorAction (view) → FinishAction with file contents. Resume verified.

Pitfalls landed in the SKILL because they hit during the spike — not because the upstream README mentioned them:

  • LiteLLM bedrock/sagemaker warnings on every invocation (stderr noise, botocore not installed)
  • Banner spam unless OPENHANDS_SUPPRESS_BANNER=1
  • --override-with-envs mandatory in headless or the CLI ignores LLM_* env vars and hangs on first-run setup
  • LiteLLM model slug double-prefix via OpenRouter (openrouter/anthropic/claude-sonnet-4.5, not anthropic/claude-sonnet-4-5)
  • Resume ID has two forms (32-hex vs dashed UUID); the dashed form is what --resume wants
  • --llm-approve is rejected in headless mode (argparse error)

Notes

  • Description: 59 chars (under the 60-char hardline).
  • Frontmatter follows current optional-skill convention: version: 0.1.0, license: MIT, platforms: [linux, macos], contributor-first author field.
  • Auto-gen docs regen produced ~80 drift edits across unrelated skills (link-prefix migration + 2 missing siblings); discarded per skill-salvage scope discipline. Only the openhands row / page / sidebar entry is touched.

Infographic

openhands-ground-truth-rewrite

Adds an optional autonomous-ai-agents skill that delegates coding tasks
to the OpenHands CLI (https://github.com/All-Hands-AI/OpenHands). Sits
alongside claude-code / codex / opencode and is the model-agnostic
option in that family — any LiteLLM-supported provider works.

This is a ground-truth rewrite of #19325 by @xzessmedia (Tim Koepsel).
The original PR's SKILL.md was drafted by the OpenHands agent itself and
hallucinated several flags that don't exist in the real CLI (\`--model\`,
\`--max-iterations\`, \`--workspace\`, \`--sandbox docker\`), pointed at
the wrong PyPI package (\`openhands-ai\`, which is the legacy V0 SDK),
and claimed native Windows support that the upstream docs explicitly
disclaim. Rather than cherry-pick and rewrite half the lines under
contributor authorship, the SKILL.md was rebuilt against a verified
install (\`uv tool install openhands --python 3.12\`) and a real
end-to-end \`--headless --json\` run against openrouter/openai/gpt-4o-mini.

Authorship credited via the \`author:\` frontmatter field and an
AUTHOR_MAP entry in scripts/release.py.

Changes:
- optional-skills/autonomous-ai-agents/openhands/SKILL.md (new)
- website/docs/user-guide/skills/optional/autonomous-ai-agents/autonomous-ai-agents-openhands.md (auto-gen)
- website/docs/reference/optional-skills-catalog.md (one new row)
- website/sidebars.ts (one new entry under Optional → Autonomous AI Agents)
- scripts/release.py (AUTHOR_MAP entry for xzessmedia)

Pitfalls documented in the SKILL came from running the tool, not from
the upstream README: LiteLLM bedrock/sagemaker stderr noise on every
invocation, banner spam (\`OPENHANDS_SUPPRESS_BANNER=1\` required),
\`--override-with-envs\` mandatory or the CLI ignores LLM_* env vars
entirely, the dashed-vs-undashed Conversation ID footgun for \`--resume\`,
LiteLLM model-slug double-prefix when going through OpenRouter.
@github-actions

Copy link
Copy Markdown
Contributor

🔎 Lint report: hermes/hermes-f4407bd2 vs origin/main

ruff

Total: 0 on HEAD, 0 on base (➖ 0)

🆕 New issues: none

✅ Fixed issues: none

Unchanged: 0 pre-existing issues carried over.

ty (type checker)

Total: 9347 on HEAD, 9347 on base (➖ 0)

🆕 New issues: none

✅ Fixed issues: none

Unchanged: 4946 pre-existing issues carried over.

Diagnostics are surfaced as warnings — this check never fails the build.

@teknium1 teknium1 merged commit 386f245 into main May 25, 2026
27 checks passed
@teknium1 teknium1 deleted the hermes/hermes-f4407bd2 branch May 25, 2026 21:49
@alt-glitch alt-glitch added type/feature New feature or request P3 Low — cosmetic, nice to have tool/skills Skills system (list, view, manage) labels May 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

P3 Low — cosmetic, nice to have tool/skills Skills system (list, view, manage) type/feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Feature: OpenHands Coding Agent Skill — Model-Agnostic Sandboxed Code Agent Delegation

2 participants