HKUDS/OpenHarness
GitHub: HKUDS/OpenHarness
OpenHarness 是一个开源的轻量级 AI Agent 基础设施框架,提供工具调用、记忆和多智能体协同功能,并内置可接入多聊天平台的个人开发助手 Ohmo。
Stars: 14969 | Forks: 2433
oh — OpenHarness & ohmo
English ·
简体中文
**OpenHarness** 提供了核心的轻量级 agent 基础设施:工具调用、技能、记忆以及多 agent 协同。
**ohmo** 是一个基于 OpenHarness 构建的个人 AI agent —— 它不是普通的聊天机器人,而是一个能够在长时间的会话中真正为你效力的助手。在飞书 / Slack / Telegram / Discord 中与 ohmo 聊天,它会自行创建分支、编写代码、运行测试并提交 PR。ohmo 运行在你现有的 Claude Code 或 Codex 订阅上 —— 无需额外的 API 密钥。
只需一条命令 (**oh**) 即可启动 **OpenHarness** 并解锁所有 Agent Harness。
支持包括 OpenClaw、nanobot、Cursor 等在内的 CLI agent 集成。
## ✨ OpenHarness 核心 Harness 功能
🔄 Agent Loop
• 流式工具调用循环
• 带有指数退避的 API 重试
• 并行工具执行
• Token 计数与成本追踪
|
🔧 Harness 工具包
• 43 种工具 (文件、Shell、搜索、Web、MCP)
• 按需加载技能 (.md)
• 插件生态系统 (技能 + Hooks + Agents)
• 兼容 anthropics/skills 及插件
|
🧠 上下文与记忆
• CLAUDE.md 发现与注入
• 上下文压缩 (Auto-Compact)
• MEMORY.md 持久化记忆
• 会话恢复与历史记录
|
🛡️ 治理
• 多级权限模式
• 路径级与命令规则
• PreToolUse / PostToolUse Hooks
• 交互式审批对话框
|
🤝 集群协同
• Subagent 生成与委派
• 团队注册与任务管理
• 后台任务生命周期
• ClawTeam 集成 (路线图)
|
## 🤔 什么是 Agent Harness?
**Agent Harness** 是包裹在 LLM 周围的完整基础设施,旨在使其成为一个具备实际功能的 agent。模型提供智能;而 harness 提供**双手、眼睛、记忆和安全边界**。
OpenHarness 是一个专为**研究人员、构建者和社区**设计的开源 Python 实现:
- **理解**生产级 AI agent 在底层的实际工作原理
- **体验**前沿工具、技能和 agent 协同模式
- **扩展** harness,集成自定义插件、provider 和领域知识
- **构建**基于成熟架构的专用 agent
## 📰 最新动态
- **未发布** 🔍 **安全的试运行预览**:
- `oh --dry-run` 可预览已解析的运行时设置、认证状态、技能、命令、工具以及配置好的 MCP 服务器,而不会实际执行模型、工具或 subagent。
- 试运行现在会报告 `ready` / `warning` / `blocked` 就绪状态判定,并提供具体的下一步建议,例如修复认证、修复 MCP 配置或直接运行 prompt。
- Prompt 预览包含可能匹配的技能和工具,而斜杠命令预览则会显示该命令主要是只读的还是带有状态更改的。
- **2026-04-18** ⚙️ **v0.1.7** — 打包与 TUI 优化:
- 安装脚本现在会将 `oh`、`ohmo` 和 `openharness` 链接到 `~/.local/bin`,而不是将虚拟环境的 `bin` 目录添加到 `PATH` 中,这避免了对 Conda 管理的 shell 环境的破坏。
- React TUI 现在支持使用 `Shift+Enter` 换行,同时保留普通 `Enter` 作为提交键。
- Windows 终端上 React TUI 中的忙碌状态动画变得更加安静且不易出错,使用了保守的加载动画帧并减少了闪烁。
- **2026-04-10** 🧠 **v0.1.6** — 自动压缩与 Markdown TUI:
- 自动压缩在上下文压缩过程中保留了任务状态和频道日志 —— agent 现在可以进行多日的会话而无需手动压缩或清理
- 子进程队友在 headless worker 模式下运行;agent 团队创建趋于稳定
- 助手消息现在可以在 React TUI 中渲染完整的 Markdown
- `ohmo` 增加了频道斜杠命令和多模态附件支持
- **2026-04-08** 🔌 **v0.1.5** — MCP HTTP 传输与 Swarm 轮询:
- MCP 协议增加了 HTTP 传输,支持在断开连接时自动重连,并兼容仅限工具的服务器
- 为 MCP 工具输入推断 JSON Schema 类型 —— 无需手动进行类型映射
- `ohmo` 频道支持文件附件和多模态网关消息
- Subagent 现在可以在实际运行中进行轮询;权限弹窗已序列化以防输入被吞没
- **2026-04-08** 🌙 **v0.1.4** — 多 provider 认证与 Moonshot/Kimi:
- 原生 Moonshot/Kimi provider,支持思考模型的 `reasoning_content`
- 认证机制大修:修复了切换 provider 时的密钥不匹配问题,支持 `OPENAI_BASE_URL` 环境变量覆盖,以及配置文件范围内的凭证优先级
- MCP 在 `call_tool` / `read_resource` 中能优雅处理已断开连接的服务器
- 安全性:PermissionChecker 中内置了敏感路径保护,强化了 `web_fetch` 的 URL 验证
- 稳定性:Ink TUI 中的 EIO 崩溃恢复、`--debug` 日志、修复了 Windows cmd 的闪烁问题
- **2026-04-06** 🚀 **v0.1.2** — 统一安装流程与 `ohmo` 个人 agent 应用:
- `oh setup` 现在以工作流的形式引导选择 provider,而不是暴露原始的认证/provider 内部细节
- 兼容的 API 设置现在限定在配置文件范围内,因此兼容 Anthropic/OpenAI 的 endpoint 可以保留独立的密钥
- `ohmo` 作为打包应用发布,包含 `~/.ohmo` 工作区、网关、引导 prompt 和频道配置流程
- **2026-04-01** 🎨 **v0.1.0** — 首个 **OpenHarness** 开源发布,包含完整的 Harness 架构:
从这里开始:
快速开始 ·
Provider 兼容性 ·
用例展示 ·
参与贡献 ·
更新日志
## 🚀 快速开始
### 1. 安装
#### Linux / macOS / WSL
```
# 一键安装
curl -fsSL https://raw.githubusercontent.com/HKUDS/OpenHarness/main/scripts/install.sh | bash
# 或者通过 pip
pip install openharness-ai
```
#### Windows (原生)
```
# 一键安装 (PowerShell)
iex (Invoke-WebRequest -Uri 'https://raw.githubusercontent.com/HKUDS/OpenHarness/main/scripts/install.ps1')
# 或者通过 pip
pip install openharness-ai
```
**注意**:Windows 支持现在是原生的。在 PowerShell 中,请使用 `openh` 代替 `oh`,因为 `oh` 可能会解析为内置的 `Out-Host` 别名。
### 2. 配置
```
oh setup # interactive wizard — pick a provider, authenticate, done
# 在 Windows PowerShell 上,使用:openh setup
```
支持 **Claude / OpenAI / Copilot / Codex / Moonshot(Kimi) / GLM / MiniMax / NVIDIA NIM** 以及任何兼容的 endpoint。
### 3. 运行
```
oh
# 在 Windows PowerShell 上,使用:openh
```
### 4. 设置 ohmo (个人 Agent)
想要一个能在飞书 / Slack / Telegram / Discord 中为你效力的 AI agent 吗?
```
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 运行在你现有的 **Claude Code 订阅**或 **Codex 订阅**上 —— 无需额外的 API 密钥。
### 非交互模式 (管道与脚本)
```
# 单个 prompt → stdout
oh -p "Explain this codebase"
# 用于程序化使用的 JSON 输出
oh -p "List all functions in main.py" --output-format json
# 实时流式传输 JSON 事件
oh -p "Fix the bug" --output-format stream-json
```
### 试运行 (安全预览)
当你想要在任何实际执行开始之前检查 OpenHarness 会使用什么内容时,请使用 `--dry-run`。
```
# 预览交互式 session 设置
oh --dry-run
# 预览单个 prompt 而不执行 model 或工具
oh --dry-run -p "Review this bug fix and grep for failing tests"
# 预览 slash command 路径
oh --dry-run -p "/plugin list"
# 为脚本或 channel 获取结构化输出
oh --dry-run -p "Explain this repository" --output-format json
```
试运行是刻意设为静态的:
- 它**不会**调用模型
- 它**不会**执行工具或生成 subagent
- 它**不会**连接到 MCP 服务器
- 它**会**解析设置、认证状态、prompt 组装、技能、命令、工具以及明显的 MCP 配置问题
就绪级别:
- `ready`:配置看起来可用;建议的下一步操作通常是直接运行 prompt
- `warning`:OpenHarness 可以解析该会话,但仍有一些重要部分看起来有问题,例如 MCP 配置损坏或后续模型工作缺少认证
- `blocked`:请求的路径无法按原样成功运行,例如未知的斜杠命令或 prompt 无法解析出运行时客户端
试运行输出中的 `next actions` 会告诉你最短的修复方案或后续步骤,例如:
- 运行 `oh auth login`
- 修复或禁用损坏的 MCP 配置
- 使用 `oh -p "..."` 直接运行 prompt,或使用 `oh` 打开交互式 UI
## 🔌 Provider 兼容性
OpenHarness 将 provider 视为由命名配置文件支持的**工作流**。在日常使用中,建议:
```
oh setup
oh provider list
oh provider use
```
### 内置工作流
| 工作流 | 它是什么 | 典型后端 |
|----------|------------|------------------|
| **兼容 Anthropic 的 API** | Anthropic 风格的请求格式 | Claude 官方、Kimi、GLM、MiniMax、内部兼容 Anthropic 的网关 |
| **Claude 订阅** | Claude CLI 订阅桥接 | 本地 `~/.claude/.credentials.json` |
| **兼容 OpenAI 的 API** | OpenAI 风格的请求格式 | OpenAI 官方、OpenRouter、DashScope、DeepSeek、SiliconFlow、Groq、Ollama、GitHub Models |
| **Codex 订阅** | Codex CLI 订阅桥接 | 本地 `~/.codex/auth.json` |
| **GitHub Copilot** | Copilot OAuth 工作流 | GitHub Copilot 设备流登录 |
### 兼容的 API 类型
#### 兼容 Anthropic 的 API
典型示例:
| 后端 | Base URL | 示例模型 |
|---------|----------|----------------|
| **Claude 官方** | `https://api.anthropic.com` | `claude-sonnet-4-6`, `claude-opus-4-6` |
| **Moonshot / Kimi** | `https://api.moonshot.cn/anthropic` | `kimi-k2.5` |
| **智谱 / GLM** | 自定义兼容 Anthropic 的 endpoint | `glm-4.5` |
| **MiniMax** | 自定义兼容 Anthropic 的 endpoint | `minimax-m1` |
#### 兼容 OpenAI 的 API
任何实现了 OpenAI `/v1/chat/completions` 风格 API 的 provider 都可以工作:
| 后端 Base URL | 示例模型 |
|---------|----------|----------------|
| **OpenAI** | `https://api.openai.com/v1` | `gpt-5.4`, `gpt-4.1` |
| **OpenRouter** | `https://openrouter.ai/api/v1` | 特定 provider |
| **阿里云 DashScope** | `https://dashscope.aliyuncs.com/compatible-mode/v1` | `qwen3.5-flash`, `qwen3-max`, `deepseek-r1` |
| **DeepSeek** | `https://api.deepseek.com` | `deepseek-chat`, `deepseek-reasoner` |
| **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` |
| **NVIDIA NIM** | `https://integrate.api.nvidia.com/v1` | `openai/gpt-oss-120b`, `nvidia/llama-3.3-nemotron-super-49b-v1` |
| **Google Gemini** | `https://generativelanguage.googleapis.com/v1beta/openai` | `gemini-2.5-flash`, `gemini-2.5-pro` |
| **Groq** | `https://api.groq.com/openai/v1` | `llama-3.3-70b-versatile` |
| **Ollama (本地)** | `http://localhost:11434/v1` | 任意本地模型 |
### 高级配置管理
```
# 列出已保存的 workflow
oh provider list
# 切换活动的 workflow
oh provider use codex
# 添加你自己的兼容 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
```
对于自定义的兼容 endpoint,OpenHarness 可以按配置文件绑定凭证,而不是强制每个兼容 Anthropic 或兼容 OpenAI 的后端共享同一个 API 密钥。
### Ollama (本地模型)
通过 Ollama 兼容 OpenAI 的 endpoint 运行本地模型:
```
# 添加 Ollama provider profile
oh provider add ollama \
--label "Ollama" \
--provider Ollama \
--api-format openai \
--auth-source openai_api_key \
--model glm-4.7-flash:q8_0 \
--base-url http://localhost:11434/v1
```
```
Saved provider profile: ollama
```
```
# 激活并验证
oh provider use ollama
```
```
Activated provider profile: ollama
```
```
oh provider list
```
```
claude-api: Anthropic-Compatible API [ready]
...
moonshot: Moonshot (Kimi) [missing auth]
auth=moonshot_api_key model=kimi-k2.5 base_url=https://api.moonshot.cn/v1
* ollama: Ollama [ready]
auth=openai_api_key model=glm-4.7-flash:q8_0 base_url=http://localhost:11434/v1
```
### GitHub Copilot 格式 (`--api-format copilot`)
使用你现有的 GitHub Copilot 订阅作为 LLM 后端。身份验证使用 GitHub 的 OAuth 设备流 —— 无需 API 密钥。
```
# 一次性登录(打开浏览器进行 GitHub 授权)
oh auth copilot-login
# 然后启动并以 Copilot 作为 provider
uv run oh --api-format copilot
# 或者通过环境变量
export OPENHARNESS_API_FORMAT=copilot
uv run oh
# 检查 auth 状态
oh auth status
# 移除已存储的凭证
oh auth copilot-logout
```
| 功能 | 详情 |
|---------|---------|
| **认证方式** | GitHub OAuth 设备流 (无需 API 密钥) |
| **Token 管理** | 自动刷新短时会话 token |
| **企业版** | 通过 `--github-domain` 标志支持 GitHub Enterprise |
| **模型** | 使用 Copilot 的默认模型选择 |
| **API** | 底层使用兼容 OpenAI 的 chat completions |
## 🏗️ Harness 架构
OpenHarness 实现了包含 10 个子系统的核心 Agent Harness 模式:
```
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
```
### Agent Loop
harness 的心脏。一个循环,具备无限的可组合性:
```
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
```
模型决定做**什么**。harness 负责**如何**做 —— 安全、高效,并具备完全的可观测性。
### Harness 流程
```
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
```
## ✨ 功能
### 🔧 工具 (43+)
| 类别 | 工具 | 描述 |
|----------|-------|-------------|
| **文件 I/O** | Bash, Read, Write, Edit, Glob, Grep | 带有权限检查的核心文件操作 |
| **搜索** | WebFetch, WebSearch, ToolSearch, LSP | Web 和代码搜索能力 |
| **Notebook** | NotebookEdit | Jupyter notebook 单元格编辑 |
| **Agent** | Agent, SendMessage, TeamCreate/Delete | Subagent 生成与协同 |
| **任务** | TaskCreate/Get/List/Update/Stop/Output | 后台任务管理 |
| **MCP** | MCPTool, ListMcpResources, ReadMcpResource | Model Context Protocol 集成 |
| **模式** | EnterPlanMode, ExitPlanMode, Worktree | 工作流模式切换 |
| **定时任务** | CronCreate/List/Delete, RemoteTrigger | 计划任务与远程执行 |
| **元操作** | Skill, Config, Brief, Sleep, AskUser | 知识加载、配置、交互 |
每个工具都具有:
- **Pydantic 输入验证** —— 结构化、类型安全的输入
- **自我描述的 JSON Schema** —— 模型会自动理解工具
- **权限集成** —— 在每次执行前进行检查
- **Hook 支持** —— PreToolUse/PostToolUse 生命周期事件
### 📚 技能系统
技能是**按需获取的知识** —— 仅在模型需要时加载:
```
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
```
技能可以位于打包目录、用户、ohmo、项目或插件位置中。用户级技能从此处加载:
```
~/.openharness/skills//SKILL.md
~/.claude/skills//SKILL.md
~/.agents/skills//SKILL.md
```
默认情况下会启用项目级技能,它们会在从当前工作目录向上至 git 根目录的过程中被发现:
```
/.openharness/skills//SKILL.md
/.agents/skills//SKILL.md
/.claude/skills//SKILL.md
```
对于不受信任的代码库,可以使用以下命令禁用项目技能:
```
oh config set allow_project_skills false
```
使用 `/skills` 列出已加载技能及其来源和路径。用户可调用的技能可以直接作为斜杠命令运行,例如 `/deploy staging`。
**兼容 [anthropics/skills](https://github.com/anthropics/skills)** —— 使用上文所述的 `SKILL.md` 目录布局。
### 🌐 Web 搜索与代理设置
内置的 `web_search` 默认使用 DuckDuckGo HTML 搜索。在该 endpoint 无法访问的地区,可以将 OpenHarness 指向受信任的公共 HTML 搜索 endpoint 或你自己的 SearXNG 实例:
```
export OPENHARNESS_WEB_SEARCH_URL="https://your-searxng.example/search"
```
出于 SSRF 安全考虑,`web_search` 和 `web_fetch` 保持 `trust_env=False`,因此它们不会自动继承 `HTTP_PROXY` / `HTTPS_PROXY`。如果你需要使用代理,可以通过 OpenHarness 特定的变量来启用:
```
export OPENHARNESS_WEB_PROXY="http://127.0.0.1:7890"
```
代理 URL 必须是 HTTP/HTTPS,且不能包含嵌入的凭证。
### 🔌 插件系统
**兼容 [claude-code plugins](https://github.com/anthropics/claude-code/tree/main/plugins)**。已通过 12 个官方插件的测试:
| 插件 | 类型 | 作用 |
|--------|------|-------------|
| `commit-commands` | 命令 | Git 提交、推送、PR 工作流 |
| `security-guidance` | Hooks | 文件编辑时的安全警告 |
| `hookify` | 命令 + Agents | 创建自定义行为 hooks |
| `feature-dev` | 命令 | 功能开发工作流 |
| `code-review` | Agents | 多 agent PR 审查 |
| `pr-review-toolkit` | Agents | 专门的 PR 审查 agents |
```
# 管理插件
oh plugin list
oh plugin install
oh plugin enable
```
### 🤝 生态系统工作流
OpenHarness 可作为围绕 Claude 风格工具使用规范的轻量级 harness 层发挥作用:
- **面向 OpenClaw 的工作流**可以重用 Markdown 优先的知识和命令驱动的协作模式。
- **Claude 风格的插件和技能**保持可移植性,因为 OpenHarness 保留了那些熟悉的格式。
- **ClawTeam 风格的多 agent 工作**可以很好地映射到内置的团队、任务和后台执行原语上。
有关具体的用法构想而非通用声明,请参阅 [`docs/SHOWCASE.md`](docs/SHOWCASE.md)。
### 🛡️ 权限
具备细粒度控制的多级安全:
| 模式 | 行为 | 用例 |
|------|----------|----------|
| **默认** | 写入/执行前询问 | 日常开发 |
| **自动** | 允许一切 | 沙盒环境 |
| **计划模式** | 阻止所有写入 | 大型重构,先进行审查 |
**路径级规则** (位于 `settings.json`):
```
{
"permission": {
"mode": "default",
"path_rules": [{"pattern": "/etc/*", "allow": false}],
"denied_commands": ["rm -rf /", "DROP TABLE *"]
}
}
```
### 🖥️ 终端 UI
基于 React/Ink 的 TUI,提供完整的交互式体验:
- **命令选择器**: 输入 `/` → 方向键选择 → Enter
- **权限对话框**: 带有工具详情的交互式 y/n
- **模式切换器**: `/permissions` → 从列表中选择
- **会话恢复**: `/resume` → 从历史记录中选择
- **动画加载指示器**: 工具执行期间的实时反馈
- **键盘快捷键**: 显示在底部,具有上下文感知能力
### 📡 CLI
```
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 setup | oh provider | oh auth | oh mcp | oh plugin
```
### 🧑💼 ohmo 个人 Agent
`ohmo` 是建立在 OpenHarness 之上的个人 agent 应用。它与 `oh` 一起打包,拥有自己的工作区和网关:
```
# 初始化个人 workspace
ohmo init
# 配置 gateway channel 并选择一个 provider profile
ohmo config
# 运行个人 agent
ohmo
# 在前台运行 gateway
ohmo gateway run
# 检查或重启 gateway
ohmo gateway status
ohmo gateway restart
```
核心概念:
- `~/.ohmo/`
- 个人工作区根目录
- `soul.md`
- 长期 agent 性格与行为
- `identity.md`
- `ohmo` 是谁
- `user.md`
- 用户档案与偏好设置
- `BOOTSTRAP.md`
- 首次运行落地仪式
- `memory/`
- 个人记忆
- `gateway.json`
- 选定的 provider 配置与频道设置
`ohmo config` 使用与 `oh setup` 相同的工作流语言,因此你可以将个人 agent 网关指向:
- `兼容 Anthropic 的 API`
- `Claude 订阅`
- `兼容 OpenAI 的 API`
- `Codex 订阅`
- `GitHub Copilot`
`ohmo init` 会一次性创建主工作区。之后,使用 `ohmo config` 更新 provider 和频道设置;如果网关已经在运行,配置流程可以为你重启它。
目前 `ohmo init` / `ohmo config` 可以为以下平台引导频道设置:
- Telegram
- Slack
- Discord
- 飞书
## 📊 测试结果
| 测试套件 | 测试 | 状态 |
|-------|-------|--------|
| 单元 + 集成 | 114 | ✅ 全部通过 |
| CLI Flags E2E | 6 | ✅ 真实模型调用 |
| Harness 功能 E2E | 9 | ✅ 重试、技能、并行、权限 |
| React TUI E2E | 3 | ✅ 欢迎、对话、状态 |
| TUI 交互 E2E | 4 | ✅ 命令、权限、快捷键 |
| 真实技能 + 插件 | 12 | ✅ anthropics/skills + claude-code/plugins |
```
# 运行所有测试
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
```
## 🔧 扩展 OpenHarness
### 添加自定义工具
```
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}")
```
### 添加自定义技能
创建 `~/.openharness/skills/my-skill.md`:
```
---
name: my-skill
description: Expert guidance for my specific domain
---
# My Skill
## 何时使用
Use when the user asks about [your domain].
## Workflow
1. Step one
2. Step two
...
```
### 添加插件
创建 `.openharness/plugins/my-plugin/.claude-plugin/plugin.json`:
```
{
"name": "my-plugin",
"version": "1.0.0",
"description": "My custom plugin"
}
```
在 `commands/*.md` 中添加命令,在 `hooks/hooks.json` 中添加 hooks,在 `agents/*.md` 中添加 agents。
## 🌍 用例展示
当把 OpenHarness 视为一个可以适应实际工作流的小巧且可检查的 harness 时,它最能发挥用处:
- **代码库编程助手**,用于阅读代码、修补文件和在本地运行检查。
- **Headless 脚本工具**,用于在自动化流程中输出 `json` 和 `stream-json`。
- **插件和技能测试平台**,用于体验 Claude 风格的扩展。
- **多 agent 原型 harness**,用于任务委派和后台执行。
- **Provider 比较沙盒**,跨兼容 Anthropic 的后端进行比较。
请参阅 [`docs/SHOWCASE.md`](docs/SHOWCASE.md) 获取简短且可重现的示例。
## 🤝 参与贡献
OpenHarness 是一个**社区驱动的研究项目**。我们欢迎在以下领域做出贡献:
| 领域 | 示例 |
|------|---------|
| **工具** | 针对特定领域的新工具实现 |
| **技能** | 领域知识 `.md` 文件 (金融、科学、DevOps...) |
| **插件** | 带有命令、hooks、agents 的工作流插件 |
| **Providers** | 支持更多 LLM 后端 (OpenAI、Ollama 等) |
| **多 Agent** | 协同协议、团队模式 |
| **测试** | E2E 场景、边缘情况、基准测试 |
| **文档** | 架构指南、教程、翻译 |
```
# 开发设置
git clone https://github.com/HKUDS/OpenHarness.git
cd OpenHarness
uv sync --extra dev
uv run pytest -q # Verify everything works
```
对贡献者有用的切入点:
- [`CONTRIBUTING.md`](CONTRIBUTING.md) 了解设置、检查和 PR 预期
- [`CHANGELOG.md`](CHANGELOG.md) 了解用户可见的更改
- [`docs/SHOWCASE.md`](docs/SHOWCASE.md) 了解值得记录的真实世界使用模式
## 🔧 故障排除
### macOS Terminal.app 中的退格键
OpenHarness 处理了两种常见的终端删除序列,包括 macOS Terminal.app 为退格键发送的原始 `DEL` 字节 (`0x7f`)。如果退格键插入的是空格或可见的控制字符而不是删除文本,请先升级 OpenHarness。
对于不包含此修复的旧版本,请使用发送标准退格序列的终端,或者调整你的终端键盘配置文件作为临时解决方案。
## 许可证
MIT — 详情请见 [LICENSE](LICENSE)。
Oh my Harness!
The model is the agent. The code is the harness.
Thanks for visiting ✨ OpenHarness!
标签:AI智能体, AI智能体框架, Python, 个人助理, 协同工具, 无后门, 自动化编码, 逆向工具