verifiers 0.2.2.dev67__py3-none-any.whl → 0.2.2.dev69__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.
@@ -35,7 +35,7 @@ class AgentConfig(BaseConfig):
35
35
  client: ClientConfig | None = None
36
36
  """Endpoint override (None = the run's client)."""
37
37
  sampling: SamplingConfig | None = None
38
- """Sampling override (None = the run's sampling)."""
38
+ """Sampling values merged onto the run's sampling."""
39
39
 
40
40
  max_turns: int | None = None
41
41
  """Max model turns per run (None = no limit)."""
verifiers/v1/env.py CHANGED
@@ -32,7 +32,7 @@ from verifiers.v1.mcp import SharedToolServer, serve_shared
32
32
  from verifiers.v1.runtimes import SubprocessConfig, runtime_is_local
33
33
  from verifiers.v1.task import Task
34
34
  from verifiers.v1.trace import Error, Trace
35
- from verifiers.v1.utils.generic import concrete_type
35
+ from verifiers.v1.utils.generic import concrete_type, deep_merge
36
36
  from verifiers.v1.utils.memory import trim_memory_periodically
37
37
  from verifiers.v1.utils.retries import run_episode_with_retry
38
38
 
@@ -204,15 +204,21 @@ class Env(ABC, Generic[ConfigT]):
204
204
 
205
205
  def make(name: str, spec: AgentConfig) -> Agent:
206
206
  # Unpinned fields fall back to the run's ctx / the taskset's harness.
207
+ sampling = ctx.sampling
208
+ if spec.sampling is not None:
209
+ sampling = sampling.model_copy(
210
+ update=deep_merge(
211
+ sampling.model_dump(exclude_unset=True),
212
+ spec.sampling.model_dump(exclude_unset=True),
213
+ )
214
+ )
207
215
  resolved = spec.model_copy(
208
216
  update={
209
217
  "harness": spec.harness
210
218
  if spec.harness is not None
211
219
  else self._default_harness,
212
220
  "model": spec.model if spec.model is not None else ctx.model,
213
- "sampling": spec.sampling
214
- if spec.sampling is not None
215
- else ctx.sampling,
221
+ "sampling": sampling,
216
222
  }
217
223
  )
218
224
  return _EpisodeAgent(
@@ -143,7 +143,7 @@ class JudgeTask(vf.Task):
143
143
  self,
144
144
  data: vf.TaskData,
145
145
  files: dict[str, bytes],
146
- artifacts: dict[str, bytes],
146
+ artifacts: dict[str, bytes | None],
147
147
  ) -> None:
148
148
  super().__init__(data)
149
149
  self.files = files
verifiers/v1/state.py CHANGED
@@ -9,7 +9,7 @@ from verifiers.v1.utils.generic import concrete_type
9
9
  class State(BaseModel):
10
10
  model_config = ConfigDict(ser_json_inf_nan="constants")
11
11
 
12
- artifacts: dict[str, bytes] = Field(default_factory=dict)
12
+ artifacts: dict[str, bytes | None] = Field(default_factory=dict)
13
13
 
14
14
 
15
15
  StateT = TypeVar("StateT", bound=State, default=State)
@@ -396,7 +396,11 @@ def parse_verifier_extras(
396
396
  # no such directory (the trace is the record) and Harbor never lets destination
397
397
  # affect verifier-side placement, so it cannot change any grading outcome.
398
398
  artifacts.append(
399
- Artifact(source=entry.source, exclude=list(entry.exclude or []))
399
+ Artifact(
400
+ source=entry.source,
401
+ exclude=list(entry.exclude or []),
402
+ required=False,
403
+ )
400
404
  )
401
405
 
402
406
  hooks: list[CollectHook] = []
@@ -29,11 +29,12 @@ class Artifact(BaseModel):
29
29
  source: str
30
30
  exclude: list[str] = Field(default_factory=list)
31
31
  """`tar --exclude` patterns, applied when `source` is a directory."""
32
+ required: bool = True
32
33
 
33
34
 
34
35
  async def collect(
35
36
  runtime: Runtime, artifacts: list[Artifact] | None = None
36
- ) -> dict[str, bytes]:
37
+ ) -> dict[str, bytes | None]:
37
38
  """Tar the convention dir and every declared path out of `runtime`.
38
39
 
39
40
  Keyed by source path; the values are tar archives. Insertion order is the order
@@ -54,20 +55,42 @@ async def collect(
54
55
  for a in artifacts or []
55
56
  ]
56
57
  convention = PurePosixPath(ARTIFACTS_DIR)
57
- sweep = not any(
58
- (p := PurePosixPath(a.source)) == convention
59
- or p.is_relative_to(convention)
60
- or convention.is_relative_to(p)
61
- for a in declared
62
- )
63
- entries = ([Artifact(source=ARTIFACTS_DIR)] if sweep else []) + declared
64
-
65
- collected: dict[str, bytes] = {}
58
+ declared_paths = [PurePosixPath(artifact.source) for artifact in declared]
59
+ if convention in declared_paths:
60
+ entries = declared
61
+ else:
62
+ sweep_excludes = [
63
+ str(path).lstrip("/")
64
+ for path in declared_paths
65
+ if path.is_relative_to(convention)
66
+ ]
67
+ entries = [
68
+ Artifact(
69
+ source=ARTIFACTS_DIR,
70
+ exclude=sweep_excludes,
71
+ required=False,
72
+ )
73
+ ]
74
+ for artifact, path in zip(declared, declared_paths, strict=True):
75
+ if convention.is_relative_to(path):
76
+ artifact = artifact.model_copy(
77
+ update={
78
+ "exclude": [
79
+ *artifact.exclude,
80
+ str(convention).lstrip("/"),
81
+ ]
82
+ }
83
+ )
84
+ entries.append(artifact)
85
+
86
+ collected: dict[str, bytes | None] = {}
66
87
  budget = MAX_ARTIFACT_BYTES
67
88
  for artifact in entries:
68
89
  source = artifact.source
69
- if (await runtime.run(["test", "-e", source], {})).exit_code != 0:
70
- if sweep and source == ARTIFACTS_DIR:
90
+ exists = f"test -e {shlex.quote(source)} || test -L {shlex.quote(source)}"
91
+ if (await runtime.run(["sh", "-c", exists], {})).exit_code != 0:
92
+ if not artifact.required:
93
+ collected[source] = None
71
94
  continue
72
95
  raise RuntimeError(
73
96
  f"declared artifact {source!r} does not exist in the runtime"
@@ -80,7 +103,7 @@ async def collect(
80
103
  return collected
81
104
 
82
105
 
83
- async def restore(runtime: Runtime, collected: dict[str, bytes]) -> None:
106
+ async def restore(runtime: Runtime, collected: dict[str, bytes | None]) -> None:
84
107
  """Extract `collected` in `runtime` at the original absolute paths."""
85
108
  if not collected:
86
109
  return
@@ -97,6 +120,8 @@ async def restore(runtime: Runtime, collected: dict[str, bytes]) -> None:
97
120
  roots = " ".join(shlex.quote(root) for root in collected)
98
121
  await _run(runtime, f"rm -rf -- {roots}", "clear artifact roots")
99
122
  for root, archive in collected.items():
123
+ if archive is None:
124
+ continue
100
125
  path = f"/tmp/vf-artifact-{uuid.uuid4().hex}.tar"
101
126
  await runtime.write(path, archive)
102
127
  await _run(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.2.2.dev67
3
+ Version: 0.2.2.dev69
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
@@ -169,7 +169,7 @@ verifiers/utils/usage_utils.py,sha256=Mw6WC78r6EsLyRFdP9ICveqptkjizbSkAC86ZH0geV
169
169
  verifiers/utils/version_utils.py,sha256=39gV8-mNF9GspAgKloLo8oy7_MVluMrwGPrntQv2hx4,2656
170
170
  verifiers/v1/__init__.py,sha256=kacTRsGsRHfOruv16ZyIOesfvCH_nW98ARKPYSgcNIc,7509
171
171
  verifiers/v1/agent.py,sha256=sBKS5KOJw6Y166X4yuwIvfYenk4GGfNbjyr-1ZVJivI,32083
172
- verifiers/v1/env.py,sha256=WBSn6YOVjoSjp-2dDM9RkQHPjvbh4hgXcRYNKeQfFIU,18401
172
+ verifiers/v1/env.py,sha256=QgAAKikzCKr2QfXAvRT_1Ss6mfdUn5QcST0oXqQhXUw,18661
173
173
  verifiers/v1/episode.py,sha256=YtuRTV_PpwDglXFeN6UNg8IswpP1HseFLCYtascGMNI,3218
174
174
  verifiers/v1/errors.py,sha256=kQeEPX06TwAIuiz7MlWFYirrpKbx5STi6A5b_dtQQoA,6885
175
175
  verifiers/v1/graph.py,sha256=aBAzh1Ibp3klKNYjvzNyJSbjV8Oi5TJ791dN7o6ex1E,29070
@@ -178,7 +178,7 @@ verifiers/v1/judge.py,sha256=Rp0WgkBrofmENOVx34LBuLh0vGhWwzTs9MmDnSmt3fA,9348
178
178
  verifiers/v1/legacy.py,sha256=8ea4uJUy4qrbvTvnvZ0587_2qVrlqdMZdmzhruiDIgM,22696
179
179
  verifiers/v1/rollout.py,sha256=yweZAjyJ-gExnfeCrD60CGFd5y88Ou51A1nRXnB1f1A,17485
180
180
  verifiers/v1/session.py,sha256=J6ZPuvsg6vMTJAs9dMUMtfdjCuvp6Hom877DVdKFKlY,6912
181
- verifiers/v1/state.py,sha256=PDOPcbfZQindhiB6EuyWsnlJZI2QJvY7jRWNT83w9pY,588
181
+ verifiers/v1/state.py,sha256=EckF2bWp-vV4b1jYJ9sLI5xrfGuI5spIgYYwW926toI,595
182
182
  verifiers/v1/task.py,sha256=D5PKxu6WlqCjv7hE311aaNvBA3QWVWDuPIEwDsq-J7g,9075
183
183
  verifiers/v1/taskset.py,sha256=fp2E0IEhL_Ybj9cegZwljfTmW27p_30zTWHFKw_kXE4,4374
184
184
  verifiers/v1/trace.py,sha256=_bGHOrE6fRLGm0JYc0PrrrO3lyr-qqOF5Y1bHfViwR0,19347
@@ -209,7 +209,7 @@ verifiers/v1/clients/config.py,sha256=QMR0PkpFLcLi_Zw6bVimigNjNiWeJ-4YvJ_JsSS9yG
209
209
  verifiers/v1/clients/eval.py,sha256=QMpohNnQjDuo56BhOgHnAfAlcnQAxFpEFCySoIuexNg,9571
210
210
  verifiers/v1/clients/train.py,sha256=6bw4TV_UskdjvDAxvHrgJWBqAq9r1DxzJGusGi7UoRM,13022
211
211
  verifiers/v1/configs/__init__.py,sha256=X7u6X7B3ieD1HZl79Tv1kg-yPHbT0QLvAebaGqxVtvA,317
212
- verifiers/v1/configs/agent.py,sha256=vKlP_PvLYl3SSY9OwXJ_FI_npMV2elFcqWENd0fLEdo,3260
212
+ verifiers/v1/configs/agent.py,sha256=V_2FDvPHRB3_bHN9QnNnDYOjlmTP7NtG22SaopU-X64,3261
213
213
  verifiers/v1/configs/env.py,sha256=7ESsWZRWJpKqR5EEV1rmj0R1Dkn2Pn8MVSXPJOzRiF8,7885
214
214
  verifiers/v1/configs/harness.py,sha256=CG8hGbHl3rr6yawH3YYMAFl01M7Piiwf4w5oiw2Vagg,1564
215
215
  verifiers/v1/configs/judge.py,sha256=O7oe28tS24fKRXUML_-6vHrVGdG6w7061SPQXOH7XvM,2223
@@ -233,7 +233,7 @@ verifiers/v1/dialects/chat.py,sha256=R_otqi5N0snB1QVKIYloNeLHR9kc7OmI06HYg1ir_Lw
233
233
  verifiers/v1/dialects/responses.py,sha256=ismnxUikPcPUIm80FUTPBbj-Cn1e0yGAsISMEseAWRc,13679
234
234
  verifiers/v1/envs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
235
235
  verifiers/v1/envs/agentic_judge/__init__.py,sha256=6vwtMCQ_cuvuubCF5-nrE5W7gGgzE-LIPKorkM5DXdw,309
236
- verifiers/v1/envs/agentic_judge/env.py,sha256=QRYxs8M5ivk7jnEwPgYfCLVZTBQOuSc64xydoBixXDs,16961
236
+ verifiers/v1/envs/agentic_judge/env.py,sha256=jreQPnbp8pJQSyZW0Me2IW-JipYsczqgohfM4-JCz9c,16968
237
237
  verifiers/v1/envs/best_of_n/__init__.py,sha256=mubASiwXMNIhnQFDccNAc7yZ0OFsOVK8hH8WIx9b2A4,119
238
238
  verifiers/v1/envs/best_of_n/env.py,sha256=KEUJBCVqblnXP_lEwm3mjGdaikBMkecz8UjOFPBhxc0,1987
239
239
  verifiers/v1/envs/single_agent/__init__.py,sha256=r0edAc_6gtHBhPzeBGVcdHZZqSdCPZnLMje6eVgyz5U,138
@@ -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=9u6ZrzjEFSd3ObEs145SdrorUUu2_6SblCmGHOVgRXM,18247
314
+ verifiers/v1/tasksets/harbor/taskset.py,sha256=7cUb7um8FUL2vHhvdSVBN04IwFMzYDjdaAEuMqiPftM,18326
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
@@ -321,7 +321,7 @@ verifiers/v1/tasksets/textarena/__init__.py,sha256=Os2OlBY_pSH0B1DP32RitumgSLpq2
321
321
  verifiers/v1/tasksets/textarena/taskset.py,sha256=9fa_unlFiFZyuN4I02rW3x4qyRnFWXqwTUZTloQefu0,4433
322
322
  verifiers/v1/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
323
323
  verifiers/v1/utils/aio.py,sha256=0yNFOqB2oO6Qktc6NI_ZSAGuo1aHsIK_wuT1BtmoZ3I,1532
324
- verifiers/v1/utils/artifacts.py,sha256=5eKOjDSUWwj7GrhxILMHdz2ngEONWMdcTGlBcuGgrLU,5834
324
+ verifiers/v1/utils/artifacts.py,sha256=vOzbPSuMirUecyylrhvLZ_vAcTd6JTJBztGPDQ0ANNk,6706
325
325
  verifiers/v1/utils/compile.py,sha256=Oh4hDVRNsql_BSOMh4kDEuze9_ZF17Q7uzBhhU70UZA,5663
326
326
  verifiers/v1/utils/decorators.py,sha256=9CcCwgZlRjVGPqT5G1CFJUHP4OIMuBGkUJZkcI6dnbk,3865
327
327
  verifiers/v1/utils/format.py,sha256=NfQo9M5KMzWCZpQaet5YtsJx56vCKAZPfbjZZJLJhhM,2187
@@ -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.dev67.dist-info/METADATA,sha256=OrElOBHBO8bvqImdft8Vl8c8STdTs7ZtlqxLcLLaafY,4545
341
- verifiers-0.2.2.dev67.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
342
- verifiers-0.2.2.dev67.dist-info/entry_points.txt,sha256=dF82JUYEFslR1AOW8LZfuBWeZeQoyX4wCRrduklg8-I,551
343
- verifiers-0.2.2.dev67.dist-info/licenses/LICENSE,sha256=v0RrUsdV3IDoZhrRce297IXS3xMHNJ-_LdLpFAUWb9k,1072
344
- verifiers-0.2.2.dev67.dist-info/RECORD,,
340
+ verifiers-0.2.2.dev69.dist-info/METADATA,sha256=tD9ocVeDRxpRVMbBoJrIPykg5u9VbHU3vw3oMKkEUSk,4545
341
+ verifiers-0.2.2.dev69.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
342
+ verifiers-0.2.2.dev69.dist-info/entry_points.txt,sha256=dF82JUYEFslR1AOW8LZfuBWeZeQoyX4wCRrduklg8-I,551
343
+ verifiers-0.2.2.dev69.dist-info/licenses/LICENSE,sha256=v0RrUsdV3IDoZhrRce297IXS3xMHNJ-_LdLpFAUWb9k,1072
344
+ verifiers-0.2.2.dev69.dist-info/RECORD,,