<owner>/<name>@<version>。它是 agent 用来练习的东西。
平台负责存储它、决定谁能引用它、把它服务出去——但从不编写在它里面运行的东西。
目录结构
tasks.jsonl
每行一个 JSON 对象:train | eval
默认值:"train"
这一行属于 taskset 的哪一半,逐行声明。作业能看到哪一半是平台按操作类型决定的,所以训练作业拿不到留出任务,
评测也要不到训练任务。评测去要一个环境从未声明过的 split 会被拒绝,
而不是悄悄给它训练任务——那正是这个字段要防的那一种失败,
也是唯一一种「看起来像好成绩」的失败。
manifest.json
string
必填
永远是
forge/environment/v1。nemo-gym | openenv | openenv-remote | openenv-image
必填
trainer 怎么够到这个环境。见下文。
array
agent 可以调用什么:名字、端点,以及参数的 JSON Schema。
object
{"plugin": "<owner>/<name>", "version": "...", "entrypoint": "module:ClassName", "digest": "..."}。
nemo-gym 必填。代码属于一个 kind: environment 插件;
平台最多写一个两行的 shim 去 import 它。bool
默认值:"false"
harness 会运行模型生成的代码时为 true。需要沙箱的作业跑在没有配置沙箱提供方的部署上会被拒绝——
它不会退化成「在训练容器里跑」。
string
默认值:"other"
NeMo Gym 的指标分组类别。
nemo-gym 下必填且校验,其他协议下无意义。
取值:math、coding、agent、knowledge、instruction_following、long_context、
safety、games、translation、e2e、rlhf、other。string
openenv 环境的 OCI 镜像。和其他所有固定镜像一样按运行时产物解析,绝不临时拉取。url
openenv-remote 必填,其他协议下禁止。服务已经跑在哪里。四种协议
其中三种是作业真的能走的路径,区别在于谁来跑这个 server。- openenv —— 平台来服务
- nemo-gym —— 框架来跑
- openenv-remote —— 别人在跑
- openenv-image —— 这里跑不了
回合级。平台用自己持有的 taskset 启动环境 server,trainer 通过 openenv-core 的客户端
自己驱动 episode:
reset、step、state。TRL、SkyRL、Unsloth 和 Axolotl 都走这条。不需要 harness——循环本来就归 trainer 管。Harness
驱动模型走完环境的那段代码,以kind: environment 插件提供。
物化那条路需要它——框架要 import 并运行它。
服务那条回合级路径不需要——trainer 自己驱动 episode。
plugin.yaml
harness.digest 锁定这个环境编写时所针对的 harness 包。
团队把 harness 和环境一起发布时留空是诚实的;两者分开版本化、
且 harness 版本不匹配会导致打分不同时,就把它设上。它在提交时校验,不在 rollout 时校验。
推送与引用
<owner>/<name> 或裸名
必填
裸名进入你自己的命名空间。
string
必填
推送后不可变。
flag
只在环境首次创建时生效。
确认成功
下一步
Verifier
判定任务完成的三种方式,以及各自的确切契约。
Rubric
写下裁判据以打分的那份标准。