verifiers 0.3.2.dev69__py3-none-any.whl → 0.3.2.dev71__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.
- verifiers/v1/serve/encoding.py +6 -3
- verifiers/v1/serve/server.py +15 -5
- verifiers/v1/tasksets/harbor/taskset.py +22 -15
- {verifiers-0.3.2.dev69.dist-info → verifiers-0.3.2.dev71.dist-info}/METADATA +1 -1
- {verifiers-0.3.2.dev69.dist-info → verifiers-0.3.2.dev71.dist-info}/RECORD +8 -8
- {verifiers-0.3.2.dev69.dist-info → verifiers-0.3.2.dev71.dist-info}/WHEEL +0 -0
- {verifiers-0.3.2.dev69.dist-info → verifiers-0.3.2.dev71.dist-info}/entry_points.txt +0 -0
- {verifiers-0.3.2.dev69.dist-info → verifiers-0.3.2.dev71.dist-info}/licenses/LICENSE +0 -0
verifiers/v1/serve/encoding.py
CHANGED
|
@@ -8,6 +8,7 @@ from pathlib import Path
|
|
|
8
8
|
from uuid import UUID
|
|
9
9
|
|
|
10
10
|
import numpy as np
|
|
11
|
+
from pydantic_core import to_jsonable_python
|
|
11
12
|
|
|
12
13
|
# Marker key inside the encoded payload so a decoder can recognize a
|
|
13
14
|
# tensor round-trip without disturbing arbitrary user dicts.
|
|
@@ -31,14 +32,17 @@ def msgpack_encoder(obj):
|
|
|
31
32
|
is ONLY called for types msgpack doesn't recognize. This avoids the massive
|
|
32
33
|
performance penalty of recursing through millions of tokens in Python.
|
|
33
34
|
|
|
34
|
-
Handles: Path, UUID, Enum, datetime, Pydantic models, numpy scalars,
|
|
35
|
+
Handles: Path, UUID, sets, Enum, datetime, Pydantic models, numpy scalars,
|
|
35
36
|
numpy arrays, torch tensors, and dataclasses (e.g. renderers'
|
|
36
37
|
``MultiModalData`` / ``PlaceholderRange``). Tensors and ndarrays are
|
|
37
38
|
encoded as ``{__torch_tensor__: True, dtype, shape, data}``.
|
|
39
|
+
Other types use Pydantic's JSON conversions; unsupported types still raise.
|
|
38
40
|
Does NOT handle: lists, dicts, basic types (msgpack does this natively in C).
|
|
39
41
|
"""
|
|
40
42
|
if isinstance(obj, (Path, UUID)):
|
|
41
43
|
return str(obj)
|
|
44
|
+
elif isinstance(obj, (set, frozenset)):
|
|
45
|
+
return list(obj)
|
|
42
46
|
elif isinstance(obj, Enum):
|
|
43
47
|
return obj.value
|
|
44
48
|
elif isinstance(obj, (datetime, date)):
|
|
@@ -61,5 +65,4 @@ def msgpack_encoder(obj):
|
|
|
61
65
|
elif dataclasses.is_dataclass(obj) and not isinstance(obj, type):
|
|
62
66
|
return dataclasses.asdict(obj)
|
|
63
67
|
else:
|
|
64
|
-
|
|
65
|
-
raise TypeError(f"Object of type {type(obj)} is not msgpack serializable")
|
|
68
|
+
return to_jsonable_python(obj)
|
verifiers/v1/serve/server.py
CHANGED
|
@@ -136,11 +136,21 @@ class EnvServer:
|
|
|
136
136
|
) as e: # a failed request is data, not a crash — report and keep serving
|
|
137
137
|
logger.warning("request failed: %s", e, exc_info=True)
|
|
138
138
|
response = BaseResponse(success=False, error=f"{type(e).__name__}: {e}")
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
139
|
+
try:
|
|
140
|
+
data = msgpack.packb(
|
|
141
|
+
response.model_dump(mode="python"),
|
|
142
|
+
default=msgpack_encoder,
|
|
143
|
+
use_bin_type=True,
|
|
144
|
+
)
|
|
145
|
+
except Exception as e:
|
|
146
|
+
# Encoding failures must also reply so clients don't wait indefinitely.
|
|
147
|
+
logger.warning("response encoding failed: %s", e, exc_info=True)
|
|
148
|
+
data = msgpack.packb(
|
|
149
|
+
BaseResponse(
|
|
150
|
+
success=False, error=f"{type(e).__name__}: {e}"
|
|
151
|
+
).model_dump(),
|
|
152
|
+
use_bin_type=True,
|
|
153
|
+
)
|
|
144
154
|
try:
|
|
145
155
|
# Let ZMQ retain the packed response instead of copying large traces.
|
|
146
156
|
await self.frontend.send_multipart(
|
|
@@ -27,7 +27,7 @@ import tempfile
|
|
|
27
27
|
import time
|
|
28
28
|
from collections.abc import Iterator
|
|
29
29
|
from functools import lru_cache
|
|
30
|
-
from pathlib import Path
|
|
30
|
+
from pathlib import Path, PurePosixPath
|
|
31
31
|
from typing import Annotated
|
|
32
32
|
|
|
33
33
|
from pydantic import BaseModel, ConfigDict, Field, TypeAdapter, ValidationError
|
|
@@ -250,31 +250,38 @@ class HarborTask(Task[HarborData]):
|
|
|
250
250
|
if not self.scoring_deferred:
|
|
251
251
|
trace.state.artifacts = await collect(runtime, self.data.artifacts)
|
|
252
252
|
|
|
253
|
-
async def stage_verifier(self, runtime: Runtime) -> None:
|
|
254
|
-
|
|
253
|
+
async def stage_verifier(self, trace: Trace, runtime: Runtime) -> None:
|
|
254
|
+
if any(
|
|
255
|
+
PurePosixPath(root).is_relative_to("/tests")
|
|
256
|
+
for root in trace.state.artifacts
|
|
257
|
+
):
|
|
258
|
+
raise TaskError("Harbor artifacts cannot restore into /tests")
|
|
255
259
|
await self.stage_tests(runtime, wipe=True)
|
|
256
260
|
self.verifier_staged = True
|
|
257
261
|
|
|
258
262
|
async def stage_tests(self, runtime: Runtime, wipe: bool = False) -> None:
|
|
259
|
-
"""
|
|
263
|
+
"""Use a dedicated verifier image's tests, or stage the task package's tests.
|
|
260
264
|
|
|
261
265
|
Raises rather than scoring stale state: a leftover reward file — planted by
|
|
262
266
|
the agent or shipped in the image — must be gone before `test.sh` runs, so a
|
|
263
267
|
removal that fails must not fall through to reading it.
|
|
264
|
-
|
|
265
|
-
`wipe` for a box we did not watch being built: a fresh container of the task's
|
|
266
|
-
image can ship its own `/tests`, and a leftover file there would be graded as
|
|
267
|
-
though it came from the package.
|
|
268
268
|
"""
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
269
|
+
# Harbor's dedicated verifier image owns the complete test suite and its
|
|
270
|
+
# dependencies. Mixing it with packaged tests can retain obsolete helpers.
|
|
271
|
+
stage = "test -f /tests/test.sh"
|
|
272
|
+
if self.data.verifier is None or self.data.verifier.image is None:
|
|
273
|
+
await runtime.write(
|
|
274
|
+
"/tmp/tests.tgz", make_tar(Path(self.data.task_dir) / "tests")
|
|
275
|
+
)
|
|
276
|
+
stage = (
|
|
277
|
+
f"{'rm -rf /tests && ' if wipe else ''}"
|
|
278
|
+
"mkdir -p /tests && tar -xzf /tmp/tests.tgz -C /tests"
|
|
279
|
+
)
|
|
280
|
+
command = (
|
|
274
281
|
"rm -f /logs/verifier/reward.json /logs/verifier/reward.txt && "
|
|
275
|
-
"mkdir -p /logs/verifier
|
|
282
|
+
f"mkdir -p /logs/verifier && {stage}"
|
|
276
283
|
)
|
|
277
|
-
result = await runtime.run(["sh", "-c",
|
|
284
|
+
result = await runtime.run(["sh", "-c", command], {})
|
|
278
285
|
if result.exit_code:
|
|
279
286
|
raise TaskError(
|
|
280
287
|
f"staging tests failed (exit {result.exit_code}): "
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: verifiers
|
|
3
|
-
Version: 0.3.2.
|
|
3
|
+
Version: 0.3.2.dev71
|
|
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
|
|
@@ -150,14 +150,14 @@ verifiers/v1/runtimes/docker/__init__.py,sha256=JN0mI10a_BKQpRRJKX_NqStAoODAEk2d
|
|
|
150
150
|
verifiers/v1/runtimes/docker/egress.py,sha256=iFH_1XotlEM-OCaW7GNu3TWVEq1sqesKYweyVBX8g90,14360
|
|
151
151
|
verifiers/v1/serve/__init__.py,sha256=doImCSxSYZEjVDXfRafLHkhHXcXQxzA6qUGMBQ8bSko,477
|
|
152
152
|
verifiers/v1/serve/client.py,sha256=biy46qOOFTjMXSIsY8W1vMEfctn7usCeNuBQsJqc2mc,7789
|
|
153
|
-
verifiers/v1/serve/encoding.py,sha256=
|
|
153
|
+
verifiers/v1/serve/encoding.py,sha256=hBZFucAZK9riXOV3DaHcskq9zHTT8gVGkoFVOPfnr30,2499
|
|
154
154
|
verifiers/v1/serve/pool.py,sha256=HZsJPcru9eNrxo3Rmi-Vdt1tjZwqo2oI4Ql_IKfUMtY,15443
|
|
155
|
-
verifiers/v1/serve/server.py,sha256
|
|
155
|
+
verifiers/v1/serve/server.py,sha256=-XfvWN_7kzN7z49YWd2rADHABiDTAdpPszEMjhWgyno,9216
|
|
156
156
|
verifiers/v1/serve/types.py,sha256=CjZ6PWQlzSRkBG77gXfzKHnw_S_qKUm9dZSSxVgkv1w,1552
|
|
157
157
|
verifiers/v1/tasksets/__init__.py,sha256=5hTKSPLXSZTgKBbeKQI7FEp06c0ZsaQfuwvrvVFLgb8,712
|
|
158
158
|
verifiers/v1/tasksets/harbor/__init__.py,sha256=JxThzHFYEkuSfQbVf3pEnjordgdfe4MU-QOsSSbyovU,326
|
|
159
159
|
verifiers/v1/tasksets/harbor/env.py,sha256=rZEh-1IaHpfsrwSOn7qTq7uV0K7cZZ28bHB7BEWQdnc,3622
|
|
160
|
-
verifiers/v1/tasksets/harbor/taskset.py,sha256=
|
|
160
|
+
verifiers/v1/tasksets/harbor/taskset.py,sha256=snoCQdoNBVdk9INQdfhZa8NXDXJjaidd7hU0T9cAuas,32525
|
|
161
161
|
verifiers/v1/tasksets/lean/__init__.py,sha256=oyv-GbJQBvCyGwo7Ysxm2NjZW-aX4j1uDoHU0f-E7xQ,767
|
|
162
162
|
verifiers/v1/tasksets/lean/scoring.py,sha256=sfzsT6MUK0zdMgAQ57_P_0CBaPHy3M7go71QMr5hDrs,10599
|
|
163
163
|
verifiers/v1/tasksets/lean/taskset.py,sha256=Jax76i22G9dOAswQHiWujVbFIM_PUz5yGJI_ShR4n8Y,9238
|
|
@@ -189,8 +189,8 @@ verifiers/v1/utils/prime.py,sha256=UTYRjp9cbjNb6CVmBHda-1wWZAIIfxNOmTyNuT7_wL4,9
|
|
|
189
189
|
verifiers/v1/utils/retries.py,sha256=Y2ZgrAjn-qNkRKZP_RVNL_7EK0iaRcZeCa404lpGYi4,5417
|
|
190
190
|
verifiers/v1/utils/score.py,sha256=493yJVMw8teCu9JxapxMFPFzI0hNUqdo0Y2nGW4kckk,6200
|
|
191
191
|
verifiers/v1/utils/version.py,sha256=-obEo_-l9-D8FLef4hYxncOe-uJpxrM1g2Hig_37Sgs,1607
|
|
192
|
-
verifiers-0.3.2.
|
|
193
|
-
verifiers-0.3.2.
|
|
194
|
-
verifiers-0.3.2.
|
|
195
|
-
verifiers-0.3.2.
|
|
196
|
-
verifiers-0.3.2.
|
|
192
|
+
verifiers-0.3.2.dev71.dist-info/METADATA,sha256=FeO8Ciqzot_uCkoMeTBll1GESqgEg7_1YHMybm994oQ,4204
|
|
193
|
+
verifiers-0.3.2.dev71.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
|
|
194
|
+
verifiers-0.3.2.dev71.dist-info/entry_points.txt,sha256=uqQje0TMsr7k6nXlWxlPs13Si0evb3pVCEDF6c-YL80,241
|
|
195
|
+
verifiers-0.3.2.dev71.dist-info/licenses/LICENSE,sha256=v0RrUsdV3IDoZhrRce297IXS3xMHNJ-_LdLpFAUWb9k,1072
|
|
196
|
+
verifiers-0.3.2.dev71.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|