跳转到主要内容
平台解析这个版本、确认你有权使用它,然后把它送进作业。你的训练代码从不持有一个自己选的路径或 URL。
这一页讲怎么用一个环境。怎么写一个 —— manifest、任务集、协议 —— 见 编写环境。

作业收到什么

三个环境变量,由控制面设置:
不要在实验里硬编码其中任何一个。路径是平台给的,直接写死一个路径的实验绕过了解析它的那道权限 检查。

split 不由你选

TUNEPLANE_JOB_ENVIRONMENT_SPLIT 由操作本身决定:训练作业拿 train,评测拿 eval。没有参数 能覆盖它。 这就是全部的安全属性,而它为什么是一个状态而不是一个设置,值得说白。留出的数据在”选它”变成一件 方便事的那一刻就不再是留出的了。分数最好的那次运行会变成在自己训练任务上评测的那次 —— 而下游没有 任何东西能看出这件事。数字看起来很好,模型并不好,而这个错误在那次运行产出的每个产物里都是隐形的。 让操作来决定,意味着泄漏不是一个有人会设错的设置。它是一个系统到不了的状态。 一次评测索要环境从未声明过的 split 会被拒绝,而不是被悄悄喂上训练任务。

作业能走的三条路

平台运行环境服务端。你的训练器通过 openenv-core 的客户端 —— reset、step、state —— 对着 TUNEPLANE_JOB_ENVIRONMENT_URL 驱动 episode。TRL、SkyRL、Unsloth 和 Axolotl 原生消费这种。没有额外要写的东西。
一份 manifest 还可以声明 openenv (deployment: container),即别人的 OpenEnv 容器。没有作业能到达它:托管另一方的 容器是执行器的活,而这个平台不做,所以这种引用会在准入时被拒绝,而不是在 launcher 里才发现。

奖励来自判定器

你不为环境写奖励函数 —— 环境声明由什么决定完成,而那永远是一个引用: 答不出来的判定器会抛异常,不会上报零。这个区别比听起来重要得多,原因见 判定器。

沙箱

harness 要跑模型生成代码的环境会声明 sandbox.required。在没有配置沙箱提供方的部署上,这种作业 会在准入时被拒绝 —— 它不会退回到在训练容器里跑那些代码。 你需要沙箱却被拒绝时,让管理员设 TUNEPLANE_SANDBOX_IMAGE。这里有意没有默认值:跑模型生成的代码 不该是能被顺手打开的事。

确认成功

launcher 会把它解析到的环境和走的那条路打进日志:
如果 reward 对每条 rollout 都平在同一个值上,先怀疑判定器,再怀疑模型 —— 一个返回常数的插件判定器 和一个模型完全做不到的任务,从曲线上看是一模一样的。

下一步

编写环境讲 manifest 和任务集 · 判定器 · 评分标准