verifiers 0.2.2.dev57__py3-none-any.whl → 0.2.2.dev59__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/env.py CHANGED
@@ -379,7 +379,7 @@ class Env(ABC, Generic[ConfigT]):
379
379
  def _requires_tunnel(self, shared: dict[str, SharedToolServer]) -> bool:
380
380
  """`requires_tunnel` over the consumers known before any rollout: role
381
381
  runtimes, live `shared` servers, and the task class's tool servers
382
- (their configs read off the declared `tools` fields, no task needed)."""
382
+ (`Task.toolsets` is a classmethod, so no task instance is needed)."""
383
383
  task_cls = type(self.taskset).task_type()
384
384
  configs = [
385
385
  server.config for server in task_cls.toolsets(self.taskset.config.task)
@@ -8,6 +8,10 @@ from verifiers.v1.harnesses.claude_code import (
8
8
  ClaudeCodeHarnessConfig,
9
9
  )
10
10
  from verifiers.v1.harnesses.codex import CodexHarness, CodexHarnessConfig
11
+ from verifiers.v1.harnesses.hermes_agent import (
12
+ HermesAgentHarness,
13
+ HermesAgentHarnessConfig,
14
+ )
11
15
  from verifiers.v1.harnesses.kimi_code import KimiCodeHarness, KimiCodeHarnessConfig
12
16
  from verifiers.v1.harnesses.mini_swe_agent import (
13
17
  MiniSWEAgentHarness,
@@ -28,6 +32,8 @@ __all__ = [
28
32
  "ClaudeCodeHarnessConfig",
29
33
  "CodexHarness",
30
34
  "CodexHarnessConfig",
35
+ "HermesAgentHarness",
36
+ "HermesAgentHarnessConfig",
31
37
  "KimiCodeHarness",
32
38
  "KimiCodeHarnessConfig",
33
39
  "MiniSWEAgentHarness",
@@ -0,0 +1,6 @@
1
+ from verifiers.v1.harnesses.hermes_agent.harness import (
2
+ HermesAgentHarness,
3
+ HermesAgentHarnessConfig,
4
+ )
5
+
6
+ __all__ = ["HermesAgentHarness", "HermesAgentHarnessConfig"]
@@ -0,0 +1,140 @@
1
+ """Run Hermes Agent against interception through its native ACP server."""
2
+
3
+ import json
4
+ import logging
5
+ from pathlib import Path
6
+
7
+ from pydantic import Field
8
+
9
+ from verifiers.v1.acp import ACP
10
+ from verifiers.v1.clients import ModelContext
11
+ from verifiers.v1.configs.harness import HarnessConfig
12
+ from verifiers.v1.harness import Harness
13
+ from verifiers.v1.runtimes import ProgramResult, Runtime
14
+ from verifiers.v1.task import TaskData
15
+ from verifiers.v1.trace import Trace
16
+
17
+ PROGRAM_SOURCE = (Path(__file__).resolve().parent / "program.py").read_text()
18
+ SKILLS_DIR = ".vf-hermes-skills"
19
+ HERMES_ACP = ACP()
20
+ PROVIDER = "intercept"
21
+ logger = logging.getLogger(__name__)
22
+
23
+
24
+ class HermesAgentHarnessConfig(HarnessConfig):
25
+ version: str = Field(default="0.19.0", pattern=r"^[A-Za-z0-9._+-]+$")
26
+ """Hermes Agent release to install, pinned for reproducibility."""
27
+ use_bundled_skill: bool = False
28
+ """Enable Hermes Agent's bundled skill catalog in addition to uploaded skills."""
29
+
30
+
31
+ class HermesAgentHarness(Harness[HermesAgentHarnessConfig]):
32
+ APPENDS_SYSTEM_PROMPT = True
33
+ SUPPORTS_MCP = True
34
+ SUPPORTS_RESUME = True
35
+ SUPPORTS_SKILLS = True
36
+
37
+ async def setup(self, runtime: Runtime) -> None:
38
+ await self.install_skills(runtime, SKILLS_DIR)
39
+ logger.info(
40
+ "hermes-agent: ensuring Hermes Agent %s is installed", self.config.version
41
+ )
42
+ source = PROGRAM_SOURCE.replace("{version}", self.config.version)
43
+ await runtime.prepare_uv_script(source, self.config.resolved_env)
44
+ await HERMES_ACP.setup(self, runtime)
45
+
46
+ async def launch(
47
+ self,
48
+ ctx: ModelContext,
49
+ trace: Trace,
50
+ runtime: Runtime,
51
+ endpoint: str,
52
+ secret: str,
53
+ mcp_urls: dict[str, str],
54
+ data: TaskData,
55
+ ) -> ProgramResult:
56
+ if self.config.disabled_tools:
57
+ raise ValueError("Hermes Agent ACP does not support disabling tools")
58
+
59
+ system_prompt, prompt = self.resolve_prompt(data)
60
+ home = self._home(trace)
61
+ model: dict[str, object] = {
62
+ "provider": PROVIDER,
63
+ "default": ctx.model,
64
+ "base_url": endpoint,
65
+ "api_mode": "chat_completions",
66
+ }
67
+ if ctx.sampling.max_tokens is not None:
68
+ model["max_tokens"] = ctx.sampling.max_tokens
69
+ await runtime.write(
70
+ f"{home}/config.yaml",
71
+ json.dumps(
72
+ {
73
+ "model": model,
74
+ # The ACP client already approves tool requests. Avoid routing Hermes'
75
+ # redundant smart-approval model calls through interception as turns.
76
+ "approvals": {"mode": "off"},
77
+ "providers": {
78
+ PROVIDER: {
79
+ "api": endpoint,
80
+ "api_key": secret,
81
+ "transport": "chat_completions",
82
+ "discover_models": False,
83
+ "models": [ctx.model],
84
+ }
85
+ },
86
+ }
87
+ ).encode(),
88
+ )
89
+ if not self.config.use_bundled_skill:
90
+ await runtime.write(
91
+ f"{home}/.no-bundled-skills",
92
+ b"Verifiers supplies evaluation skills explicitly.\n",
93
+ )
94
+
95
+ if self.config.skills:
96
+ skill_home = f"{home}/skills"
97
+ for command in (
98
+ ["rm", "-rf", skill_home],
99
+ ["cp", "-R", SKILLS_DIR, skill_home],
100
+ ):
101
+ copied = await runtime.run(command, {})
102
+ if copied.exit_code != 0:
103
+ raise RuntimeError(
104
+ f"failed to stage Hermes skills: {copied.stderr.strip()[-500:]}"
105
+ )
106
+
107
+ env = {
108
+ **self.config.resolved_env,
109
+ "HERMES_HOME": home,
110
+ "HERMES_ACP_SKIP_CONFIGURED_MCP": "1",
111
+ }
112
+ source = PROGRAM_SOURCE.replace("{version}", self.config.version)
113
+ command = await runtime.prepare_uv_script(source, env)
114
+ calls_before = len(trace.calls)
115
+ result = await HERMES_ACP.run(
116
+ runtime,
117
+ env,
118
+ command,
119
+ prompt,
120
+ mcp_urls=mcp_urls,
121
+ system_prompt=system_prompt,
122
+ session_path=f"{home}/acp-session",
123
+ )
124
+ if not any(call.node is not None for call in trace.calls[calls_before:]):
125
+ detail = (result.stderr or result.stdout).strip()[-500:] or "<no output>"
126
+ raise RuntimeError(
127
+ "Hermes Agent completed without committing a model turn: " + detail
128
+ )
129
+ return result
130
+
131
+ async def cleanup(self, trace: Trace, runtime: Runtime) -> None:
132
+ result = await runtime.run(["rm", "-rf", self._home(trace)], {})
133
+ if result.exit_code != 0:
134
+ raise RuntimeError(
135
+ f"failed to clean up Hermes home: {result.stderr.strip()[-500:]}"
136
+ )
137
+
138
+ @staticmethod
139
+ def _home(trace: Trace) -> str:
140
+ return f"/tmp/vf-hermes/{trace.id}"
@@ -0,0 +1,10 @@
1
+ # /// script
2
+ # requires-python = ">=3.11,<3.14"
3
+ # dependencies = ["hermes-agent[acp,mcp]=={version}"]
4
+ # ///
5
+ """Start Hermes Agent's native ACP server."""
6
+
7
+ from acp_adapter.entry import main
8
+
9
+ if __name__ == "__main__":
10
+ main()
verifiers/v1/task.py CHANGED
@@ -3,8 +3,8 @@
3
3
  `TaskData` is the wire half: a frozen pydantic model carrying the data which
4
4
  initializes a task instance. Rides on `trace.task.data` in `traces.jsonl`.
5
5
 
6
- `Task` is the behavior half: runtime prep (`setup`/`finalize`), tool declarations
7
- (`tools`), and scoring (`@reward`/`@metric`) methods.
6
+ `Task` is the behavior half: runtime prep (`setup`/`finalize`), tool servers
7
+ (`toolsets`), and scoring (`@reward`/`@metric`) methods.
8
8
  """
9
9
 
10
10
  from __future__ import annotations
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.2.2.dev57
3
+ Version: 0.2.2.dev59
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
@@ -171,7 +171,7 @@ verifiers/v1/__init__.py,sha256=Im5qTZy9mH6PRTUi-1V6W7EWKZzJyTWLGKMYALbWz_w,7467
171
171
  verifiers/v1/agent.py,sha256=t5Z_iI6Zyt0ieMDI7pfHUVYIKViuSXF-CI_rIApx3f4,32071
172
172
  verifiers/v1/artifacts.py,sha256=5eKOjDSUWwj7GrhxILMHdz2ngEONWMdcTGlBcuGgrLU,5834
173
173
  verifiers/v1/decorators.py,sha256=9CcCwgZlRjVGPqT5G1CFJUHP4OIMuBGkUJZkcI6dnbk,3865
174
- verifiers/v1/env.py,sha256=wJp9i49_LKVzMFXkwtt_SaRMUJ84i5r1t3QfNvnt4Ks,18178
174
+ verifiers/v1/env.py,sha256=TGCq_rPp_VdyGAKpHuscSDyIxIGnim2N-dpKkG-J5p0,18175
175
175
  verifiers/v1/episode.py,sha256=YtuRTV_PpwDglXFeN6UNg8IswpP1HseFLCYtascGMNI,3218
176
176
  verifiers/v1/errors.py,sha256=slZnrtqMo_BgXQV46wJJhV6vvAAnVsuCbVGp2vBVWfs,6888
177
177
  verifiers/v1/graph.py,sha256=aBAzh1Ibp3klKNYjvzNyJSbjV8Oi5TJ791dN7o6ex1E,29070
@@ -185,7 +185,7 @@ verifiers/v1/rollout.py,sha256=ehPoN6EnrIg_lvF1-pdf9pS8j47K3z6jDHc66MixzX0,20470
185
185
  verifiers/v1/scoring.py,sha256=-R5Cog14r_tJ6Q_oOfGr5VPAm2CCUhofYZB6B9lm4wM,5787
186
186
  verifiers/v1/session.py,sha256=J6ZPuvsg6vMTJAs9dMUMtfdjCuvp6Hom877DVdKFKlY,6912
187
187
  verifiers/v1/state.py,sha256=pcpN2V6tX7rIO5XdtdUYay1j0ktEwrMtq7w1ApfsPdE,675
188
- verifiers/v1/task.py,sha256=skqOc-j2AxA6Wz2ikDD03o3cu1cVvr1G6gRJZrpOgfY,9059
188
+ verifiers/v1/task.py,sha256=osuZNjGeNj5NC9TYxxzRQUPnt8D5aNw1OuS45eVWugI,9057
189
189
  verifiers/v1/taskset.py,sha256=s9T7v3REU1EKVCu2zORMA3gWinRK6LJk4GUvoKhAmEQ,4337
190
190
  verifiers/v1/trace.py,sha256=_bGHOrE6fRLGm0JYc0PrrrO3lyr-qqOF5Y1bHfViwR0,19347
191
191
  verifiers/v1/types.py,sha256=1PxamJspmoTc3OlFZAwH6o_2i_Tg9ZNvHxttIHWIxq8,8948
@@ -252,7 +252,7 @@ verifiers/v1/gepa/config.py,sha256=gFn8Re4GoeHJs2PZ-iw4jCEZ72AiM1lNgwaA0uvJlYw,4
252
252
  verifiers/v1/gepa/dataset.py,sha256=N2QYqUljHVuAdCbUuydEIlarvAWa6LFdGKu9qsOvjro,2186
253
253
  verifiers/v1/gepa/reflection.py,sha256=ptHhx0lcDLcWhWhXuslh9T8gPVNpnX5XLPtXoneW1yA,1054
254
254
  verifiers/v1/gepa/runner.py,sha256=-LZEt0lod6NKfyxg2dvOXZjfzTv3AWwendexd1De26c,6260
255
- verifiers/v1/harnesses/__init__.py,sha256=706ES37vrh_kCbctnbgkXIb1jBtO2ozZY5klBSg8ss0,1460
255
+ verifiers/v1/harnesses/__init__.py,sha256=CDKLCWYqRbVy3NvEzavC12_DaxuoHQfw9AQ8hmlQuBQ,1624
256
256
  verifiers/v1/harnesses/bash/__init__.py,sha256=IAV4eMMqDHSl-9ANb0Q3kxmBZ22SeHZFBM448X4gQio,140
257
257
  verifiers/v1/harnesses/bash/harness.py,sha256=ZtjhsANuK3vXkf9mRCi8-sBMyPebJMBNHa58vTd2Fm8,5284
258
258
  verifiers/v1/harnesses/bash/program.py,sha256=hGv3k9jwoabL045AGiZWiX76Cca3Juk58AaMYeJTEGo,15334
@@ -263,6 +263,9 @@ verifiers/v1/harnesses/claude_code/__init__.py,sha256=JkZQylMSA3o1fvBx_NM41y_umu
263
263
  verifiers/v1/harnesses/claude_code/harness.py,sha256=98k5T8d8nFQmxIU-ytkrkrrP6UNR5NxoGhVJRLVa-fI,4015
264
264
  verifiers/v1/harnesses/codex/__init__.py,sha256=ocyBvlpSO8c3pT6D1ebrQohoXYESQcCyPT5kN3j1-N4,132
265
265
  verifiers/v1/harnesses/codex/harness.py,sha256=OG1riQdVmZzVpHENsd0UzsIbdIAxDMHgRikmo73HL5M,13071
266
+ verifiers/v1/harnesses/hermes_agent/__init__.py,sha256=k84Y8UTTf1KOw5LGqPb2dk-hYFagPevDJBOF7qsR_vo,176
267
+ verifiers/v1/harnesses/hermes_agent/harness.py,sha256=AveZi9g4pga9pYy4VAmn_KMKlJw3KhwG45JZcPxbdR4,5094
268
+ verifiers/v1/harnesses/hermes_agent/program.py,sha256=9qPLbUnhox2bGu5ypEEnBhw9QKtYwNvrbl7W_zeNMdk,229
266
269
  verifiers/v1/harnesses/kimi_code/__init__.py,sha256=1BEotSfuzmVcE7UrxHeAREM5d7J20cGkonHuowlrzu4,161
267
270
  verifiers/v1/harnesses/kimi_code/harness.py,sha256=Pc2uiBsia-uQFuXvaLMFdblE6TS-p0E2cvB6ofRrHK0,4515
268
271
  verifiers/v1/harnesses/mini_swe_agent/__init__.py,sha256=1OBu2Y-XqL72-dGhFdgB6sr5uX_peEEXT9vEjPy1ovU,182
@@ -333,8 +336,8 @@ verifiers/v1/utils/logging.py,sha256=OcMHA6NsYux3oIzjPuI95rDWmFBHNcHDjZeNIhXTX-Y
333
336
  verifiers/v1/utils/memory.py,sha256=ZkIvGk6uITAH5sKon65LifKPbvZr8mJ__PVc23FZpOQ,1835
334
337
  verifiers/v1/utils/sampling.py,sha256=52TJ5-Hmpvp4YSgKNR-LmAPVwm4RDcH-o2-BnbVTmYQ,965
335
338
  verifiers/v1/utils/version.py,sha256=-obEo_-l9-D8FLef4hYxncOe-uJpxrM1g2Hig_37Sgs,1607
336
- verifiers-0.2.2.dev57.dist-info/METADATA,sha256=4FbkVpDnb3GnGhrNC-YaPVwF8qfnOQgOMoHLmWkC57E,4545
337
- verifiers-0.2.2.dev57.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
338
- verifiers-0.2.2.dev57.dist-info/entry_points.txt,sha256=dF82JUYEFslR1AOW8LZfuBWeZeQoyX4wCRrduklg8-I,551
339
- verifiers-0.2.2.dev57.dist-info/licenses/LICENSE,sha256=v0RrUsdV3IDoZhrRce297IXS3xMHNJ-_LdLpFAUWb9k,1072
340
- verifiers-0.2.2.dev57.dist-info/RECORD,,
339
+ verifiers-0.2.2.dev59.dist-info/METADATA,sha256=_zlzZC6PmnCHuYIWYn0fKecFkRUb2_ts5uzFM3yM_iQ,4545
340
+ verifiers-0.2.2.dev59.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
341
+ verifiers-0.2.2.dev59.dist-info/entry_points.txt,sha256=dF82JUYEFslR1AOW8LZfuBWeZeQoyX4wCRrduklg8-I,551
342
+ verifiers-0.2.2.dev59.dist-info/licenses/LICENSE,sha256=v0RrUsdV3IDoZhrRce297IXS3xMHNJ-_LdLpFAUWb9k,1072
343
+ verifiers-0.2.2.dev59.dist-info/RECORD,,