ohmo is a personal AI agent built on OpenHarness — not another chatbot, but an assistant that actually works for you over long sessions. Chat with ohmo in Feishu / Slack / Telegram / Discord, and it forks branches, writes code, runs tests, and opens PRs on its own. ohmo runs on your existing Claude Code or Codex subscription — no extra API key needed.
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.
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
📰 What’s New
Unreleased 🔍 Dry-run safe preview:
oh --dry-run previews resolved runtime settings, auth state, skills, commands, tools, and configured MCP servers without executing the model, tools, or subagents.
Dry-run now reports a ready / warning / blocked readiness verdict with concrete next-step suggestions such as fixing auth, fixing MCP config, or running the prompt directly.
Prompt previews include likely matching skills and tools, while slash-command previews show whether the command is mostly read-only or stateful.
2026-04-18 ⚙️ v0.1.7 — Packaging & TUI polish:
Install script now links oh, ohmo, and openharness into ~/.local/bin instead of prepending the virtualenv bin directory to PATH, which avoids clobbering Conda-managed shells.
React TUI now supports Shift+Enter to insert a newline while keeping plain Enter as submit.
Busy-state animation in the React TUI is quieter and less error-prone on Windows terminals, with conservative spinner frames and reduced flashing.
# One-click install
curl -fsSL https://raw.githubusercontent.com/HKUDS/OpenHarness/main/scripts/install.sh | bash
# Or via pip
pip install openharness-ai
Windows (Native)
# One-click install (PowerShell)
iex (Invoke-WebRequest -Uri 'https://raw.githubusercontent.com/HKUDS/OpenHarness/main/scripts/install.ps1')
# Or via pip
pip install openharness-ai
Note: Windows support is now native. In PowerShell, use openh instead of oh because oh can resolve to the built-in Out-Host alias.
2. Configure
oh setup # interactive wizard — pick a provider, authenticate, done
# On Windows PowerShell, use: openh setup
Supports Claude / OpenAI / Copilot / Codex / Moonshot(Kimi) / GLM / MiniMax / NVIDIA NIM and any compatible endpoint.
3. Run
oh
# On Windows PowerShell, use: openh
4. Set up ohmo (Personal Agent)
Want an AI agent that works for you from Feishu / Slack / Telegram / Discord?
ohmo init # initialize ~/.ohmo workspace
ohmo config # configure channels and provider
ohmo gateway start # start the gateway — ohmo is now live in your chat app
ohmo runs on your existing Claude Code subscription or Codex subscription — no extra API key needed.
Non-Interactive Mode (Pipes & Scripts)
# 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-json
Dry Run (Safe Preview)
Use --dry-run when you want to inspect what OpenHarness would use before any live execution starts.
# Preview an interactive session setup
oh --dry-run
# Preview one prompt without executing the model or tools
oh --dry-run -p "Review this bug fix and grep for failing tests"
# Preview a slash command path
oh --dry-run -p "/plugin list"
# Get structured output for scripts or channels
oh --dry-run -p "Explain this repository" --output-format json
Dry-run is intentionally static:
It does not call the model
It does not execute tools or spawn subagents
It does not connect to MCP servers
It does resolve settings, auth status, prompt assembly, skills, commands, tools, and obvious MCP config problems
Readiness levels:
ready: configuration looks usable; the next suggested action is usually to run the prompt directly
warning: OpenHarness can resolve the session, but something important still looks wrong, such as broken MCP config or missing auth for later model work
blocked: the requested path will not run successfully as-is, for example an unknown slash command or a prompt that cannot resolve a runtime client
next actions in the dry-run output tell you the shortest fix or follow-up step, such as:
run oh auth login
fix or disable broken MCP configuration
run the prompt directly with oh -p "..." or open the interactive UI with oh
🔌 Provider Compatibility
OpenHarness treats providers as workflows backed by named profiles. In day-to-day use, prefer:
oh setup
oh provider list
oh provider use <profile>
Built-in Workflows
Workflow
What it is
Typical backends
Anthropic-Compatible API
Anthropic-style request format
Claude official, Kimi, GLM, MiniMax, internal Anthropic-compatible gateways
# List saved workflows
oh provider list
# Switch the active workflow
oh provider use codex
# Add your own compatible endpoint
oh provider add my-endpoint \
--label "My Endpoint" \
--provider openai \
--api-format openai \
--auth-source openai_api_key \
--model my-model \
--base-url https://example.com/v1
For custom compatible endpoints, OpenHarness can bind credentials per profile instead of forcing every Anthropic-compatible or OpenAI-compatible backend to share the same API key.
Ollama (Local Models)
Run local models through Ollama’s OpenAI-compatible endpoint:
Use 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
🏗️ Harness Architecture
OpenHarness implements the core Agent Harness pattern with 10 subsystems:
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 action
The model decides what to do. The harness handles how — safely, efficiently, with full observability.
Harness Flow
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
Permission integration — checked before every execution
Hook support — PreToolUse/PostToolUse lifecycle events
📚 Skills System
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
Skills can live in bundled, user, ohmo, project, or plugin locations. User-level skills are loaded from:
Disable project skills for untrusted repositories with:
oh config set allow_project_skills false
Use /skills to list loaded skills with their source and path. User-invocable skills can be run directly as slash commands, for example /deploy staging.
Compatible with anthropics/skills — use the SKILL.md directory layout above.
🌐 Web search and proxy settings
Built-in web_search uses DuckDuckGo HTML search by default. In regions where that endpoint is unreachable, point OpenHarness at a trusted public HTML search endpoint or your own SearXNG instance:
web_search and web_fetch keep trust_env=False for SSRF safety, so they do not automatically inherit HTTP_PROXY / HTTPS_PROXY. If you need a proxy, opt in with an OpenHarness-specific variable:
ohmo is a personal-agent app built on top of OpenHarness. It is packaged alongside oh, with its own workspace and gateway:
# Initialize personal workspace
ohmo init
# Configure gateway channels and pick a provider profile
ohmo config
# Run the personal agent
ohmo
# Run the gateway in foreground
ohmo gateway run
# Check or restart the gateway
ohmo gateway status
ohmo gateway restart
Key concepts:
~/.ohmo/
personal workspace root
soul.md
long-term agent personality and behavior
identity.md
who ohmo is
user.md
user profile and preferences
BOOTSTRAP.md
first-run landing ritual
memory/
personal memory
gateway.json
selected provider profile and channel configuration
ohmo config uses the same workflow language as oh setup, so you can point the personal-agent gateway at:
Anthropic-Compatible API
Claude Subscription
OpenAI-Compatible API
Codex Subscription
GitHub Copilot
ohmo init creates the home workspace once. After that, use ohmo config to update provider and channel settings; if the gateway is already running, the config flow can restart it for you.
Currently ohmo init / ohmo config can guide channel setup for:
Telegram
Slack
Discord
Feishu
📊 Test Results
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 E2E
🔧 Extending OpenHarness
Add a Custom Tool
from 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}")
Add a Custom Skill
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
...
docs/SHOWCASE.md for real-world usage patterns worth documenting
🔧 Troubleshooting
Backspace key in macOS Terminal.app
OpenHarness handles both common terminal delete sequences, including the raw DEL byte (0x7f) that macOS Terminal.app sends for Backspace. If Backspace inserts spaces or visible control characters instead of deleting text, upgrade OpenHarness first.
For older versions that do not include this fix, use a terminal that sends a standard Backspace sequence or adjust your terminal keyboard profile as a temporary workaround.
oh— OpenHarness &ohmoEnglish · 简体中文
OpenHarness delivers core lightweight agent infrastructure: tool-use, skills, memory, and multi-agent coordination.
ohmo is a personal AI agent built on OpenHarness — not another chatbot, but an assistant that actually works for you over long sessions. Chat with ohmo in Feishu / Slack / Telegram / Discord, and it forks branches, writes code, runs tests, and opens PRs on its own. ohmo runs on your existing Claude Code or Codex subscription — no extra API key needed.
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.
✨ OpenHarness’s Key Harness Features
🔄 Agent Loop
• Streaming Tool-Call Cycle
• API Retry with Exponential Backoff
• Parallel Tool Execution
• Token Counting & Cost Tracking
🔧 Harness Toolkit
• 43 Tools (File, Shell, Search, Web, MCP)
• On-Demand Skill Loading (.md)
• Plugin Ecosystem (Skills + Hooks + Agents)
• Compatible with anthropics/skills & plugins
🧠 Context & Memory
• CLAUDE.md Discovery & Injection
• Context Compression (Auto-Compact)
• MEMORY.md Persistent Memory
• Session Resume & History
🛡️ Governance
• Multi-Level Permission Modes
• Path-Level & Command Rules
• PreToolUse / PostToolUse Hooks
• Interactive Approval Dialogs
🤝 Swarm Coordination
• Subagent Spawning & Delegation
• Team Registry & Task Management
• Background Task Lifecycle
• ClawTeam Integration (Roadmap)
🤔 What is an Agent Harness?
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:
📰 What’s New
oh --dry-runpreviews resolved runtime settings, auth state, skills, commands, tools, and configured MCP servers without executing the model, tools, or subagents.ready/warning/blockedreadiness verdict with concrete next-step suggestions such as fixing auth, fixing MCP config, or running the prompt directly.oh,ohmo, andopenharnessinto~/.local/bininstead of prepending the virtualenvbindirectory toPATH, which avoids clobbering Conda-managed shells.Shift+Enterto insert a newline while keeping plainEnteras submit.ohmogains channel slash commands and multimodal attachment supportohmochannels support file attachments and multimodal gateway messagesreasoning_contentsupport for thinking modelsOPENAI_BASE_URLenv override, profile-scoped credential prioritycall_tool/read_resourceweb_fetchURL validation--debuglogging, Windows cmd flash fixohmopersonal-agent app:oh setupnow guides provider selection as workflows instead of exposing raw auth/provider internalsohmoships as a packaged app with~/.ohmoworkspace, gateway, bootstrap prompts, and channel config flowStart here: Quick Start · Provider Compatibility · Showcase · Contributing · Changelog
🚀 Quick Start
1. Install
Linux / macOS / WSL
Windows (Native)
Note: Windows support is now native. In PowerShell, use
openhinstead ofohbecauseohcan resolve to the built-inOut-Hostalias.2. Configure
Supports Claude / OpenAI / Copilot / Codex / Moonshot(Kimi) / GLM / MiniMax / NVIDIA NIM and any compatible endpoint.
3. Run
4. Set up ohmo (Personal Agent)
Want an AI agent that works for you from Feishu / Slack / Telegram / Discord?
ohmo runs on your existing Claude Code subscription or Codex subscription — no extra API key needed.
Non-Interactive Mode (Pipes & Scripts)
Dry Run (Safe Preview)
Use
--dry-runwhen you want to inspect what OpenHarness would use before any live execution starts.Dry-run is intentionally static:
Readiness levels:
ready: configuration looks usable; the next suggested action is usually to run the prompt directlywarning: OpenHarness can resolve the session, but something important still looks wrong, such as broken MCP config or missing auth for later model workblocked: the requested path will not run successfully as-is, for example an unknown slash command or a prompt that cannot resolve a runtime clientnext actionsin the dry-run output tell you the shortest fix or follow-up step, such as:oh auth loginoh -p "..."or open the interactive UI withoh🔌 Provider Compatibility
OpenHarness treats providers as workflows backed by named profiles. In day-to-day use, prefer:
Built-in Workflows
~/.claude/.credentials.json~/.codex/auth.jsonCompatible API Families
Anthropic-Compatible API
Typical examples:
https://api.anthropic.comclaude-sonnet-4-6,claude-opus-4-6https://api.moonshot.cn/anthropickimi-k2.5glm-4.5minimax-m1OpenAI-Compatible API
Any provider implementing the OpenAI
/v1/chat/completionsstyle API works:https://api.openai.com/v1gpt-5.4,gpt-4.1https://openrouter.ai/api/v1https://dashscope.aliyuncs.com/compatible-mode/v1qwen3.5-flash,qwen3-max,deepseek-r1https://api.deepseek.comdeepseek-chat,deepseek-reasonerhttps://models.inference.ai.azure.comgpt-4o,Meta-Llama-3.1-405B-Instructhttps://api.siliconflow.cn/v1deepseek-ai/DeepSeek-V3https://integrate.api.nvidia.com/v1openai/gpt-oss-120b,nvidia/llama-3.3-nemotron-super-49b-v1https://generativelanguage.googleapis.com/v1beta/openaigemini-2.5-flash,gemini-2.5-prohttps://api.groq.com/openai/v1llama-3.3-70b-versatilehttp://localhost:11434/v1Advanced Profile Management
For custom compatible endpoints, OpenHarness can bind credentials per profile instead of forcing every Anthropic-compatible or OpenAI-compatible backend to share the same API key.
Ollama (Local Models)
Run local models through Ollama’s OpenAI-compatible endpoint:
GitHub Copilot Format (
--api-format copilot)Use your existing GitHub Copilot subscription as the LLM backend. Authentication uses GitHub’s OAuth device flow — no API keys needed.
--github-domainflag🏗️ Harness Architecture
OpenHarness implements the core Agent Harness pattern with 10 subsystems:
The Agent Loop
The heart of the harness. One loop, endlessly composable:
The model decides what to do. The harness handles how — safely, efficiently, with full observability.
Harness Flow
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✨ Features
🔧 Tools (43+)
Every tool has:
📚 Skills System
Skills are on-demand knowledge — loaded only when the model needs them:
Skills can live in bundled, user, ohmo, project, or plugin locations. User-level skills are loaded from:
Project-level skills are enabled by default and are discovered from the current working directory up to the git root:
Disable project skills for untrusted repositories with:
Use
/skillsto list loaded skills with their source and path. User-invocable skills can be run directly as slash commands, for example/deploy staging.Compatible with anthropics/skills — use the
SKILL.mddirectory layout above.🌐 Web search and proxy settings
Built-in
web_searchuses DuckDuckGo HTML search by default. In regions where that endpoint is unreachable, point OpenHarness at a trusted public HTML search endpoint or your own SearXNG instance:web_searchandweb_fetchkeeptrust_env=Falsefor SSRF safety, so they do not automatically inheritHTTP_PROXY/HTTPS_PROXY. If you need a proxy, opt in with an OpenHarness-specific variable:The proxy URL must be HTTP/HTTPS and cannot contain embedded credentials.
🔌 Plugin System
Compatible with claude-code plugins. Tested with 12 official plugins:
commit-commandssecurity-guidancehookifyfeature-devcode-reviewpr-review-toolkit🤝 Ecosystem Workflows
OpenHarness is useful as a lightweight harness layer around Claude-style tooling conventions:
For concrete usage ideas instead of generic claims, see
docs/SHOWCASE.md.🛡️ Permissions
Multi-level safety with fine-grained control:
Path-level rules in
settings.json:🖥️ Terminal UI
React/Ink TUI with full interactive experience:
/→ arrow keys to select → Enter/permissions→ select from list/resume→ pick from history📡 CLI
🧑💼 ohmo Personal Agent
ohmois a personal-agent app built on top of OpenHarness. It is packaged alongsideoh, with its own workspace and gateway:Key concepts:
~/.ohmo/soul.mdidentity.mdohmoisuser.mdBOOTSTRAP.mdmemory/gateway.jsonohmo configuses the same workflow language asoh setup, so you can point the personal-agent gateway at:Anthropic-Compatible APIClaude SubscriptionOpenAI-Compatible APICodex SubscriptionGitHub Copilotohmo initcreates the home workspace once. After that, useohmo configto update provider and channel settings; if the gateway is already running, the config flow can restart it for you.Currently
ohmo init/ohmo configcan guide channel setup for:📊 Test Results
🔧 Extending OpenHarness
Add a Custom Tool
Add a Custom Skill
Create
~/.openharness/skills/my-skill.md:Add a Plugin
Create
.openharness/plugins/my-plugin/.claude-plugin/plugin.json:Add commands in
commands/*.md, hooks inhooks/hooks.json, agents inagents/*.md.🌍 Showcase
OpenHarness is most useful when treated as a small, inspectable harness you can adapt to a real workflow:
jsonandstream-jsonoutput in automation flows.See
docs/SHOWCASE.mdfor short, reproducible examples.🤝 Contributing
OpenHarness is a community-driven research project. We welcome contributions in:
.mdfiles (finance, science, DevOps…)Useful contributor entry points:
CONTRIBUTING.mdfor setup, checks, and PR expectationsCHANGELOG.mdfor user-visible changesdocs/SHOWCASE.mdfor real-world usage patterns worth documenting🔧 Troubleshooting
Backspace key in macOS Terminal.app
OpenHarness handles both common terminal delete sequences, including the raw
DELbyte (0x7f) that macOS Terminal.app sends for Backspace. If Backspace inserts spaces or visible control characters instead of deleting text, upgrade OpenHarness first.For older versions that do not include this fix, use a terminal that sends a standard Backspace sequence or adjust your terminal keyboard profile as a temporary workaround.
📄 License
MIT — see LICENSE.
Oh my Harness!
The model is the agent. The code is the harness.
Thanks for visiting ✨ OpenHarness!