OpenHands-CLI-Einführung: Installation, Flags, Headless-Modus
CLI-Installation, Flags, Headless, lokale Modelle
OpenHands ist ein Open-Source-Coding-Agent, der Dateien bearbeitet und Befehle in einer Sandbox ausführt. Dieser CLI-Schnellstart wurde am 26.10.2026 anhand des Pakets 1.16.0 überprüft.
Das Paket auf PyPI ist openhands 1.16.0, hochgeladen am 8. Mai 2026 und festgelegt auf openhands-sdk==1.21.0. Das README mit diesem Tag erfordert Python 3.12 und uv 0.11.6 oder neuer. Das README des Standard-Zweigs von OpenHands-CLI besagt, dass dieses Repository nicht mehr aktiv gepflegt wird und neue Installationen zu Agent Canvas weiterleitet. Der Headless-Modus und openhands acp sind weiterhin Teil des Befehlssets von 1.16.0.

Der Guide zu KI-Entwicklungstools folgt den anderen Terminal-Agenten auf dieser Website. Diese Seite behandelt die OpenHands-CLI: Installation, Einstellungsdateien, lokale Modell-URLs und die Flags, die ein Skript tatsächlich übergeben wird.
Was die CLI ist
Ein KI-Coding-Assistent generiert oder bearbeitet typischerweise Code aus einem Prompt. OpenHands erweitert dies zu einer Agenten-Schleife: planen, eine Aktion wie das Schreiben einer Datei oder das Ausführen eines Tests durchführen, das Ergebnis beobachten und fortsetzen. Das Projekt hieß zuvor OpenDevin. Die OpenHands-Paper beschreibt eine docker-basierte Laufzeitumgebung mit Shell- und Browserzugriff, was das Ausführungsmodell ist, das die CLI weiterhin kapselt.
Die Version 1.16.0 dokumentiert fünf Arten, diese Schleife auszuführen.
| Modus | Befehl | Verwendung |
|---|---|---|
| Terminal-UI | openhands |
Interaktive Sitzung. Bittet vor jeder Aktion um Genehmigung, sofern kein Freigabe-Flag übergeben wird. |
| Headless | openhands --headless -t "task" |
CI und Skripte. Erfordert --task oder --file. Genehmigt Aktionen immer. |
| ACP | openhands acp |
Agent Client Protocol-Server für Zed, JetBrains, Toad und die VS Code ACP-Erweiterung. |
| Browser-TUI | openhands web |
Dieselbe CLI im Browser. Standard-Bindung ist 0.0.0.0:12000. |
| Legacy-GUI | openhands serve |
Docker-GUI aus dem CLI-Startprogramm. Standard-URL http://localhost:3000. |
Agent Canvas, die von dem Projekt aktuell dokumentierte Installation
Am 3. Juni 2026 setzte die OpenHands-FAQ die Terminal-UI in einen Wartungsmodus bis zum 1. Oktober 2026 und erklärte, dass der Headless-Modus und ACP vollständig unterstützt bleiben. Die lokale GUI (openhands serve) sollte im Wartungsmodus bleiben, bis Agent Canvas isolierte, ephemere Sandboxes ausführen konnte. Diese FAQ definiert Wartung als Abhängigkeitsupdates, kritische Fehlerbehebungen und neue LLMs. Das Haupt-Repository von OpenHands veröffentlichte Agent Canvas 1.33.0 am 23. Oktober 2026.
agent-canvas startet die aktuelle UI und deren Backend. openhands serve startet die Legacy-GUI und startet Agent Canvas nicht.
Agent Canvas benötigt Node.js 24 oder neuer und uv. Erster Start ohne globale Installation:
npx @openhands/agent-canvas
Der Prozess lauscht auf http://localhost:8000. Das Schließen dieses Terminals stoppt das lokale Backend. Eine globale Installation erfolgt über npm install -g @openhands/agent-canvas, danach agent-canvas. Der npm-Pfad führt den Agent-Server als Ihr Benutzer aus, sodass der Agent mit den Berechtigungen Ihres Kontos auf lokale Dateien zugreifen kann.
Der Docker-Pfad veröffentlicht den Port nur auf localhost und mountet ein Projektverzeichnis:
mkdir -p ~/projects
docker run -it --rm \
-p 127.0.0.1:8000:8000 \
-v openhands-data:/home/openhands/.openhands \
-v ~/projects:/projects \
ghcr.io/openhands/agent-canvas:latest
Der Container liefert die UI unter http://localhost:8000/canvas. Der benannte Volume openhands-data bewahrt die Einstellungen nach --rm auf. Auf Linux schlägt das Bind-Mounten von ~/.openhands in dieses Image mit unable to open database file fehl: Der Container-Benutzer ist UID 10001, und ein Host-Verzeichnis ist normalerweise Ihrem eigenen UID zugeordnet. Die Installationsseite verwendet aus diesem Grund das benannte Volume. Bereits in ~/.openhands vorhandene Einstellungen werden nicht in ein neues Volume kopiert.
Installation der OpenHands-CLI
Verwenden Sie die CLI, wenn Sie weiterhin openhands --headless oder openhands acp wünschen. Das veröffentlichte Rad wird nur auf Python 3.12 installiert (==3.12.* auf PyPI). uv muss 0.11.6 oder neuer sein. Auf Windows sagt die Installationsseite, die Befehle in WSL (Ubuntu) auszuführen.
Installation mit uv
uv tool install openhands --python 3.12
openhands
Upgraden mit derselben Interpreter-Festlegung:
uv tool upgrade openhands --python 3.12
Die lokale Setup-Seite sagt, dass uv die CLI vom Projekt-Virtualenv isoliert und dass die standardmäßigen MCP-Server dies erfordern.
Installation der Standalone-Binary
curl -fsSL https://install.openhands.dev/install.sh | sh
openhands
Auf macOS kann ein Gatekeeper-Dialog die Binary blockieren („openhands kann nicht geöffnet werden, da Apple sie nicht auf schädliche Software prüfen kann“). Der Pfad auf der Installationsseite ist Systemeinstellungen, Datenschutz & Sicherheit, dann „Trotzdem erlauben“ unter Sicherheit, danach openhands erneut ausführen.
CLI über Docker ausführen
Der Container auf der Installationsseite setzt AGENT_SERVER_IMAGE_TAG auf das agent-server-Image. Das uv tool install openhands im Inneren des Containers ist die PyPI-CLI. Der Tag in diesem Beispiel, für diese Seite überprüft, ist 1.26.0-python. Ältere Kopien dieses Befehls verwendeten 1.12.0-python.
export SANDBOX_VOLUMES="$PWD:/workspace"
docker run -it \
--pull=always \
-e AGENT_SERVER_IMAGE_REPOSITORY=ghcr.io/openhands/agent-server \
-e AGENT_SERVER_IMAGE_TAG=1.26.0-python \
-e SANDBOX_USER_ID=$(id -u) \
-e SANDBOX_VOLUMES=$SANDBOX_VOLUMES \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands:/root/.openhands \
--add-host host.docker.internal:host-gateway \
--name openhands-cli-$(date +%Y%m%d%H%M%S) \
python:3.12-slim \
bash -c "pip install uv && uv tool install openhands --python 3.12 && openhands"
SANDBOX_USER_ID=$(id -u) stellt sicher, dass der Sandbox-Benutzer dem Host-Benutzer entspricht, damit der Agent keine root-gesicherten Dateien im gemounteten Workspace hinterlässt. SANDBOX_VOLUMES ist das Verzeichnis, auf das der Agent zugreifen darf.
OPENHANDS_VERSION wählt die Docker-Image-Version für openhands serve. Sie ändert nicht die PyPI-CLI-Version.
Einstellungsdateien
Beim ersten Start fragt die CLI nach den Model-Einstellungen und schreibt diese unter ~/.openhands/. Das README von 1.16.0 und die Befehlsreferenz benennen diese Dateien:
| Datei | Inhalt |
|---|---|
~/.openhands/agent_settings.json |
Persistierte Agenten-Spezifikation, einschließlich des LLM-Blocks und der Kondensator-Konfiguration |
~/.openhands/cli_config.json |
CLI-Präferenzen, einschließlich, ob der Kritiker aktiviert ist |
~/.openhands/mcp.json |
MCP-Server-Definitionen |
~/.openhands/conversations/ |
Gesprächsverlauf |
Die Installationsseite sagt Docker-Benutzern nach wie vor, ~/.openhands/settings.json vorzubereiten. Das CLI-README und AgentStore im Baum von 1.16.0 persistieren die Agenten-Spezifikation in agent_settings.json. Eine CLI-Installation, die den Dateinamen der Installationsseite übersprang und agent_settings.json schrieb, entspricht dieser Quelle.
create_and_save_from_settings baut zwei LLM-Objekte aus demselben Modell, API-Schlüssel und Basis-URL: eines für den Agenten und eines für den zusammenfassenden Kondensator. Daher wiederholt eine gespeicherte Datei die llm-Felder. Bearbeiten Sie die Agentendatei mit einem beliebigen Editor:
nano ~/.openhands/agent_settings.json
LLM_API_KEY, LLM_MODEL und LLM_BASE_URL werden ignoriert, es sei denn, Sie entscheiden sich dafür. Das Überschreiben wird nicht gespeichert:
export LLM_MODEL="gpt-4o"
export LLM_API_KEY="your-api-key"
openhands --override-with-envs
OPENHANDS_CLOUD_URL setzt den Standard-Cloud-Server. Die Befehle cloud und login verwenden standardmäßig https://app.all-hands.dev, wenn diese Variable nicht gesetzt ist.
Upgrades von einer CLI älter als 1.0.0 erfordern, dass die Einstellungen erneut eingegeben werden. Die Installationsseite besagt, dass das Konfigurationsformat bei 1.0.0 geändert wurde.
Lokale Modelle
Der Local-LLM-Guide vom 21. Mai 2026 empfiehlt Qwen3.6-35B-A3B als erstes lokales Modell zum Ausprobieren. Er erfordert eine GPU mit mindestens 24GB VRAM für ein quantisiertes Build oder einen Apple-Silicon-Mac mit mindestens 64GB Unified Memory. Dieselbe Seite sagt, die Kontextlänge auf mindestens 22000 Tokens zu setzen, und dass Ollamas Standard von 4096 für den System-Prompt zu klein ist.
Wenn der Agent niemals Tools aufruft, behandelt der Guide dies als Modellgrenze und nennt Community-Berichte für qwen2.5-coder-14b-instruct und qwopus3.5-27b-v3. Die Vergleichstabelle für lokalen Hosting-Dienst ist die server-spezifische Tabelle, wenn Ollama, vLLM, LM Studio oder LocalAI noch eine offene Option ist.
Ollama
Das Ollama-Startkommando des Guides setzt die Kontextlänge vor ollama serve. Der Ollama CLI Spickzettel behandelt serve, run und ps neben dieser Variable.
OLLAMA_CONTEXT_LENGTH=32768 OLLAMA_HOST=0.0.0.0:11434 OLLAMA_KEEP_ALIVE=-1 ollama serve
ollama pull qwen3.6:35b-a3b
Für OpenHands, die in Docker läuft, sind die Einstellungen des Guides: Custom Modell openai/qwen3.6:35b-a3b, Basis-URL http://host.docker.internal:11434/v1 und jeder Platzhalter-API-Schlüssel. Eine CLI, die auf demselben Host wie Ollama läuft, verwendet stattdessen http://127.0.0.1:11434/v1 anstelle von host.docker.internal. Linux LM Studio und andere nur Loopback-fähige Server sind aus einem Container heraus nicht über 127.0.0.1 erreichbar; die Prüfung des Guides besteht darin, das Servicing im lokalen Netzwerk zu aktivieren und host.docker.internal aus dem Inneren des Containers zu testen.
Die Terminal-Seite öffnet diesen Bildschirm mit Ctrl+P, dann Einstellungen. Ein gespeichertes CLI-Profil verwendete eine ollama/-Modell-ID und eine Basis-URL ohne /v1:
- Custom Modell:
ollama/devstral-small-2:24b - Basis-URL:
http://localhost:11434

Diese Devstral-Small-2-Sitzung ist diejenige, die immer wieder aufhörte. Die für sie eingetragenen Felder, sowohl im Agenten-LLM als auch im Kondensator-LLM, waren:
"llm": {
"model": "ollama/devstral-small-2:24b",
"api_key": "aaa",
"base_url": "http://localhost:11434"
}
llama.cpp und vLLM
llama.cpp verwendete das OpenAI-kompatible Präfix und eine /v1-Basis-URL, ebenfalls in beiden LLM-Objekten:
"model": "openai/Qwen3.5-35B-A3B-UD-IQ3_S.gguf""base_url": "http://localhost:8080/v1"
Der Server-Befehl, mit Flags, die im llama.cpp-Schnellstart behandelt werden, war:
./llama.cpp/llama-server \
-m /mnt/ggufs/Qwen3.5-35B-A3B-UD-IQ3_S.gguf \
--ctx-size 70000 \
-ngl 40 \
--temp 0.6 \
--top-p 0.95 \
--top-k 20 \
--min-p 0.00
Gegenüber diesem Server beendete die CLI einen Go IndexNow-Client: Quelle, ein ausführbares File und ein README. Der Task-Text war create for me a cli tool in Go, that would call bing and other search engines' indexnow endpoints to notify about changes on my website.
Das vLLM-Beispiel des Local-LLM-Guides für das neuere Qwen3.6-Modell ist ein Serve auf zwei GPUs. Der vLLM-Schnellstart behandelt die Flags von vllm serve und Speicherüberlauf-Prüfungen. Die entsprechende OpenHands-Modellzeichenfolge des Guides ist openai/Qwen3.6-35B-A3B, mit Basis-URL http://host.docker.internal:8000/v1 und demselben --api-key, mit dem der Server gestartet wurde (mykey in ihrem Beispiel).
vllm serve Qwen/Qwen3.6-35B-A3B \
--host 0.0.0.0 --port 8000 \
--api-key mykey \
--tensor-parallel-size 2 \
--served-model-name Qwen3.6-35B-A3B \
--enable-prefix-caching
Interaktive Steuerung
openhands ohne Unterbefehl öffnet die Terminal-UI. Die Terminal-Seite listet diese Steuerungen auf:
| Steuerung | Aktion |
|---|---|
Ctrl+P |
Befehls-Palette. Einstellungen, MCP-Status, Verlauf, Plan, Theme, Beenden. |
Esc |
Den laufenden Agenten pausieren. |
Ctrl+Q oder /exit |
Die CLI verlassen. |
Slash-Befehle aus der Befehlsreferenz: /help, /new, /history, /confirm, /condense, /skills, /feedback, /exit. Modellwechsel über den Settings-Eintrag der Palette werden ohne Neustart angewendet. --exit-without-confirmation überspringt den Beendigungsdialog. --exp wählt die textuelle UI und ist als Kompatibilitäts-Flag dokumentiert, da diese UI bereits der Standard ist.
Flags und Unterbefehle
openhands [OPTIONS] [COMMAND]
Globale Optionen in der Befehlsreferenz, geprüft gegen argparsers/util.py auf dem 1.16.0-Tag für die Freigabe- und Umgebungs-Flags:
| Option | Wirkung |
|---|---|
-v, --version |
Version anzeigen und beenden. |
-t, --task TEXT |
Das Gespräch mit dieser Aufgabe initialisieren. |
-f, --file PATH |
Das Gespräch aus einer Datei initialisieren. |
--resume [ID] |
Dieses Gespräch fortsetzen. Ohne ID die jüngsten auflisten. |
--last |
Mit --resume das jüngste Gespräch fortsetzen. |
--headless |
Keine UI. Erfordert --task oder --file. Genehmigt immer. |
--json |
JSONL-Eventstrom. Erfordert --headless. |
--always-approve, --yolo |
Jede Aktion genehmigen. Gegenseitig ausschließend mit --llm-approve. |
--llm-approve |
Nur Aktionen bestätigen, die der LLM-Sicherheitsanalysator als hohes Risiko markiert. |
--override-with-envs |
LLM_API_KEY, LLM_MODEL und LLM_BASE_URL für diesen Prozess anwenden. |
--exit-without-confirmation |
Beenden ohne Bestätigungsdialog. |
--always-approve und --llm-approve können nicht kombiniert werden. Der Standard-Interaktionsmodus fragt vor Aktionen.
Unterbefehle, die zum Einsatz kommen, wenn die TUI nicht ausreicht:
openhands servestartet die Legacy-GUI in Docker.--mount-cwdmountet das aktuelle Verzeichnis unter/workspace.--gpuschaltet nvidia-docker ein.openhands webbedient die CLI im Browser.--hoststandardmäßig0.0.0.0,--portstandardmäßig12000,--debugist aus.openhands acpspricht Agent Client Protocol über stdio. Flags:--resume,--last,--always-approve,--llm-approve,--streaming.openhands cloud -t "task"öffnet ein Cloud-Gespräch.--server-urlüberschreibthttps://app.all-hands.dev.openhands loginundopenhands logoutverwalten dieses Cloud-Konto.logoutohne--server-urlmeldet sich bei jedem gespeicherten Server ab.openhands mcpverwaltet Server:add,list,get,remove,enable,disable.adderfordert--transportvonhttp,sseoderstdio.
Ein MCP-Server aus dem README von 1.16.0:
openhands mcp list
openhands mcp add tavily --transport stdio \
npx -- -y mcp-remote "https://mcp.tavily.com/mcp/?tavilyApiKey=<your-api-key>"
openhands mcp enable tavily
openhands mcp disable tavily
Beispiele
Interaktive Aufgabe
openhands -t "Fix the bug in auth.py and add a regression test"
Aufgaben-Datei
cat > task.txt << 'EOF'
Refactor the database connection module.
Add unit tests and ensure the test suite passes.
EOF
openhands -f task.txt
Headless, einschließlich JSONL
Der Headless-Modus erfordert --task oder --file. Er läuft immer im always-approve-Modus, und --llm-approve wird dort abgelehnt. Behandeln Sie das Arbeitsverzeichnis so, als könnte der Agent es frei modifizieren.
openhands --headless -t "Add unit tests for auth.py and run them"
openhands --headless --json -t "Create a simple Flask app with healthcheck endpoint" > openhands-output.jsonl
Die Headless-Seite beschreibt --json als ein JSON-Objekt pro Event, gestreamt als JSONL.
Fortsetzen
openhands --resume
openhands --resume --last
openhands --resume abc123def456
Browser-TUI, gebunden an localhost
openhands web ist standardmäßig auf 0.0.0.0:12000 gebunden, was aus dem Netzwerk erreichbar ist. Die CLI-Dokumente sagen, dass dieses Interface die volle Fähigkeit der CLI hat, daher ist eine nur-lokale Bindung die sicherere Standardvorgabe:
openhands web --host 127.0.0.1 --port 12000
ACP für einen Editor
Die ACP-Clients der IDE-Seite sind Zed und JetBrains (nativ), Toad (nativ) und VS Code (Community-Erweiterung). Der Editor startet openhands acp und kommuniziert über stdio mit JSON-RPC 2.0, wobei die gespeicherten LLM-Einstellungen der CLI verwendet werden.
openhands acp
openhands acp --llm-approve
openhands acp --resume --last
Freigabe, Exit-Codes und Ergebnisse lokaler Modelle
Interaktive Sitzungen fragen vor Aktionen. /confirm ändert diese Richtlinie in der Sitzung. --always-approve (Alias --yolo) genehmigt alles. --llm-approve fragt nur nach für Aktionen, die der Sicherheitsanalysator als hohes Risiko bewertet. Der Headless-Modus ist immer-approve für den gesamten Lauf.
openhands serve --mount-cwd mountet das aktuelle Verzeichnis unter /workspace im Inneren des Legacy-GUI-Containers. Der Docker-CLI-Flow verwendet SANDBOX_VOLUMES für dieselbe Grenze.
Exit-Codes in der Befehlsreferenz:
| Code | Bedeutung |
|---|---|
| 0 | Erfolg |
| 1 | Fehler oder die Aufgabe fehlgeschlagen |
| 2 | Ungültige Argumente |
Devstral-Small-2 24B auf Ollama hat in dieser CLI immer wieder gestoppt.

Die oben erwähnte llama.cpp-Sitzung, Qwen3.5-35B-A3B mit einem 70000-Token-Kontext, hat die IndexNow-Aufgabe abgeschlossen. Für einen Terminal-Agenten, der auf derselben Maschine weiterarbeitete, ist der OpenCode-Schnellstart die Installation und das Provider-Setup.