用途
generate-ors-env 用于构建强化学习(RL)环境的 ORS(Open Reward Standard)变体。ORS 是 Open Reward Standard(openrewardstandard.io)定义的协议,采用 HTTP REST + Server-Sent Events,面向智能体环境。其标志性特征是奖励随每个 ToolOutput 内联返回,区别于 OpenEnv(外部/事后奖励)和 NeMo Gym(回合后 /verify)。
当用户已有共享领域模块(<domain>.py)并希望生成 ORS 变体时,应包装该模块,而不是把领域逻辑复制到框架文件夹中。
主要能力
该技能覆盖以下环境原型:
- 纯 Python 游戏:单个 @tool,tasks.py 中包含 N 个任务字典构成训练集,通过 finished=True 给出终端奖励。
- 有状态沙箱:setup() 从 task_spec 分配资源,teardown() 释放资源,每个工具提供奖励桩。
- 视觉/计算机使用:返回 ImageBlock(data=<base64>, mimeType="image/png"),由 terminate(status) 工具发出终端奖励。
技能规定了服务端与客户端的确切导入方式:
服务端: from openreward.environments import ( Environment, Server, tool, ToolOutput, TextBlock, Split, ImageBlock, )
客户端(rollout): from openreward import EnvironmentsAPI api = EnvironmentsAPI(base_url=URL, api_key="") env = api.get(ENV_NAME)
注意:不要使用 OpenReward(api_key=..., base_url=...),因为它会向 base URL 前置 matrix. / api. / construct. 子域,从而破坏 HF Space URL。EnvironmentsAPI 会原样访问 base_url。
使用方式
技能给出了目录结构与实现顺序。
目录结构: <env_dir>/ors/ ├── pyproject.toml # openreward>=0.1.33 + e2b-*(如需要)+ pydantic ├── init.py ├── Dockerfile # 本地开发镜像 ├── Dockerfile.spaces # HF Space(端口 7860,单阶段 pip install) ├── README.spaces.md # HF Space frontmatter ├── server.py # Environment 子类 + main() ├── tasks.py # 字典列表(每个任务的 task_spec) ├── rollout.py # 或 rollout_openai.py + rollout_qwen.py └── README.md # 一页开发 README
实现顺序:
-
任务文件 tasks.py:一个普通字典列表,每个字典成为每个会话的 task_spec。ORS 在 list_tasks() 时自动包装为 Task 对象。
-
Environment 子类 server.py:定义 setup()(首次工具调用时调用)、teardown()(会话删除时调用)、list_splits()、list_tasks()、get_prompt() 以及 @tool 方法。关键契约包括:工具第二个参数为 params: PydanticModel,ORS 使用该模型的 JSON schema 作为工具的 input_schema;空输入也需 Pydantic 模型(class _Empty(BaseModel): pass);ToolOutput.blocks 为 [TextBlock | ImageBlock];reward 为 float | None,None 表示本步无奖励,0.0 表示已执行但得零分;finished=True 结束会话;task_spec 是字典,从 self.task_spec 读取,无 schema 校验。
-
服务端入口 main():使用 argparse 解析 --port 与 --host,调用 Server([WordleORS]).run(host=args.host, port=args.port)。端点名由类名小写自动派生,例如 WordleORS → wordleors。
-
Rollout:始终从环境发现工具与任务,不要硬编码名称。使用 env.list_tasks("train")、env.list_tools(format="openai")、env.session(task=tasks[0]) 等。视觉环境截图工具返回 ImageBlock,读取 b.data(已是 base64)传入模型图像内容。
-
Dockerfile:Dockerfile.spaces 是 HF Space 部署镜像,保持精简,示例使用 python:3.11-slim、创建用户、pip install openreward pydantic 等、EXPOSE 7860、CMD 启动 server.py。README.spaces.md 包含 frontmatter(title、emoji、colorFrom、colorTo、sdk: docker、app_port: 7860、tags)。
推送到 HF Spaces:创建名为 <owner>/<env_name>-ors 的 Space,将 E2B_API_KEY 等设为 Space secrets(而非环境变量),本地 .env 不应上传。使用 api.add_space_secret 与 api.upload_file 上传 Dockerfile.spaces、README.spaces.md、server.py、tasks.py、init.py、pyproject.toml。
验证关卡:
- 本地服务器:uv run python server.py --port 8772,然后 curl http://localhost:8772/list_environments 返回 ["<envname>"]。
- 工具发现:curl http://localhost:8772/<envname>/tools | jq '.tools | length' 与 @tool 方法数量一致。
- 端到端:MAX_TURNS=3 uv run python rollout.py 驱动模型至少完成一次工具调用且无错误。
适用场景
适用于需要为智能体环境搭建 ORS 脚手架、编写 Environment 子类、定义任务与工具、生成 rollout 脚本,以及部署到 Hugging Face Spaces 的开发者。
限制与注意事项
技能列出了常见陷阱:
- from openreward.environments.types import Task 是错误的;Task 位于 openreward.api.environments.types,通常无需导入。list_tasks 可返回普通字典,ORS 会包装。
- OpenReward(base_url=URL) 会重写 URL,前置 matrix. / api. / construct. 子域;HF Spaces 应直接使用 EnvironmentsAPI(base_url=URL, api_key="")。
- e2b-desktop 依赖 e2b 但未固定版本,需将两者都加入依赖。
- 端点名是类名小写,例如 MyEnvORS 变为 myenvors,需明确告知用户以正确设置 ENV_NAME 环境变量。
参考资料包括 references/architecture.md(协议形态与 Server / Environment / Session 生命周期)、openrewardstandard.io(协议规范)、docs.openreward.ai(Python SDK 与平台文档)、PyPI 上的 openreward(最新 0.1.81+)、GitHub 上的 Talc-AI/OpenReward(源码)。
关于收费、价格、平台或效果等具体信息,资料中暂未提供。