openhands Harness 在 Benchmark 准备好的仓库工作区中运行 OpenHands,适用于 SWE-bench Verified、SWE-bench Multilingual 和 SWE-bench Pro 等仓库修复 Benchmark。也可被用作 Terminal-Bench 2 一类的终端操作 Harness。
AgentCompass 会在所选环境中安装固定版本的 OpenHands SDK/工具,把问题单提示词与 model 端点传给 OpenHands,将终端操作转发到任务工作区,并把 OpenHands 事件历史转换为标准 RunResult 轨迹。被测 model 由命令行 --model-* 参数配置,支持 openai-chat 与 openai-responses。
工作原理
- 准备隔离 runtime:会话启动时,Harness 创建
/opt/agentcompass/openhands/runtime,安装 Python 3.12 以及openhands_version指定版本的openhands-sdk/openhands-tools,完成导入探测后上传 AgentCompass 入口脚本。因此安装阶段要求任务环境能够访问 runtime 与 Python 包下载源。 - 构建 OpenHands 对话:Benchmark 提供的提示词和工作区会传给 OpenHands
Conversation。tool_preset选择终端/编辑工具集,可选 condenser 用于总结较早的事件。max_iterations限迭代数;conversation_timeout是单次 LLM 请求超时,command_timeout是终端命令超时,terminal_no_change_timeout_seconds是输出停止变化时的软超时,terminal_max_output_size截断返回给 agent 的终端输出。 - 上下文压缩:
enable_condenser=true时启用 LLM 摘要 condenser,condenser_max_size控制最大上下文事件数、condenser_keep_first保留最早若干事件。 - 在任务工作区执行工具:终端动作通过所选 AgentCompass 环境执行。Harness 在
<workspace>/.agentcompass/下维护实时状态文件,因此超时时仍可尽量恢复部分历史以及正在执行的终端命令或 model 请求。 - 回收提交:SWE 类任务通常要求写入
patch.txt等补丁文件;第一个成功回收的目标文件成为final_answer。如果任务没有要求输出文件,则使用 OpenHands 的完成消息。
多层超时
各层限制相互独立,哪个适用的限制先触发,就先终止对应操作:
例如
timeout=7200、而单次请求设为 --model-params '{"timeout":9000}' 时,整题 7200 秒限制仍可能先终止运行。外层超时会把 RunResult 标为运行错误,但在状态可用时仍会保留部分轨迹与超时诊断。
参数
通过--harness-params '{...}' 传入 JSON,或写入 --config 指定 YAML 的 harness.params;同名字段以命令行为准。合并优先级见 Harness 概览。
参数总览
| 参数 | 类型 | 默认值 | 可选值 / 取值 | 说明 |
|---|---|---|---|---|
openhands_version | 字符串 | 1.23.0 | OpenHands SDK/工具版本 | 安装到隔离 runtime 的版本。为了保证不同运行可比,建议保持固定。 |
tool_preset | 字符串 | default | default / gemini / gpt5 / planning | agent 使用的 OpenHands 工具预设。 |
max_iterations | 整数 | 250 | 整数 ≥ 1 | 单任务最大对话迭代数。 |
conversation_timeout | 整数 | 3600 | 整数 ≥ 1 | 单次 LLM 请求的默认超时,单位为秒。 |
command_timeout | 整数 / 空值 | 1800 | 整数 ≥ 1 或 null | 单条终端命令硬超时,单位为秒。 |
terminal_no_change_timeout_seconds | 整数 | 600 | 整数 ≥ 1 | 终端输出停止变化后的软超时。 |
terminal_max_output_size | 整数 | 200000 | 整数 ≥ 1 | 返回给 agent 的终端输出最大字符数。 |
enable_condenser | 布尔值 | true | true / false | 是否启用 LLM 摘要 condenser。 |
interleaved_thinking | 布尔值 | false | true / false | 是否把上一轮模型请求返回的工具使用等推理状态放进下一轮请求。 |
condenser_max_size | 整数 | 240 | 整数 ≥ 1 | 触发 condenser 处理前允许的最大事件数。 |
condenser_keep_first | 整数 | 2 | 整数 ≥ 1 | condenser 保留的最早事件数。 |
env | 字典 | {} | 字符串到字符串映射 | 传给 runtime 安装与终端工具的环境变量。 |
timeout | 整数 / 空值 | 9600 | 整数 ≥ 1 或 null | 整题挂钟超时,单位为秒。 |
skill_dirs | 列表 | [] | 目录路径 | OpenHands 技能目录;路径必须存在于任务 Environment 内部。 |
model 请求参数
--model-params 会传给 OpenHands SDK LLM 构造器,主 agent 与可选 condenser 使用同一组参数。它与 --harness-params 是两个独立的 JSON 对象。
一组可直接使用的请求与重试配置如下:
思考 / 推理配置
OpenHands Harness 没有名为thinking 的参数;推理模式应写在 --model-params 中,并选择 model 服务实际支持的形式:
- Reasoning effort
- Responses API
- vLLM / Qwen thinking 开关
- Anthropic extended thinking
provider 支持推理强度时,使用 OpenHands 的类型化推理字段:特别地,使用
openai-chat 时,interleaved_thinking==true 会绕过 OpenHands 的 model 名称白名单,保留每轮 assistant 的 reasoning_content,并将其发回服务端。max_output_tokens 与服务端上下文窗口。
运行示例
- 默认配置
- 自定义参数
使用 OpenHands 默认参数运行一个 SWE-bench Verified 任务。
输出
Harness 为每个任务返回一个RunResult:
final_answer:第一个成功回收的目标输出文件,SWE 类 Benchmark 中通常是提交的补丁;trajectory:标准化后的 OpenHands 对话与工具历史;受支持的超时路径会保留部分历史;artifacts.file:回收成功的所有目标文件;artifacts.openhands:原始状态、错误、完成消息、历史与 OpenHands 指标;metrics:工作区、工具预设、model 协议、目标/实际输出路径、运行状态与超时诊断。
RUN_ERROR。Benchmark 随后会把 Harness 结果和评测数据一起写入 results/<benchmark>/<model>/<run>/details/,详见结果。