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.
- verifiers/v1/harnesses/__init__.py +6 -0
- verifiers/v1/harnesses/hermes_agent/__init__.py +6 -0
- verifiers/v1/harnesses/hermes_agent/harness.py +140 -0
- verifiers/v1/harnesses/hermes_agent/program.py +10 -0
- {verifiers-0.2.2.dev58.dist-info → verifiers-0.2.2.dev59.dist-info}/METADATA +1 -1
- {verifiers-0.2.2.dev58.dist-info → verifiers-0.2.2.dev59.dist-info}/RECORD +9 -6
- {verifiers-0.2.2.dev58.dist-info → verifiers-0.2.2.dev59.dist-info}/WHEEL +0 -0
- {verifiers-0.2.2.dev58.dist-info → verifiers-0.2.2.dev59.dist-info}/entry_points.txt +0 -0
- {verifiers-0.2.2.dev58.dist-info → verifiers-0.2.2.dev59.dist-info}/licenses/LICENSE +0 -0
|
@@ -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,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}"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: verifiers
|
|
3
|
-
Version: 0.2.2.
|
|
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=
|
|
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.
|
|
337
|
-
verifiers-0.2.2.
|
|
338
|
-
verifiers-0.2.2.
|
|
339
|
-
verifiers-0.2.2.
|
|
340
|
-
verifiers-0.2.2.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|