OpenHarness delivers core lightweight agent infrastructure: tool-use, skills, memory, and multi-agent coordination.
Join the community: contribute Harness for open agent development.
One Command (oh) to Launch OpenHarness and Unlock All Agent Harnesses.
Supports CLI agent integration including OpenClaw, nanobot, Cursor, and more.
β’ Streaming Tool-Call Cycle β’ API Retry with Exponential Backoff β’ Parallel Tool Execution β’ Token Counting & Cost Tracking |
β’ 43 Tools (File, Shell, Search, Web, MCP) β’ On-Demand Skill Loading (.md) β’ Plugin Ecosystem (Skills + Hooks + Agents) β’ Compatible with anthropics/skills & plugins |
β’ CLAUDE.md Discovery & Injection β’ Context Compression (Auto-Compact) β’ MEMORY.md Persistent Memory β’ Session Resume & History |
β’ Multi-Level Permission Modes β’ Path-Level & Command Rules β’ PreToolUse / PostToolUse Hooks β’ Interactive Approval Dialogs |
β’ Subagent Spawning & Delegation β’ Team Registry & Task Management β’ Background Task Lifecycle β’ ClawTeam Integration (Roadmap) |
An Agent Harness is the complete infrastructure that wraps around an LLM to make it a functional agent. The model provides intelligence; the harness provides hands, eyes, memory, and safety boundaries.
OpenHarness is an open-source Python implementation designed for researchers, builders, and the community:
- Understand how production AI agents work under the hood
- Experiment with cutting-edge tools, skills, and agent coordination patterns
- Extend the harness with custom plugins, providers, and domain knowledge
- Build specialized agents on top of proven architecture
- 2026-04-01 π¨ v0.1.0 β Initial OpenHarness open-source release featuring complete Harness architecture:
Start here: Quick Start Β· Provider Compatibility Β· Showcase Β· Contributing Β· Changelog
The fastest way to get started β a single command handles OS detection, dependency checks, and installation:
curl -fsSL https://raw.githubusercontent.com/HKUDS/OpenHarness/main/scripts/install.sh | bashOptions:
| Flag | Description |
|---|---|
--from-source |
Clone from GitHub and install in editable mode (pip install -e .) |
--with-channels |
Also install IM channel dependencies (slack-sdk, python-telegram-bot, discord.py) |
# Install from source (for contributors / latest code)
curl -fsSL https://raw.githubusercontent.com/HKUDS/OpenHarness/main/scripts/install.sh | bash -s -- --from-source
# Install with IM channel support
curl -fsSL https://raw.githubusercontent.com/HKUDS/OpenHarness/main/scripts/install.sh | bash -s -- --with-channels
# Or run locally after cloning
bash scripts/install.sh --from-source --with-channelsThe script will:
- Detect your OS (Linux / macOS / WSL)
- Verify Python β₯ 3.10 and Node.js β₯ 18
- Install OpenHarness via
pip - Set up the React TUI (
npm install) if Node.js is available - Create
~/.openharness/config directory - Confirm with
oh --version
- Python 3.10+ and uv
- Node.js 18+ (optional, for the React terminal UI)
- An LLM API key
ANTHROPIC_API_KEY=your_key uv run oh -p "Inspect this repository and list the top 3 refactors"# Clone and install
git clone https://github.com/HKUDS/OpenHarness.git
cd OpenHarness
uv sync --extra dev
# Example: use Kimi as the backend
export ANTHROPIC_BASE_URL=https://api.moonshot.cn/anthropic
export ANTHROPIC_API_KEY=your_kimi_api_key
export ANTHROPIC_MODEL=kimi-k2.5
# Launch
oh # if venv is activated
uv run oh # without activating venv# Single prompt β stdout
oh -p "Explain this codebase"
# JSON output for programmatic use
oh -p "List all functions in main.py" --output-format json
# Stream JSON events in real-time
oh -p "Fix the bug" --output-format stream-jsonOpenHarness supports three API formats: Anthropic (default), OpenAI-compatible (--api-format openai), and GitHub Copilot (--api-format copilot). The OpenAI format covers a wide range of providers.
| Provider profile | Detection signal | Notes |
|---|---|---|
| Anthropic | Default when no custom ANTHROPIC_BASE_URL is set |
Default Claude-oriented setup |
| Moonshot / Kimi | ANTHROPIC_BASE_URL contains moonshot or model starts with kimi |
Anthropic-compatible endpoint |
| Vertex-compatible | Base URL contains vertex or aiplatform |
Anthropic-style gateways on Vertex |
| Bedrock-compatible | Base URL contains bedrock |
Bedrock-style deployments |
| Generic Anthropic-compatible | Any other explicit ANTHROPIC_BASE_URL |
Proxies and internal gateways |
Any provider implementing the OpenAI /v1/chat/completions API works out of the box:
| Provider | Base URL | Example models |
|---|---|---|
| Alibaba DashScope | https://dashscope.aliyuncs.com/compatible-mode/v1 |
qwen3.5-flash, qwen3-max, deepseek-r1 |
| DeepSeek | https://api.deepseek.com |
deepseek-chat, deepseek-reasoner |
| OpenAI | https://api.openai.com/v1 |
gpt-4o, gpt-4o-mini |
| GitHub Models | https://models.inference.ai.azure.com |
gpt-4o, Meta-Llama-3.1-405B-Instruct |
| SiliconFlow | https://api.siliconflow.cn/v1 |
deepseek-ai/DeepSeek-V3 |
| Groq | https://api.groq.com/openai/v1 |
llama-3.3-70b-versatile |
| Ollama (local) | http://localhost:11434/v1 |
Any local model |
# Example: use DashScope
uv run oh --api-format openai \
--base-url "https://dashscope.aliyuncs.com/compatible-mode/v1" \
--api-key "sk-xxx" \
--model "qwen3.5-flash"
# Or via environment variables
export OPENHARNESS_API_FORMAT=openai
export OPENAI_API_KEY=sk-xxx
export OPENHARNESS_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
export OPENHARNESS_MODEL=qwen3.5-flash
uv run ohUse your existing GitHub Copilot subscription as the LLM backend. Authentication uses GitHub's OAuth device flow β no API keys needed.
# One-time login (opens browser for GitHub authorization)
oh auth copilot-login
# Then launch with Copilot as the provider
uv run oh --api-format copilot
# Or via environment variable
export OPENHARNESS_API_FORMAT=copilot
uv run oh
# Check auth status
oh auth status
# Remove stored credentials
oh auth copilot-logout| Feature | Details |
|---|---|
| Auth method | GitHub OAuth device flow (no API key needed) |
| Token management | Automatic refresh of short-lived session tokens |
| Enterprise | Supports GitHub Enterprise via --github-domain flag |
| Models | Uses Copilot's default model selection |
| API | OpenAI-compatible chat completions under the hood |
OpenHarness implements the core Agent Harness pattern with 10 subsystems:
openharness/
engine/ # π§ Agent Loop β query β stream β tool-call β loop
tools/ # π§ 43 Tools β file I/O, shell, search, web, MCP
skills/ # π Knowledge β on-demand skill loading (.md files)
plugins/ # π Extensions β commands, hooks, agents, MCP servers
permissions/ # π‘οΈ Safety β multi-level modes, path rules, command deny
hooks/ # β‘ Lifecycle β PreToolUse/PostToolUse event hooks
commands/ # π¬ 54 Commands β /help, /commit, /plan, /resume, ...
mcp/ # π MCP β Model Context Protocol client
memory/ # π§ Memory β persistent cross-session knowledge
tasks/ # π Tasks β background task management
coordinator/ # π€ Multi-Agent β subagent spawning, team coordination
prompts/ # π Context β system prompt assembly, CLAUDE.md, skills
config/ # βοΈ Settings β multi-layer config, migrations
ui/ # π₯οΈ React TUI β backend protocol + frontend
The heart of the harness. One loop, endlessly composable:
while True:
response = await api.stream(messages, tools)
if response.stop_reason != "tool_use":
break # Model is done
for tool_call in response.tool_uses:
# Permission check β Hook β Execute β Hook β Result
result = await harness.execute_tool(tool_call)
messages.append(tool_results)
# Loop continues β model sees results, decides next actionThe model decides what to do. The harness handles how β safely, efficiently, with full observability.
flowchart LR
U[User Prompt] --> C[CLI or React TUI]
C --> R[RuntimeBundle]
R --> Q[QueryEngine]
Q --> A[Anthropic-compatible API Client]
A -->|tool_use| T[Tool Registry]
T --> P[Permissions + Hooks]
P --> X[Files Shell Web MCP Tasks]
X --> Q
| Category | Tools | Description |
|---|---|---|
| File I/O | Bash, Read, Write, Edit, Glob, Grep | Core file operations with permission checks |
| Search | WebFetch, WebSearch, ToolSearch, LSP | Web and code search capabilities |
| Notebook | NotebookEdit | Jupyter notebook cell editing |
| Agent | Agent, SendMessage, TeamCreate/Delete | Subagent spawning and coordination |
| Task | TaskCreate/Get/List/Update/Stop/Output | Background task management |
| MCP | MCPTool, ListMcpResources, ReadMcpResource | Model Context Protocol integration |
| Mode | EnterPlanMode, ExitPlanMode, Worktree | Workflow mode switching |
| Schedule | CronCreate/List/Delete, RemoteTrigger | Scheduled and remote execution |
| Meta | Skill, Config, Brief, Sleep, AskUser | Knowledge loading, configuration, interaction |
Every tool has:
- Pydantic input validation β structured, type-safe inputs
- Self-describing JSON Schema β models understand tools automatically
- Permission integration β checked before every execution
- Hook support β PreToolUse/PostToolUse lifecycle events
Skills are on-demand knowledge β loaded only when the model needs them:
Available Skills:
- commit: Create clean, well-structured git commits
- review: Review code for bugs, security issues, and quality
- debug: Diagnose and fix bugs systematically
- plan: Design an implementation plan before coding
- test: Write and run tests for code
- simplify: Refactor code to be simpler and more maintainable
- pdf: PDF processing with pypdf (from anthropics/skills)
- xlsx: Excel operations (from anthropics/skills)
- ... 40+ more
Compatible with anthropics/skills β just copy .md files to ~/.openharness/skills/.
Compatible with claude-code plugins. Tested with 12 official plugins:
| Plugin | Type | What it does |
|---|---|---|
commit-commands |
Commands | Git commit, push, PR workflows |
security-guidance |
Hooks | Security warnings on file edits |
hookify |
Commands + Agents | Create custom behavior hooks |
feature-dev |
Commands | Feature development workflow |
code-review |
Agents | Multi-agent PR review |
pr-review-toolkit |
Agents | Specialized PR review agents |
# Manage plugins
oh plugin list
oh plugin install <source>
oh plugin enable <name>OpenHarness is useful as a lightweight harness layer around Claude-style tooling conventions:
- OpenClaw-oriented workflows can reuse Markdown-first knowledge and command-driven collaboration patterns.
- Claude-style plugins and skills stay portable because OpenHarness keeps those formats familiar.
- ClawTeam-style multi-agent work maps well onto the built-in team, task, and background execution primitives.
For concrete usage ideas instead of generic claims, see docs/SHOWCASE.md.
Multi-level safety with fine-grained control:
| Mode | Behavior | Use Case |
|---|---|---|
| Default | Ask before write/execute | Daily development |
| Auto | Allow everything | Sandboxed environments |
| Plan Mode | Block all writes | Large refactors, review first |
Path-level rules in settings.json:
{
"permission": {
"mode": "default",
"path_rules": [{"pattern": "/etc/*", "allow": false}],
"denied_commands": ["rm -rf /", "DROP TABLE *"]
}
}React/Ink TUI with full interactive experience:
- Command picker: Type
/β arrow keys to select β Enter - Permission dialog: Interactive y/n with tool details
- Mode switcher:
/permissionsβ select from list - Session resume:
/resumeβ pick from history - Animated spinner: Real-time feedback during tool execution
- Keyboard shortcuts: Shown at the bottom, context-aware
oh [OPTIONS] COMMAND [ARGS]
Session: -c/--continue, -r/--resume, -n/--name
Model: -m/--model, --effort, --max-turns
Output: -p/--print, --output-format text|json|stream-json
Permissions: --permission-mode, --dangerously-skip-permissions
Context: -s/--system-prompt, --append-system-prompt, --settings
Advanced: -d/--debug, --mcp-config, --bare
Subcommands: oh mcp | oh plugin | oh auth
| Suite | Tests | Status |
|---|---|---|
| Unit + Integration | 114 | β All passing |
| CLI Flags E2E | 6 | β Real model calls |
| Harness Features E2E | 9 | β Retry, skills, parallel, permissions |
| React TUI E2E | 3 | β Welcome, conversation, status |
| TUI Interactions E2E | 4 | β Commands, permissions, shortcuts |
| Real Skills + Plugins | 12 | β anthropics/skills + claude-code/plugins |
# Run all tests
uv run pytest -q # 114 unit/integration
python scripts/test_harness_features.py # Harness E2E
python scripts/test_real_skills_plugins.py # Real plugins E2Efrom pydantic import BaseModel, Field
from openharness.tools.base import BaseTool, ToolExecutionContext, ToolResult
class MyToolInput(BaseModel):
query: str = Field(description="Search query")
class MyTool(BaseTool):
name = "my_tool"
description = "Does something useful"
input_model = MyToolInput
async def execute(self, arguments: MyToolInput, context: ToolExecutionContext) -> ToolResult:
return ToolResult(output=f"Result for: {arguments.query}")Create ~/.openharness/skills/my-skill.md:
---
name: my-skill
description: Expert guidance for my specific domain
---
# My Skill
## When to use
Use when the user asks about [your domain].
## Workflow
1. Step one
2. Step two
...Create .openharness/plugins/my-plugin/.claude-plugin/plugin.json:
{
"name": "my-plugin",
"version": "1.0.0",
"description": "My custom plugin"
}Add commands in commands/*.md, hooks in hooks/hooks.json, agents in agents/*.md.
OpenHarness is most useful when treated as a small, inspectable harness you can adapt to a real workflow:
- Repo coding assistant for reading code, patching files, and running checks locally.
- Headless scripting tool for
jsonandstream-jsonoutput in automation flows. - Plugin and skill testbed for experimenting with Claude-style extensions.
- Multi-agent prototype harness for task delegation and background execution.
- Provider comparison sandbox across Anthropic-compatible backends.
See docs/SHOWCASE.md for short, reproducible examples.
OpenHarness is a community-driven research project. We welcome contributions in:
| Area | Examples |
|---|---|
| Tools | New tool implementations for specific domains |
| Skills | Domain knowledge .md files (finance, science, DevOps...) |
| Plugins | Workflow plugins with commands, hooks, agents |
| Providers | Support for more LLM backends (OpenAI, Ollama, etc.) |
| Multi-Agent | Coordination protocols, team patterns |
| Testing | E2E scenarios, edge cases, benchmarks |
| Documentation | Architecture guides, tutorials, translations |
# Development setup
git clone https://github.com/HKUDS/OpenHarness.git
cd OpenHarness
uv sync --extra dev
uv run pytest -q # Verify everything worksUseful contributor entry points:
CONTRIBUTING.mdfor setup, checks, and PR expectationsCHANGELOG.mdfor user-visible changesdocs/SHOWCASE.mdfor real-world usage patterns worth documenting
MIT β see LICENSE.
Oh my Harness!
The model is the agent. The code is the harness.









