
OpenHands CLI
FreeDelegate coding tasks to any LiteLLM-supported provider.
Free · Opens the source repo
What OpenHands CLI does
OpenHands CLI is a versatile command-line interface designed for developers who need to delegate coding tasks efficiently. This tool is model-agnostic, meaning it can operate with any provider that supports LiteLLM, such as OpenAI, Anthropic, and others. By utilizing OpenHands, users can automate coding tasks and interact with their coding environment without being restricted to a single vendor. This flexibility allows for greater experimentation and optimization of workflows, particularly in environments that leverage multiple AI models.
The skill operates in headless mode, which is ideal for batch processing or executing one-off commands without the need for an interactive UI. This is particularly useful for developers who want to integrate coding tasks into scripts or automated workflows. To use OpenHands, you simply invoke it through the terminal tool, passing the necessary environment variables and commands to execute coding tasks. The command structure supports both immediate execution and background processing, making it suitable for long-running tasks as well.
OpenHands also supports resuming previous sessions, allowing developers to continue working on tasks without losing context. This feature is essential for complex projects where tasks may need to be revisited or modified over time. The CLI is designed to handle multi-step file edits and shell commands, making it a powerful tool for developers looking to streamline their coding processes.
Overall, OpenHands CLI is a practical solution for developers seeking a flexible and efficient way to delegate coding tasks across various AI models. It is particularly beneficial for those who work in diverse environments that require the use of multiple AI providers, offering a robust alternative to vendor-specific solutions.
When to use it
Use OpenHands CLI when you need to delegate coding tasks to a LiteLLM-supported provider, especially in automated workflows.
When not to use it
This skill is not suitable for users who prefer an interactive UI or are working exclusively with a single vendor's tools.
What you can build with it
Batch Processing Tasks
Use OpenHands CLI to automate multiple coding tasks in one go, streamlining your development workflow.
Integrate with CI/CD Pipelines
Incorporate OpenHands into your CI/CD pipelines to delegate coding tasks automatically during deployment.
Resume Previous Work
Easily resume previous coding tasks using the conversation ID, ensuring continuity in your development efforts.
How to install OpenHands CLI
View source1. Install with the skills CLI
npx skills add nousresearch/hermes-agent/openhands --agent claude-code2. Or install it manually
Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.
Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs
Inside SKILL.md
Written by nousresearchOpenHands CLI
Delegate coding tasks to the OpenHands CLI via the terminal tool. OpenHands is model-agnostic: any LiteLLM-supported provider (OpenAI, Anthropic, OpenRouter, DeepSeek, Ollama, vLLM, etc.).
This skill is the headless-mode wrapper for batch / one-shot delegation. The interactive textual UI is not used from Hermes.
When to Use
- User wants a coding task delegated to OpenHands specifically.
- User wants a coding agent that can run on a non-Anthropic / non-OpenAI provider (DeepSeek, Qwen, Ollama, vLLM, Nous, etc.) — sibling skills
claude-codeandcodexare tied to one vendor. - Multi-step file edits + shell commands inside a workspace.
For Claude-native, prefer claude-code. For OpenAI-native, prefer codex. For Hermes-native subagents, use delegate_task.
Prerequisites
-
Install upstream (requires Python 3.12+ and
uv):terminal(command="uv tool install openhands --python 3.12")Verify:
openhands --version(currentlyOpenHands CLI 1.16.0/SDK v1.21.0at time of writing). -
Pick a model and set env vars for
--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_MODELuses LiteLLM's full slug. When the provider is OpenRouter the slug is doubly-prefixed:openrouter/<vendor>/<model>(e.g.openrouter/anthropic/claude-sonnet-4.5). For native Anthropic:anthropic/claude-sonnet-4-5. For native OpenAI:openai/gpt-4o-mini. -
Suppress the startup banner so JSON output isn't preceded by ASCII art:
export OPENHANDS_SUPPRESS_BANNER=1
How to Run
Always invoke through the terminal tool. Always pass --headless --json --override-with-envs --exit-without-confirmation for automation.
One-shot task
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
)
Background for long tasks
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>")
Resume a previous conversation
OpenHands prints Conversation ID: <32-hex> and a Hint: openhands --resume <dashed-uuid> line at the end of each run. Use the dashed form to resume:
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"
)
Real Flag List
Verified against openhands --help (CLI 1.16.0). Anything not in this table is not a flag — pass it via env var or settings file.
| Flag | Effect |
|---|---|
--headless | No UI, requires -t or -f. Auto-approves all actions (no --llm-approve in this mode). |
--json | JSONL event stream (requires --headless). |
-t TEXT | Task prompt. |
-f PATH | Read task from file. |
--resume [ID] | Resume conversation. No ID → list recent. |
--last | Resume most recent (with --resume). |
--override-with-envs | Apply LLM_API_KEY / LLM_BASE_URL / LLM_MODEL env vars. Without this, OpenHands uses ~/.openhands/settings.json and ignores the env. |
--exit-without-confirmation | Don't show the "are you sure" exit dialog. |
--always-approve / --yolo | Auto-approve every action (default in --headless). |
--llm-approve | LLM-based security gate (interactive only — does NOT work in headless). |
--version / -v | Print version and exit. |
There is no --model, --max-iterations, --workspace, --sandbox, --sandbox-type flag. Model is LLM_MODEL. Workspace is the workdir you pass to the terminal tool. Sandbox / runtime is the RUNTIME and SANDBOX_VOLUMES env vars.
JSON Event Schema
With --json --headless, OpenHands emits JSONL — one JSON object per line, plus a handful of non-JSON status lines (Initializing agent..., Agent is working, Agent finished, the final summary box, Goodbye!, Conversation ID:, Hint:). Filter for lines starting with {.
Top-level kind field discriminates events:
MessageEvent— user / agent text turn.sourceisuseroragent.ActionEvent— agent picked a tool. Readtool_name(file_editor,terminal,finish) andaction.kind(FileEditorAction,TerminalAction,FinishAction).ObservationEvent— tool result.observation.is_erroris the success flag.sourceisenvironment.FinishActioninside anActionEventcarries the agent's final message inaction.message.
The cli prints all stderr from LiteLLM/Authlib first — see Pitfalls. Parse only stdout, line by line, ignoring lines that don't start with {.
Pitfalls
- LiteLLM warnings on every invocation. The CLI prints
bedrock-runtimeandsagemaker-runtimewarnings to stderr becausebotocoreisn't installed. Plus an Authlib deprecation. These are noise, not failures. Pipe stderr to/dev/nullor filter it out before showing the user. - Banner spam. Without
OPENHANDS_SUPPRESS_BANNER=1, every run starts with a multi-line+--+ASCII box advertising the SDK. Always export it. --override-with-envsis mandatory for automation. Without it, OpenHands ignoresLLM_API_KEY/LLM_BASE_URL/LLM_MODELand falls back to~/.openhands/settings.json. On a fresh install this file doesn't exist and the CLI hangs waiting for first-run setup.- Model slug is LiteLLM's, not the provider's.
openrouter/openai/gpt-4o-miniworks;openai/gpt-4o-miniwhile pointed at OpenRouter does not.anthropic/claude-sonnet-4-5(hyphen) is native Anthropic;openrouter/anthropic/claude-sonnet-4.5(dot) is via OpenRouter. Get it wrong → cryptic LiteLLM 400. pip install openhands-aiis the wrong package. That's the legacy V0 SDK. The new CLI isuv tool install openhands --python 3.12. There is no maintained conda package.- Resume ID format is fiddly. The CLI ends with
Conversation ID: f46573d9cfdb45e492ca189bde40019b(no dashes) and then aHint: openhands --resume f46573d9-cfdb-45e4-92ca-189bde40019b(with dashes). Use the dashed form. - Headless ignores
--llm-approve. If you pass it, you get an argparse error. Headless mode hardcodes always-approve. - No Windows support upstream. The OpenHands docs require WSL on Windows. This skill is gated
[linux, macos]accordingly. ~/.openhands/conversations/<id>/accumulates. Each run persists a trajectory. Clean it up if running batches.- Heavy install (~200 packages). Use
uv tool install(isolated venv) to avoid dependency conflicts with the active project.
Verification
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
)
If the JSONL stream ends with a FinishAction whose action.message mentions OPENHANDS_OK, the install is working.
Related
- OpenHands GitHub
- OpenHands CLI command reference
- Sibling skills:
claude-code(Anthropic-only),codex(OpenAI-only),opencode(multi-provider via OpenCode),hermes-agent(Hermes subagents viadelegate_task).
Frequently asked questions about OpenHands CLI
Similar skills
Rhino 3D Scripting
Streamline your Rhinoceros 3D scripting tasks.
MVVM Toolkit
Streamline ViewModel development with source generators.
FreeCAD Scripts
Generate Python scripts for FreeCAD automation and modeling.
Azure Architecture Builder
Design and deploy Azure infrastructure using natural language.
Command Development
Streamline your command creation for Claude Code.
Create Cowork Plugin
Easily build and package plugins through guided sessions.
