verifiers 0.3.2.dev108__py3-none-any.whl → 0.3.2.dev110__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.
@@ -17,7 +17,7 @@ class JudgeConfig(BaseClientConfig):
17
17
  name: str = ""
18
18
  """Reward key override for a plugged judge."""
19
19
  weight: FiniteFloat = 1.0
20
- model: str = "openai/gpt-5.4-nano"
20
+ model: str = "openai/gpt-5.6-luna"
21
21
  sampling: SamplingConfig = SamplingConfig()
22
22
  prompt: Path | None = None
23
23
  """File whose text overrides the judge's default prompt template."""
@@ -1,10 +1,4 @@
1
- """Remote Prime sandbox runtime.
2
-
3
- `expose` (sandbox port -> public URL) uses the SDK's native exposure (`client.expose`), so a
4
- host-side harness/framework can reach a tool server hosted in the sandbox. The reverse
5
- direction (a program in the sandbox reaching a host service) is the shared host-side
6
- `Tunnel` (interception.tunnel), not the runtime's concern.
7
- """
1
+ """Remote Prime VM sandbox runtime."""
8
2
 
9
3
  import asyncio
10
4
  import base64
@@ -25,7 +19,6 @@ from pydantic import Field, model_validator
25
19
  from verifiers.v1.configs.runtime import NetworkPolicyConfig
26
20
  from verifiers.v1.errors import SandboxError
27
21
  from verifiers.v1.runtimes.base import (
28
- SERVICE_PORT,
29
22
  BaseRuntimeInfo,
30
23
  ProgramResult,
31
24
  Runtime,
@@ -73,15 +66,11 @@ class PrimeConfig(NetworkPolicyConfig):
73
66
  type: Literal["prime"] = "prime"
74
67
  image: str = "python:3.11-slim"
75
68
  """Docker image to run. Any pullable ref works: on the first use of an image, the
76
- platform auto-builds what the sandbox needs from it (a VM image for `vm` sandboxes,
77
- ~10 minutes) and caches the result, so later sandboxes on the same ref start in
69
+ platform auto-builds the VM image that the sandbox needs from it (~10 minutes)
70
+ and caches the result, so later sandboxes on the same ref start in
78
71
  seconds."""
79
72
  workdir: str | None = None
80
73
  """Working directory override; None uses the task's workdir, or /app."""
81
- vm: bool = True
82
- """Run as a micro-VM rather than a container (kernel features / stronger isolation)."""
83
- guaranteed: bool = False
84
- """Request guaranteed (vs best-effort) capacity."""
85
74
  region: str | None = None
86
75
  """Region to provision in (None = provider-chosen)."""
87
76
  labels: list[str] = Field(default_factory=list)
@@ -106,10 +95,6 @@ class PrimeConfig(NetworkPolicyConfig):
106
95
  def _validate_egress(self) -> "PrimeConfig":
107
96
  if not self.network_restricted:
108
97
  return self
109
- if not self.vm:
110
- raise ValueError(
111
- "Prime allow/block egress lists require a VM sandbox (vm=true)"
112
- )
113
98
  if not self.allow:
114
99
  return self
115
100
  validate_egress_lists(
@@ -156,11 +141,7 @@ class PrimeRuntime(Runtime):
156
141
 
157
142
  @property
158
143
  def supports_live_processes(self) -> bool:
159
- return self.config.vm
160
-
161
- @property
162
- def published_port(self) -> int | None:
163
- return SERVICE_PORT
144
+ return True
164
145
 
165
146
  async def start(self) -> None:
166
147
  from prime_sandboxes import AsyncSandboxClient, CreateSandboxRequest
@@ -186,14 +167,7 @@ class PrimeRuntime(Runtime):
186
167
  "memory_gb": self.config.memory,
187
168
  "disk_size_gb": self.config.disk,
188
169
  "gpu_count": gpu_count,
189
- # -1 is prime's convention for no lifetime limit; containers with an
190
- # idle timeout must carry a finite lifetime as a safety fallback (which
191
- # must exceed the idle timeout)
192
- "timeout_minutes": (
193
- -1
194
- if self.config.vm or idle_minutes is None
195
- else max(EFFECTIVELY_UNBOUNDED_SECONDS // 60, idle_minutes + 1)
196
- ),
170
+ "timeout_minutes": -1,
197
171
  "idle_timeout_minutes": idle_minutes,
198
172
  "gpu_type": gpu_type,
199
173
  "region": self.config.region,
@@ -216,8 +190,6 @@ class PrimeRuntime(Runtime):
216
190
  dict.fromkeys([*BASE_LABELS, *self.config.labels])
217
191
  ),
218
192
  docker_image=self.config.image,
219
- vm=self.config.vm,
220
- guaranteed=self.config.guaranteed,
221
193
  environment_vars=self.env,
222
194
  **{k: v for k, v in options.items() if v is not None},
223
195
  )
@@ -323,11 +295,6 @@ class PrimeRuntime(Runtime):
323
295
  async def open_process(
324
296
  self, argv: list[str], env: dict[str, str]
325
297
  ) -> RuntimeProcess:
326
- if not self.config.vm:
327
- raise SandboxError(
328
- "persistent harness sessions on Prime require a VM sandbox; "
329
- "set runtime.prime.vm=true"
330
- )
331
298
  try:
332
299
  process = await self._client.open_process(
333
300
  self.info.id,
@@ -339,22 +306,11 @@ class PrimeRuntime(Runtime):
339
306
  raise SandboxError(f"prime live process failed to start: {e}") from e
340
307
  return PrimeProcess(process)
341
308
 
342
- async def expose(self, port: int) -> str | None:
343
- # Publish a server hosted IN the sandbox via the SDK's native port exposure → a public
344
- # HTTPS URL. Removed when the sandbox is deleted in stop(), so a tool in its own prime
345
- # sandbox needs no host tunnel. Port exposure is region-gated: many regions (incl. the
346
- # backend default, which lands in us-central) 400 it; `us` supports it. TODO: re-enable the
347
- # prime cases in the e2e `skip_if_unexposable` guard once prime exposes ports in any region.
348
- try:
349
- exposed = await self._client.expose(self.info.id, port)
350
- except Exception as e: # surface prime's exposure constraints actionably
351
- raise SandboxError(
352
- "prime port exposure failed — port exposure isn't supported in this sandbox's "
353
- "region; pin `tools.runtime.region` to a region that supports it (e.g. `us`), or "
354
- f"use a colocated / docker / modal tools.runtime instead. ({e})"
355
- ) from e
356
- logger.info("prime: exposed sandbox port %d at %s", port, exposed.url)
357
- return exposed.url.rstrip("/")
309
+ async def expose(self, port: int) -> str:
310
+ raise SandboxError(
311
+ "Prime VM sandboxes do not support port exposure; colocate the service "
312
+ "with its consumer, or use a docker or modal service runtime"
313
+ )
358
314
 
359
315
  async def run_background(
360
316
  self, argv: list[str], env: dict[str, str], log: str
@@ -371,7 +327,7 @@ class PrimeRuntime(Runtime):
371
327
  raise SandboxError(f"prime background launch failed: {e}") from e
372
328
 
373
329
  async def _read(self, path: str, max_bytes: int | None = None) -> bytes:
374
- if max_bytes is not None and self.config.vm:
330
+ if max_bytes is not None:
375
331
  try:
376
332
  # VM execute_command uses bash and returns the complete output stream.
377
333
  result = await self._client.execute_command(
@@ -386,8 +342,6 @@ class PrimeRuntime(Runtime):
386
342
  if result.exit_code:
387
343
  raise SandboxError(f"read {path!r}: {result.stderr.strip()[-500:]}")
388
344
  return base64.b64decode(result.stdout)
389
- if max_bytes is not None:
390
- return await super()._read(path, max_bytes)
391
345
  # Avoid background-job log limits and base64 overhead by downloading binary data directly.
392
346
  # The temporary file is removed on every exit, and its byte read stays off the event loop.
393
347
  target = (
verifiers/v1/task.py CHANGED
@@ -104,8 +104,7 @@ class TaskData(BaseModel):
104
104
  network_allow: list[str] = Field(default_factory=lambda: ["*"])
105
105
  """Execution-time destinations requested by this task. `*` leaves the runtime
106
106
  allowlist unchanged; a concrete list replaces a wildcard or retains entries also
107
- present in an existing allowlist. Prime runtimes accept host-level entries and
108
- require `vm=true`."""
107
+ present in an existing allowlist. Prime runtimes accept host-level entries."""
109
108
  network_block: list[str] = Field(default_factory=list)
110
109
  """Execution-time destinations denied by this task and combined with runtime
111
110
  blocks. Non-empty concrete allowlists cannot be combined with blocklists. Docker
@@ -37,7 +37,7 @@ class HarborEnv(IsolatedVerifierEnv, vf.Env[HarborEnvConfig]):
37
37
  await agents.agent.run(task)
38
38
  return
39
39
  # Resolve the verifier's box before the solve, so an impossible pairing
40
- # (e.g. a restricted Prime verifier without vm=true) costs nothing
40
+ # (e.g. an invalid network policy) costs nothing
41
41
  # rather than a full agent run.
42
42
  self.verifier_config(task)
43
43
  await agents.agent.run(task.defer_scoring(), collect_artifacts=True)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: verifiers
3
- Version: 0.3.2.dev108
3
+ Version: 0.3.2.dev110
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
@@ -36,7 +36,7 @@ Requires-Dist: numpy>=2.1.0
36
36
  Requires-Dist: openai<3.0.0,>=2.54.0
37
37
  Requires-Dist: prime-pydantic-config[toml]>=0.4.3
38
38
  Requires-Dist: prime-runs>=0.1.3
39
- Requires-Dist: prime-sandboxes>=0.2.39
39
+ Requires-Dist: prime-sandboxes>=0.3.0
40
40
  Requires-Dist: prime-tunnel>=0.1.8
41
41
  Requires-Dist: pydantic>=2.12.3
42
42
  Requires-Dist: pyzmq>=27.1.0
@@ -12,7 +12,7 @@ verifiers/v1/rollout.py,sha256=oka3sNdv1EbE6LatFFRMJH-5ti6FcqFuD8xa7oVUyDA,24405
12
12
  verifiers/v1/semantic.py,sha256=VQ_buw6Ya6QtRoh_fiYI5Avs5RmIQCfWH0H0bQc4aoc,4704
13
13
  verifiers/v1/session.py,sha256=7iarEDRH2epID_O8ai-1HwveXze_o8shnLw9pFMFX5o,18900
14
14
  verifiers/v1/state.py,sha256=EckF2bWp-vV4b1jYJ9sLI5xrfGuI5spIgYYwW926toI,595
15
- verifiers/v1/task.py,sha256=k2OImOcSohtrqmqRZS2Gv1JauOrEMPrtjSDS1o0ZTjo,12453
15
+ verifiers/v1/task.py,sha256=7iJLXQo7JKX5jG87atIwT_HZlSto_3a7yB3w__uQQQw,12427
16
16
  verifiers/v1/taskset.py,sha256=fp2E0IEhL_Ybj9cegZwljfTmW27p_30zTWHFKw_kXE4,4374
17
17
  verifiers/v1/trace.py,sha256=uOlrvP1-C4TYtcK3S6zcCNK6UlS78hUoL-KGvJL0IsQ,32011
18
18
  verifiers/v1/types.py,sha256=PH1SxRWXOjPCgQD9aZgM18_bECvFSNQ25gkCbulmTKU,9857
@@ -47,7 +47,7 @@ verifiers/v1/configs/agent.py,sha256=PiWMNueum67vnyLLpIgxXZDb3FTQEUFqo2Z1siOOJqs
47
47
  verifiers/v1/configs/client.py,sha256=fPWtBJv5lPkqttwk0AF2ubfLdzxX2XCO0Zr-A9V4mtk,4440
48
48
  verifiers/v1/configs/env.py,sha256=-Bcdd4MEPfekVc_fnpiwsb9UDwCNdNCKrAHGoQuuXu8,7784
49
49
  verifiers/v1/configs/harness.py,sha256=ZrR-Egzfft95oMoqQ78bAq9TqP882Q68M_47Ajw9lE8,2918
50
- verifiers/v1/configs/judge.py,sha256=CBmGgyHXVpcBctvrFD5GlW75wpeFXVFajq_xiMaAVDk,2142
50
+ verifiers/v1/configs/judge.py,sha256=WEwA8D4X5JSaIP3c-E2wPnvgByWeT6JRAn1d8gfiQ40,2142
51
51
  verifiers/v1/configs/retries.py,sha256=-nPlgmz7J_NZ4GOYG6oCc3thXo4La2SufBmvQGvvPGo,821
52
52
  verifiers/v1/configs/runtime.py,sha256=IBX3FxiJ2RJaiX2aKghQ15clFHvJpPUXy8GWQOpNhYM,2967
53
53
  verifiers/v1/configs/serve.py,sha256=oa_0BrAVEKboU344w0hYkSaXj8lf26t0H87gvncAo0Q,2716
@@ -145,7 +145,7 @@ verifiers/v1/runtimes/base.py,sha256=IKmrJSJltWX9M1nPUZExKluPJM4N82VsnqQGFz0ECV8
145
145
  verifiers/v1/runtimes/container.py,sha256=puQD8X9acP6GefoCNEnq40POi-nXPD-729bUjTVShfM,9554
146
146
  verifiers/v1/runtimes/limiters.py,sha256=C6cWDD4pwyFwUY4QFke3oiMXwydSNIfSbJSIglUC2kE,3062
147
147
  verifiers/v1/runtimes/modal.py,sha256=rFbxdDBi_VIiDA67XyZg-AOsc_XkV8aQWSKnTUAgCmU,17506
148
- verifiers/v1/runtimes/prime.py,sha256=VWzskEtMEwND6tKKhRtFM5m4Qzt001xCaI4zKqNon80,19490
148
+ verifiers/v1/runtimes/prime.py,sha256=eeYGu60f8PSGtL6g0nJslYzrQLHo6d64JP73N3q3xTw,16982
149
149
  verifiers/v1/runtimes/subprocess.py,sha256=QmpQ235_xrX6gowrr8557VgbydOXpLbfFq0KKGfJThk,8774
150
150
  verifiers/v1/runtimes/docker/__init__.py,sha256=2wceP-8V-w0dQBEeLtoJFfCZ135DxP2rcdcUBmSWiNU,18543
151
151
  verifiers/v1/runtimes/docker/egress.py,sha256=tGwSvHNgV3-uhjshg8sZ4fVRyq8Fg7DbJl_c-lacPi4,23876
@@ -158,7 +158,7 @@ verifiers/v1/serve/server.py,sha256=i6XrY_PMAapkrP54tYX8-K6iGmOmrR7BbQ-3Qhn3w4s,
158
158
  verifiers/v1/serve/types.py,sha256=Qw5IjiJhsZz4giSXUBi9dfInBnQZ5_xiUmgH2qp8jPI,1741
159
159
  verifiers/v1/tasksets/__init__.py,sha256=5hTKSPLXSZTgKBbeKQI7FEp06c0ZsaQfuwvrvVFLgb8,712
160
160
  verifiers/v1/tasksets/harbor/__init__.py,sha256=JxThzHFYEkuSfQbVf3pEnjordgdfe4MU-QOsSSbyovU,326
161
- verifiers/v1/tasksets/harbor/env.py,sha256=rZEh-1IaHpfsrwSOn7qTq7uV0K7cZZ28bHB7BEWQdnc,3622
161
+ verifiers/v1/tasksets/harbor/env.py,sha256=ATMkfwmrE_2jpOOffbjLQ91feG7TOtefBGlpwWbRq8c,3604
162
162
  verifiers/v1/tasksets/harbor/taskset.py,sha256=3xCxtVVwQSpaLfoV1SaUoNQlpIGaTmwW6PvPyYh3yv4,33780
163
163
  verifiers/v1/tasksets/harbor/toolset.py,sha256=_7HXu-uuvqzhmJ1EX6c3KWLg0g0eRrLjCq1kBsZhIwo,3159
164
164
  verifiers/v1/tasksets/lean/__init__.py,sha256=oyv-GbJQBvCyGwo7Ysxm2NjZW-aX4j1uDoHU0f-E7xQ,767
@@ -192,8 +192,8 @@ verifiers/v1/utils/prime.py,sha256=UTYRjp9cbjNb6CVmBHda-1wWZAIIfxNOmTyNuT7_wL4,9
192
192
  verifiers/v1/utils/retries.py,sha256=Y2ZgrAjn-qNkRKZP_RVNL_7EK0iaRcZeCa404lpGYi4,5417
193
193
  verifiers/v1/utils/score.py,sha256=493yJVMw8teCu9JxapxMFPFzI0hNUqdo0Y2nGW4kckk,6200
194
194
  verifiers/v1/utils/version.py,sha256=-obEo_-l9-D8FLef4hYxncOe-uJpxrM1g2Hig_37Sgs,1607
195
- verifiers-0.3.2.dev108.dist-info/METADATA,sha256=lxM8jg5DbJZ3pMRirz1J-1ZscpIH56NZksQHizJXj5Q,4238
196
- verifiers-0.3.2.dev108.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
197
- verifiers-0.3.2.dev108.dist-info/entry_points.txt,sha256=iugElcdWPKbQM7uFF0lZ8iUpHsNr17-BwEAAjJWxV3U,259
198
- verifiers-0.3.2.dev108.dist-info/licenses/LICENSE,sha256=v0RrUsdV3IDoZhrRce297IXS3xMHNJ-_LdLpFAUWb9k,1072
199
- verifiers-0.3.2.dev108.dist-info/RECORD,,
195
+ verifiers-0.3.2.dev110.dist-info/METADATA,sha256=eD_fDZYzrtDbGvuxcBoZmYyr56UosFpv5gqh7q-F97o,4237
196
+ verifiers-0.3.2.dev110.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
197
+ verifiers-0.3.2.dev110.dist-info/entry_points.txt,sha256=iugElcdWPKbQM7uFF0lZ8iUpHsNr17-BwEAAjJWxV3U,259
198
+ verifiers-0.3.2.dev110.dist-info/licenses/LICENSE,sha256=v0RrUsdV3IDoZhrRce297IXS3xMHNJ-_LdLpFAUWb9k,1072
199
+ verifiers-0.3.2.dev110.dist-info/RECORD,,