面向真实工程工作的自动评估器:LLM 驱动任务,代码固定执行条件、验证结果并生成报告。当前支持 Codex、DeepSeek Harness(DSH)headless 和本机 Kimi Daimon prompt。
项目网站与实测结果 · 免责声明与使用边界 · MIT 许可证
当前模式是 response_patch:候选返回答案和文件内容,由评估器应用修改并执行独立检查。完整终端操作、多人协作和长时间部署任务尚未实现,不能用 smoke 推断这些能力。评估器会执行候选代码;语法限制与目录分离不是恶意代码沙箱,运行不可信代码应先隔离整个评估环境。结果仅供参考,详细范围和责任见免责声明。
Codex 调用显式配置为不注入或生成本机记忆;但沿用原 Codex 目录时,全局 AGENTS.md 仍可能注入,read-only 只读模式也不等于工作区外文件不可读。收据分别标记这些配置与未核实的文件读取隔离。需要严格隔离时,请先在独立环境验证上下文和可读范围,再运行模型。历史结果未记录这一隔离核验,不能据此断言模型当时无法访问本机文件。
Windows 上调用 Codex 时显式使用原生 unelevated 沙盒并保持 read-only;该设置及其局限记录在运行身份中,不代表已验证工作区外的读取隔离。
可运行 python scripts/probe_codex_context.py --out .bench-runs/context-probe-001 检查合成的全局与项目指令是否进入调试上下文;Windows 还可运行 python scripts/probe_codex_readonly.py --out .bench-runs/read-probe-001,对内置只读、unelevated 沙箱做合成文件读访问诊断。两者都不调用模型、不读取本机记忆;诊断结果只针对各自探针,不能认证其他沙箱或历史模型调用。
Codex 候选可显式配置 "local_lookup_audit": "cli_items_v1",配置关闭记忆及命令工具,并以 CLI 报告的事件抽查工具使用;发现工具事件或事件不完整、异常时该轮不评分。收据只记录脱敏的状态,不保存命令或工具输出。python scripts/probe_codex_tool_events.py --out .bench-runs/tool-event-probe-001 使用本机模拟服务与合成文件检查一条命令读取路径的可见性;加 --commands-disabled 可检查命令工具关闭时的同一路径。这些探针不调用模型。CLI 事件不一定覆盖所有嵌套调用,因此未报告工具事件不能证明本地文件绝对不可读或未被访问。需要 HTTPS 时可另设 "codex_transport": "https",仅对该次调用配置使用官方认证的 HTTPS provider,收据记录此条件。
Python 3.11+,运行时只有标准库。在仓库根目录执行,无需安装依赖。
python -m llmagentbench validate --pack pack.json
python -m llmagentbench run --pack pack.json --config configs/fixture-smoke.json --out .bench-runs/demo
python -m llmagentbench report --run .bench-runs/demo
python -m llmagentbench export-public --run .bench-runs/demo --out results/demo
python -m pytest夹具包含正确、错误和首次错误后修复的候选,用于测试评估器。它不是模型测量。pytest 是开发测试依赖。
真实 Codex 使用已有 CLI 登录状态:
python -m llmagentbench run --pack pack.json --config configs/codex.example.json --out .bench-runs/codexconfigs/codex-sol-luna-max.json 固定了本轮 Sol/Luna 的模型请求、裁判、预算、修复次数和随机顺序,可与公开合成题包一起运行。题包、验收器、引擎和执行器指纹随收据保存;LLM 输出及 LLM 裁判可能波动,模型服务端身份和客户端版本也可能变化,因此重跑不保证逐字输出或相同分数。涉及未公开题目的完整运行需要有权访问独立私仓。
DSH 安装与路由按本机已有配置准备。复制 configs/dsh.example.json 到忽略的 local/,填写实际 provider/model/profile。凭据仍由 DSH 原有配置管理。每次新建 headless 会话,用命令本地的 overlay 固定模型和只读策略,不操作已有会话。
# 如 dsh 不在 PATH,变量内容为原生命令及入口参数组成的 JSON 数组。
$env:BENCH_DSH_LAUNCHER = '["C:/Tools/node.exe","C:/Tools/dsh/bin.js"]'
python -m llmagentbench run --pack pack.json --config local/dsh.json --out .bench-runs/dshWindows Desktop 安装可用其原生 Electron 可执行文件和随附 CLI JS 入口,并设 electron_run_as_node: true;不使用 .cmd/.bat 或 shell 拼接。profile 必须预先准备,评估器不修改它。新会话会由 DSH 持久保存。
DSH 候选也可显式配置 "local_lookup_audit": "dsh_json_v1",用单次 overlay 关闭内置指令与常用工具,并检查 headless JSON 事件。工具事件存在或控制事件不完整时不评分;思考或文本事件的内容被 CLI 截断不影响独立工具事件检查。收据记录可执行文件与程序包指纹及抽查状态,不保存工具参数或输出。该检查依赖客户端报告,不证明文件系统隔离,也不能排除其他未报告的访问。
Kimi 使用本机 Daimon 的非交互 prompt 入口。复制 configs/kimi.example.json 到忽略的 local/kimi.json,在本机环境变量中提供 launcher 的 JSON argv 和现有 Daimon 配置路径;认证仍由 Kimi 原有配置管理,不能复制到仓库、case、日志或结果文件。
$env:BENCH_KIMI_LAUNCHER = '["powershell.exe","-NoProfile","-ExecutionPolicy","Bypass","-File","C:/Tools/kimi-daimon.ps1","--node","C:/Tools/Kimi.exe"]'
$env:BENCH_KIMI_CONFIG = Join-Path $env:USERPROFILE '.kimi/daimon/config.json'
python -m llmagentbench run --pack pack.json --config local/kimi.json --out .bench-runs/kimiKimi 候选必须固定 model、reasoning_effort 和 local_lookup_audit: "kimi_wire_v1"。提示要求只输出一个严格的 {answer, files} JSON 对象;适配器只移除明确的 Daimon 运行日志并允许合法多行 JSON,代码围栏、前后夹杂文本、多个 JSON 或字段不合格会作为 case 失败。Daimon 会异步改写配置文件的长批次可在候选中提供运行前计算的 config_identity_sha256,把启动配置身份冻结在收据中。适配器把 answer/files 解析为统一响应,读取单次 wire 收据的 model、thinking、usage 和工具事件摘要;报告到工具调用、wire 缺失或配置不匹配时,该轮为 error。wire 审计是客户端事件观察,不等于操作系统文件隔离;默认工作目录由 Kimi 配置决定,严格隔离需要在独立运行环境中验证。长批次应使用独立的 KIMI_SHARE_DIR,避免与桌面 Kimi 的 daemon 状态和锁相互污染。
| 公开仓 | 独立私仓 |
|---|---|
| 执行器、评分器、合同、合成 case、测试、公开报告 | 非公开 case、输入、隐藏检查、私有运行结果 |
通过 --pack 指向独立私仓,无需 submodule、私有 remote 或把私有文件复制进公开仓。
python -m llmagentbench run --pack ../private-cases/packs/example/pack.json --config local/matrix.json --out ../private-cases/.bench-runs/exampleexport-public 拒绝 private 或非合成 pack。私有结果不自动上传或转成公开汇总。
在用户明确授权公开总体数量和耗时时,可用 export-overall 合并完整运行:它只输出显式指定的公开候选名称、总体数量和耗时,不输出题目、题号、分类、私有 pack 元数据或原始收据。必须提供 --allow-private-aggregate 才能纳入私有运行;发布前仍需审查精确输出内容。
pack.json 是公开题库索引(13 道合成题:工程案例 + smoke 案例 + 绘图题,版本 20261111);私仓维护同版本全量套件(91 题,含全部私有 case)。总体评测包含固定源码片段,不能视为纯合成评测;组成与生成方式见 运行与发布规范。题目覆盖代码修改、问题排查、代码评审、性能分析和绘图。代码题限制在提示中列明的无导入 Python 子集,验收前检查语法树;这些案例仍不是完整终端 Agent 任务。
- 确定性评分优先:JSON 匹配、数值容差、评估器持有的 Python 行为检查、修改路径约束。
- 主观部分用独立 LLM rubric;候选身份不进入评分提示。引用必须出现在输入或答案中,判断本身仍可能出错。
- 记录首次通过率、预算内通过率、失败/未知/错误/超时、修复轮数、运行时间和可用 token 计数。
- 有效吞吐是预算内通过数除以全部尝试的累计计时,再换算为每小时通过题数。累计计时从输入准备完成后开始,包含候选调用、CLI 内的网络与服务排队等待、自动检查、可选 LLM 评分和修复;不含输入准备、样本开始前的调度等待或人工核验。结果同时列出候选调用和 LLM 评分器调用的总耗时,不代表并发服务吞吐。
human_minutes固定为null + NOT_MEASURED;自动修复不能冒充实测人工核验时间。- 未知费用保留
null,当前不能生成美元成本排名。
合成题只验证链路;真实选型需要代表性的未见任务、重复运行、评分器校准和足够样本。重复与修复不会被当作 best-of-N 后只报最好成绩。
GitHub Pages 从 main 分支的仓库根目录发布。网页由 index.html 和 site/ 构成,展示同一轮公开合成题得分和经用户授权的全部题目总体得分;验证文件位于网站根目录。
输出 token 汇总由校验过的原始收据生成,只含各候选调用次数、输出 token 总数和累计候选调用耗时,不包含裁判调用或逐题记录:
python -m scripts.export_public_token_usage --run .bench-runs/public-run --summary results/public-run/summary.json --out results/public-run/token-usage.json多个公开合成运行可重复传入 --run,必须具有一致的引擎、配置、候选和裁判,并先用 export-overall 生成对应汇总。仅已完成的公开合成运行可以导出 token 数据;缺失任一候选调用的 token 数据时不计算部分速率。网页核对公开汇总、token 汇总和条件核验信息后,显示输出 token 数除以累计调用耗时;此客户端速率包含启动和等待,不是服务端纯解码速度。发布新结果时更新 site/app.js 的数据路径及条件核验信息,运行 node tests/site_contract.test.cjs 检查数据口径和加载失败处理,并审查准确的发布内容。
scripts/verify_suite_comparison.py 可检查两份已完成的私有套件收据是否使用相同题包、引擎、驱动、预算和裁判配置;输出仅包含比较状态与请求的模型名称,不导出题目明细。客户端执行文件变化会单独标注,不能当作完全相同的执行环境。