verifiers 0.2.2.dev58__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.
@@ -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()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: verifiers
3
- Version: 0.2.2.dev58
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
@@ -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.dev58.dist-info/METADATA,sha256=dIolspvil7G19vdj_DgeI_K_JX0sxuOxXcBT1DG6-_Q,4545
337
- verifiers-0.2.2.dev58.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
338
- verifiers-0.2.2.dev58.dist-info/entry_points.txt,sha256=dF82JUYEFslR1AOW8LZfuBWeZeQoyX4wCRrduklg8-I,551
339
- verifiers-0.2.2.dev58.dist-info/licenses/LICENSE,sha256=v0RrUsdV3IDoZhrRce297IXS3xMHNJ-_LdLpFAUWb9k,1072
340
- verifiers-0.2.2.dev58.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,,