news 2026/10/20 3:08:11

TermGrade Environments开发者指南:如何从零编写一个通过oracle_verified离线评分的终端任务

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TermGrade Environments开发者指南:如何从零编写一个通过oracle_verified离线评分的终端任务

【免费下载链接】termgrade-environments

项目地址:https://ai.gitcode.com/hf_mirrors/ai-and/termgrade-environments
点击查看免费下载

TermGrade Environments(termgrade-environments)是一个包含 1,004 个可执行 Linux 终端任务的基准评测仓库。每个任务由一个 Docker 容器、一份指令说明和一套 pytest 验证器组成,并在离线(无网络)环境下由 6 个主流模型实测了通过率。本文是一份面向新手与终端智能体(terminal agent)开发者的完整指南,手把手教你从零编写一个任务,并让它顺利通过oracle_verified离线评分验证。

🧭 先搞懂 TermGrade Environments 的评分哲学

在动手之前,你需要理解三条铁律,它们决定了任务能否进入正式发布集:

铁律含义对写任务的人的要求
离线评分评分容器以--network none运行,测试文件在评分时才注入解题与测试过程全程不能联网
测试文件不进镜像智能体看不到自己将被什么标准评分tests/只由宿主侧在评分时拷入
oracle_verified参考解答solution/solve.sh必须在构建出的镜像中通过自己的测试你的参考解必须真实可跑,且与测试逐条对齐

oracle_verified的含义见 README.md:参考解答在构建出的镜像内离线跑通自己的验证器,才算通过;无法确认的任务会被打上标记。在 tasks.jsonl 中,每个任务一行,包含task、checksum、gradable、split和oracle_verified字段——这就是你最终要争取的绿灯:

{"task": "task_12292_4fd005", "checksum": "ea4dc4...", "gradable": true, "split": "unseen", "oracle_verified": true}

📌 仓库官方数据:66,165 个候选任务目录中只有 1,004 个(1.5%)通过了这道"参考解自证"筛选。标准不低,但标准完全透明。

📁 一个标准任务的目录结构

每个任务目录都遵循同一套布局。以 environments/task_00002_aa2b6f/ 为例:

environments/task_XXXXX_xxxxxx/ ├── instruction.md # 给智能体看的任务说明(唯一可见信息) ├── task.toml # 元数据:类别、难度、镜像名、网络模式 ├── environment/ │ ├── Dockerfile # 任务镜像(FROM dsbase-venv312:local) │ └── setup.sh # 构建期初始化:布置场景、写测试文件 ├── tests/ │ ├── test.sh # 评分入口:跑 pytest 并写 reward.txt │ └── test_outputs.py # pytest 用例(评分时才注入容器) └── solution/ └── solve.sh # 参考解答(oracle_verified 的被验证对象)
  • 任务说明写法参考:instruction.md(本例要求实现一个日志时间范围过滤工具/app/querylog,明确列出了输入契约、输出契约和必须同时满足的边界情况)
  • 元数据参考:task.toml(category、difficulty、docker_image、network_mode = "no-network")

🚀 第一步:构建基础镜像(只需一次)

所有任务镜像都FROM dsbase-venv312:local,而每个tests/test.sh调用的/opt/verifier_venv/bin/pytest就烤在这个基础镜像里。因此写任务前的第一个命令是构建基础镜像:

docker build -t dsbase-venv312:local base_image/

基础镜像 base_image/Dockerfile 的关键设计值得理解:

  • 基于python:3.12.13-bookworm,预装 pytest、numpy、常用核心工具(grep、sed、jq等)
  • 用 uv 创建独立虚拟环境/opt/verifier_venv,固定pytest==8.4.1+pytest-json-ctrf==0.3.5
  • 验证器环境与系统 Python 隔离:智能体无论怎么折腾系统环境,评分器都能离线工作——这正是--network none评分可行的根基

✍️ 第二步:编写 environment/ 让任务"可进入"

任务镜像由两个文件组成,参考 environment/Dockerfile 与 environment/setup.sh:

  1. Dockerfile只做三件事:
    • FROM dsbase-venv312:local并设置WORKDIR /app
    • 执行setup.sh布置场景(例如 setup.sh 里写入了包含非法 UTF-8 字节、坏日期等陷阱的样例日志)
    • 末尾清除/tests/*.py、/solution/*和临时脚本,确保镜像内不留任何测试代码
  2. setup.sh负责生成任务"现场":占位脚本、输入数据文件、依赖安装。注意它是构建期执行的,网络可用;但你的任务设计不能依赖运行期联网,因为评分时容器是断网的

一个细节:Dockerfile 还会烤入tmux和asciinema。这是为 Terminus-2 / Harbor 脚手架准备的,缺失会导致 no-network 试验直接失败("Failed to install tmux from source")。如果你的镜像会跑在 Harbor 下,保留这两行。

🧪 第三步:编写 tests/ 评分器

评分入口 tests/test.sh 是固定的标准件,核心只有 4 行逻辑:

mkdir -p /logs/verifier cd / /opt/verifier_venv/bin/pytest --ctrf /logs/verifier/ctrf.json /tests/test_outputs.py -rA > /logs/verifier/pytest.out 2>&1 rc=$? if [ $rc -eq 0 ]; then echo 1 > /logs/verifier/reward.txt; else echo 0 > /logs/verifier/reward.txt; fi exit 0

也就是说:pytest 全绿 →reward.txt写入 1。你真正要写的是 tests/test_outputs.py,写测试时有三条实践:

  • 测"可观察结果",不测实现:通过subprocess调用被测产物、断言 stdout / 退出码 / 文件内容(本例测试逐个覆盖边界:START==STOP无输出、时区偏移、跨午夜日期进位等)
  • 每个断言都要能在断网环境跑通:不要假设能 pip install、能访问外网服务
  • 测试数据由 setup.sh 在构建期生成,评分时随tests/一起注入的只有测试代码本身——若测试需要数据文件,确保这些数据在setup.sh阶段就已写入镜像

🛠️ 第四步:编写 solution/solve.sh(oracle 的本体)

参考 solution/solve.sh:它用cat > /app/querylog << 'PYEOF'的方式生成一个完整可运行的工具,覆盖 instruction.md 中的每一条契约。

写参考解的要点:

  • 逐条对照instruction.md的边界情况清单逐条实现,参考解必须"满分",而不是"大致能跑"
  • 只用镜像内已存在的工具与库;需要额外 Python 包时,在setup.sh里离线预装或走基础镜像已装内容
  • 参考解本身就是评分基线:它通不过的地方,你的任务就是坏的

✅ 第五步:复刻 oracle_verified 离线评分流程

最后一步,在本地完整复刻官方评分流程。以下命令序列来自 README.md 的 Quick start,把$T换成你的任务目录即可:

T=environments/task_XXXXX_xxxxxx docker build -t mytask:local $T/environment c=$(docker run -d --network none mytask:local sleep 600) docker exec $c sh -c 'mkdir -p /tests /logs/verifier' docker cp $T/tests/. $c:/tests/ docker cp $T/solution/solve.sh $c:/solve.sh docker exec $c sh -c 'cd /app && bash /solve.sh' docker cp $T/tests/. $c:/tests/ # 恢复 pristine 测试,与官方评分一致 docker exec $c sh -c 'bash /tests/test.sh' docker exec $c cat /logs/verifier/reward.txt # 期望输出: 1 docker rm -f $c

⚠️ 最容易踩的三个坑:

  1. 忘了--network none:本地跑通了不代表离线跑通,你的任务可能在评分时因隐式联网而挂掉
  2. 忘了第二次拷贝 tests/:参考解答可能改写或删除测试文件,官方评分会用宿主侧的干净副本恢复后再跑test.sh,你必须以同样方式验证
  3. reward.txt 不是 1 时只看 pytest 输出不够:test.sh永远exit 0,成败只看/logs/verifier/reward.txt,排障请打开/logs/verifier/pytest.out

🔍 收尾:核对元数据与发布字段

全部通过后,把任务登记进索引与元数据:

  • tasks.jsonl:每任务一行,oracle_verified: true即你在上面流程中的绿灯
  • labels.jsonl:每(任务,模型)一行,记录pass_rate、band、n_counted、k——发布集里 6 个模型共 6,024 条实测标签都在这里
  • run_config.yaml:官方评分的模型配置(scaffold 为 terminus-2 via Harbor、离线评分、各模型的k次采样与 reasoning 开关),可作为你自评时的对照基线
  • task_source.jsonl:以 JSONL 形式内联存放全部任务的指令、测试、参考解与 Dockerfile,方便不克隆目录树也能审阅单个任务

🎯 总结:一份任务通过 oracle_verified 的最小清单

#检查项不满足的后果
1基础镜像dsbase-venv312:local已构建pytest 找不到,评分必挂
2setup.sh在构建期准备好全部输入数据离线评分时无数据可用
3镜像内不含任何测试文件违反"评分标准对智能体不可见"原则
4test.sh使用/opt/verifier_venv/bin/pytest并写reward.txt评分器读不到结果
5参考解在--network none容器中通过自己的全部测试oracle_verified无法为 true

只要按"写指令 → 布置环境 → 写测试 → 写参考解 → 离线自证"的顺序推进,并用 README 中的命令序列做最终验收,你的终端任务就能像仓库里的 1,004 个任务一样,稳稳拿到oracle_verified: true的发布资格。

【免费下载链接】termgrade-environments

项目地址:https://ai.gitcode.com/hf_mirrors/ai-and/termgrade-environments
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/20 3:06:21

Linux字符设备驱动开发实战:从框架原理到最小Demo实现

1. 字符设备驱动到底在做什么Linux 里的设备驱动&#xff0c;网上一搜资料铺天盖地&#xff0c;但如果你只看标题里“字符设备驱动”这六个字&#xff0c;还是会有点懵&#xff1a;字符设备是什么、和块设备有什么区别、我为什么需要写一个驱动&#xff1f;这篇文章我就按自己的…

作者头像 李华
网站建设 2026/10/20 3:06:21

Python 3.2.2 下载安装与兼容性实战:老版本环境的搭建与避坑指南

简介&#xff1a;Python 3.2.2 完整安装包&#xff0c;面向需要在 Windows 平台搭建旧版 Python 环境的开发者&#xff0c;常见于教学、小型项目或依赖旧库的代码维护场景。压缩包共 2 个文件&#xff1a;msi 安装程序支持自定义安装路径、是否写入 PATH 等选项&#xff0c;适合…

作者头像 李华
网站建设 2026/10/20 3:05:31

深度学习可复现性实战:从随机种子到环境锁定的完整指南

1. 可复现性问题的本质&#xff1a;同样一段代码&#xff0c;为什么换台机器结果就对不上我之前在一个项目里接过一个任务&#xff1a;把几个月前训练出来的某图像分类模型完整复现一遍。代码是从仓库里拉出来的&#xff0c;环境照着文档装好&#xff0c;训练也能顺利跑完&…

作者头像 李华
网站建设 2026/10/20 3:05:27

IntelliJ IDEA开发效率提升实战:编码、调试与重构技巧

1. 从“每天一个idea开发小技巧”说起&#xff1a;这个系列到底在解决什么问题“每天一个idea开发小技巧”这个标题&#xff0c;乍一看像是那种日更打卡式的技术分享栏目&#xff0c;但真正动手写过代码、做过项目的人一眼就能看出来&#xff0c;它瞄准的是一个非常具体的痛点&…

作者头像 李华
网站建设 2026/10/20 3:04:59

Kotlin迁移不断Git历史:j2kt-commiter双提交策略实战

简介&#xff1a;j2kt-commiter是一款面向Kotlin迁移场景的命令行工具&#xff0c;主要帮助开发者在将Java项目逐模块转换为Kotlin时&#xff0c;通过两次重命名与提交策略保留每个文件的Git历史记录&#xff0c;适合需要平滑迁移且关注代码溯源的中高级Android或JVM开发者。压…

作者头像 李华
网站建设 2026/10/20 3:04:45

Linux命令实战:从管道组合到服务器故障排查指南

1. 先别急着背命令清单&#xff1a;把命令当成跟系统对话早些年我刚接触 Linux 命令的时候&#xff0c;干过一件现在想起来有点好笑的事&#xff1a;找了一份《常用 Linux 命令大全》&#xff0c;把 ls、cd、cp、mv 的参数背得滚瓜烂熟&#xff0c;结果到了真正需要排查问题的时…

作者头像 李华