verifiers 0.2.2.dev70__py3-none-any.whl → 0.2.2.dev72__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,7 +2,7 @@
2
2
 
3
3
  The Harbor CLI downloads and caches each task directory. Its verifier runs in the
4
4
  same runtime the harness edited, then writes the score to
5
- ``/logs/verifier/reward.txt``.
5
+ ``/logs/verifier/reward.json`` or the legacy ``reward.txt``.
6
6
 
7
7
  A pullable ``[environment].docker_image`` becomes ``TaskData.image``. Verifiers does
8
8
  not build Dockerfile-only environments, so those are rejected unless ``ignore_dockerfile``
@@ -21,8 +21,9 @@ import tempfile
21
21
  from collections.abc import Iterator
22
22
  from functools import lru_cache
23
23
  from pathlib import Path
24
+ from typing import Annotated
24
25
 
25
- from pydantic import BaseModel, Field
26
+ from pydantic import BaseModel, ConfigDict, Field, TypeAdapter, ValidationError
26
27
 
27
28
  from verifiers.v1.configs.taskset import TasksetConfig
28
29
  from verifiers.v1.errors import SandboxError
@@ -35,6 +36,11 @@ from verifiers.v1.utils.decorators import reward
35
36
 
36
37
  CACHE = Path.home() / ".cache" / "harbor"
37
38
  HARBOR_INSTALL_HINT = "uv sync --python 3.12 --extra harbor"
39
+ REWARD_JSON = "/logs/verifier/reward.json"
40
+ REWARD_JSON_ADAPTER = TypeAdapter(
41
+ float | Annotated[dict[str, float], Field(min_length=1)],
42
+ config=ConfigDict(strict=True, allow_inf_nan=False),
43
+ )
38
44
 
39
45
 
40
46
  class HarborConfig(TasksetConfig):
@@ -140,7 +146,7 @@ class HarborTask(Task[HarborData]):
140
146
  trace.state.artifacts = await collect(runtime, self.data.artifacts)
141
147
 
142
148
  @reward(weight=1.0)
143
- async def solved(self, runtime: Runtime) -> float:
149
+ async def solved(self, runtime: Runtime, trace: Trace) -> float | dict[str, float]:
144
150
  await runtime.write(
145
151
  "/tmp/tests.tgz", make_tar(Path(self.data.task_dir) / "tests")
146
152
  )
@@ -153,14 +159,37 @@ class HarborTask(Task[HarborData]):
153
159
  {},
154
160
  )
155
161
  await runtime.run(
156
- ["sh", "-c", "cd /tests && bash test.sh"], verifier_env(self.data)
162
+ [
163
+ "sh",
164
+ "-c",
165
+ (
166
+ "rm -f /logs/verifier/reward.json /logs/verifier/reward.txt"
167
+ " && cd /tests && bash test.sh"
168
+ ),
169
+ ],
170
+ verifier_env(self.data),
157
171
  )
172
+ scores = await self._reward_json(runtime)
173
+ if scores is not None:
174
+ if isinstance(scores, dict) and "reward" in scores:
175
+ trace.record_metrics(
176
+ {key: value for key, value in scores.items() if key != "reward"}
177
+ )
178
+ return {"reward": scores["reward"]}
179
+ return scores
158
180
  try:
159
181
  reward = (await runtime.read("/logs/verifier/reward.txt")).decode().strip()
160
182
  return float(reward or 0)
161
183
  except (SandboxError, OSError, ValueError):
162
184
  return 0.0
163
185
 
186
+ async def _reward_json(self, runtime: Runtime) -> float | dict[str, float] | None:
187
+ """Read Harbor's scalar or keyed JSON reward, if it is valid."""
188
+ try:
189
+ return REWARD_JSON_ADAPTER.validate_json(await runtime.read(REWARD_JSON))
190
+ except (SandboxError, OSError, ValidationError):
191
+ return None
192
+
164
193
 
165
194
  def harbor_cli() -> str:
166
195
  scripts_dir = Path(sys.executable).parent
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.2.2.dev70
3
+ Version: 0.2.2.dev72
4
4
  Summary: Verifiers: Environments for LLM Reinforcement Learning
5
5
  Project-URL: Homepage, https://github.com/primeintellect-ai/verifiers
6
6
  Project-URL: Documentation, https://github.com/primeintellect-ai/verifiers
@@ -311,7 +311,7 @@ verifiers/v1/serve/server.py,sha256=o2GjMgnNApyN9A2i_7SVL3ui75NTBknQlobfUOVTfdQ,
311
311
  verifiers/v1/serve/types.py,sha256=y8Cf9wKOZRKDXcThFWVygTFHITJofOinGiIzwjQGCUE,2674
312
312
  verifiers/v1/tasksets/__init__.py,sha256=b62O4WDNbGfJH_4NjYmznn5otWovdfvUgJZyoIZyLh8,596
313
313
  verifiers/v1/tasksets/harbor/__init__.py,sha256=wwVGA8N7E2Q2qA5WGHuLRrn4DgG5oaRHrCS2RW3NXVY,195
314
- verifiers/v1/tasksets/harbor/taskset.py,sha256=7cUb7um8FUL2vHhvdSVBN04IwFMzYDjdaAEuMqiPftM,18326
314
+ verifiers/v1/tasksets/harbor/taskset.py,sha256=9rfWTg0s3zPAEppZnjh7zNyi2EbM-qORK2lyWQZQL7s,19565
315
315
  verifiers/v1/tasksets/lean/__init__.py,sha256=oyv-GbJQBvCyGwo7Ysxm2NjZW-aX4j1uDoHU0f-E7xQ,767
316
316
  verifiers/v1/tasksets/lean/scoring.py,sha256=sfzsT6MUK0zdMgAQ57_P_0CBaPHy3M7go71QMr5hDrs,10599
317
317
  verifiers/v1/tasksets/lean/taskset.py,sha256=XgUqX0uJvHC8sKFhbK92iu6nUGcPuXCUpI3ZBhDcb7c,9025
@@ -337,8 +337,8 @@ verifiers/v1/utils/platform.py,sha256=MWZmvyj0iyzNIO0xRhlkCXtFF1plq6EJi8rWlvrFtv
337
337
  verifiers/v1/utils/retries.py,sha256=Y2ZgrAjn-qNkRKZP_RVNL_7EK0iaRcZeCa404lpGYi4,5417
338
338
  verifiers/v1/utils/score.py,sha256=-R5Cog14r_tJ6Q_oOfGr5VPAm2CCUhofYZB6B9lm4wM,5787
339
339
  verifiers/v1/utils/version.py,sha256=-obEo_-l9-D8FLef4hYxncOe-uJpxrM1g2Hig_37Sgs,1607
340
- verifiers-0.2.2.dev70.dist-info/METADATA,sha256=KIrPpfHWXuZ95thI2Vymh--9HQa429Q1V_YI0PMliYg,4545
341
- verifiers-0.2.2.dev70.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
342
- verifiers-0.2.2.dev70.dist-info/entry_points.txt,sha256=dF82JUYEFslR1AOW8LZfuBWeZeQoyX4wCRrduklg8-I,551
343
- verifiers-0.2.2.dev70.dist-info/licenses/LICENSE,sha256=v0RrUsdV3IDoZhrRce297IXS3xMHNJ-_LdLpFAUWb9k,1072
344
- verifiers-0.2.2.dev70.dist-info/RECORD,,
340
+ verifiers-0.2.2.dev72.dist-info/METADATA,sha256=6Il792lPzYePRqxmMiC5qTR_-h5jLSRa2cu2spucfMQ,4545
341
+ verifiers-0.2.2.dev72.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
342
+ verifiers-0.2.2.dev72.dist-info/entry_points.txt,sha256=dF82JUYEFslR1AOW8LZfuBWeZeQoyX4wCRrduklg8-I,551
343
+ verifiers-0.2.2.dev72.dist-info/licenses/LICENSE,sha256=v0RrUsdV3IDoZhrRce297IXS3xMHNJ-_LdLpFAUWb9k,1072
344
+ verifiers-0.2.2.dev72.dist-info/RECORD,,