verifiers 0.3.2.dev190__py3-none-any.whl → 0.3.2.dev192__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.
@@ -5,7 +5,11 @@ import re
5
5
  import httpx
6
6
  from openai import AsyncOpenAI
7
7
 
8
- from verifiers.v1.configs.client import BaseClientConfig, resolve_api_key
8
+ from verifiers.v1.configs.client import (
9
+ BaseClientConfig,
10
+ resolve_api_key,
11
+ resolve_headers,
12
+ )
9
13
 
10
14
  DEFAULT_LIMITS = httpx.Limits(max_connections=1000, max_keepalive_connections=100)
11
15
  MAX_RETRIES = 0
@@ -27,7 +31,7 @@ def build_async_openai(config: BaseClientConfig) -> AsyncOpenAI:
27
31
  return AsyncOpenAI(
28
32
  base_url=config.base_url,
29
33
  api_key=resolve_api_key(config),
30
- default_headers=config.headers or None,
34
+ default_headers=resolve_headers(config) or None,
31
35
  max_retries=MAX_RETRIES,
32
36
  http_client=build_async_httpx(config),
33
37
  )
@@ -9,7 +9,11 @@ from pydantic_core import from_json, to_json
9
9
 
10
10
  from verifiers.v1.clients.base import build_async_httpx, join_url
11
11
  from verifiers.v1.clients.client import SESSION_ID_HEADER, Client, RelayReply
12
- from verifiers.v1.configs.client import BaseClientConfig, resolve_api_key
12
+ from verifiers.v1.configs.client import (
13
+ BaseClientConfig,
14
+ resolve_api_key,
15
+ resolve_headers,
16
+ )
13
17
  from verifiers.v1.dialects import Dialect
14
18
  from verifiers.v1.errors import model_error
15
19
  from verifiers.v1.graph import PendingTurn
@@ -67,7 +71,7 @@ class EvalClient(Client):
67
71
  self.api_key = resolve_api_key(config)
68
72
  # Keep endpoint headers separate so they can override intercepted request headers before
69
73
  # the dialect's provider authentication is applied.
70
- self.headers = dict(config.headers or {})
74
+ self.headers = resolve_headers(config)
71
75
  self.client = build_async_httpx(config)
72
76
 
73
77
  async def get_response(
@@ -11,6 +11,7 @@ build clients from these. `ClientConfig` is the CLI-selectable discriminated uni
11
11
  """
12
12
 
13
13
  import os
14
+ from itertools import chain
14
15
  from typing import Annotated, Literal
15
16
  from urllib.parse import urlparse
16
17
 
@@ -48,6 +49,9 @@ class BaseClientConfig(BaseConfig):
48
49
  api_key_var: str = "PRIME_API_KEY"
49
50
  headers: dict[str, str] = Field(default_factory=dict)
50
51
  """Extra HTTP headers sent on every request."""
52
+ headers_from_env: dict[str, str] = Field(default_factory=dict)
53
+ """Header names mapped to environment variables, resolved when building a client.
54
+ Set environment values override static headers."""
51
55
  timeout: ClientTimeoutConfig = ClientTimeoutConfig()
52
56
 
53
57
  @model_validator(mode="after")
@@ -65,14 +69,6 @@ class BaseClientConfig(BaseConfig):
65
69
  and self.base_url == DEFAULT_PRIME_INFERENCE_URL
66
70
  ):
67
71
  self.base_url = prime_base_url
68
- host = urlparse(self.base_url).hostname or ""
69
- if host != PRIME_INFERENCE_HOST and not host.endswith(
70
- f".{PRIME_INFERENCE_HOST}"
71
- ):
72
- return self
73
- team_id = os.environ.get("PRIME_TEAM_ID") or prime_config.get("team_id")
74
- if team_id:
75
- self.headers.setdefault(PRIME_TEAM_ID_HEADER, team_id)
76
72
  return self
77
73
 
78
74
 
@@ -121,3 +117,29 @@ def resolve_api_key(config: BaseClientConfig) -> str:
121
117
  ):
122
118
  api_key = load_prime_config().get("api_key")
123
119
  return api_key or "EMPTY"
120
+
121
+
122
+ def resolve_headers(config: BaseClientConfig) -> dict[str, str]:
123
+ """Resolve request headers for this destination without storing credentials in config."""
124
+ # Keep original spelling for SDKs that merge default headers case-sensitively.
125
+ names: dict[str, str] = {}
126
+ headers: dict[str, str] = {}
127
+ for name, value in chain(
128
+ config.headers.items(),
129
+ (
130
+ (name, value)
131
+ for name, variable in config.headers_from_env.items()
132
+ if (value := os.environ.get(variable)) is not None
133
+ ),
134
+ ):
135
+ headers[names.setdefault(name.lower(), name)] = value
136
+ host = urlparse(config.base_url).hostname or ""
137
+ if (
138
+ config.api_key_var == "PRIME_API_KEY"
139
+ and (host == PRIME_INFERENCE_HOST or host.endswith(f".{PRIME_INFERENCE_HOST}"))
140
+ and PRIME_TEAM_ID_HEADER.lower() not in names
141
+ ):
142
+ team_id = os.environ.get("PRIME_TEAM_ID") or load_prime_config().get("team_id")
143
+ if team_id:
144
+ headers[PRIME_TEAM_ID_HEADER] = team_id
145
+ return headers
@@ -20,6 +20,8 @@ def build_reflection_lm(config: GEPAConfig) -> Callable[[str], str]:
20
20
  base_url=client.base_url,
21
21
  api_key_var=client.api_key_var,
22
22
  headers=client.headers,
23
+ headers_from_env=client.headers_from_env,
24
+ timeout=client.timeout,
23
25
  )
24
26
  )
25
27
 
@@ -47,8 +47,9 @@ class BashHarnessConfig(HarnessConfig):
47
47
  eval environment; the key is handed to the program over argv (like the interception secret) so
48
48
  the agent's `bash` subprocesses don't inherit it."""
49
49
 
50
- compaction: CompactionConfig | None = None
51
- """Context compaction policy. Set an empty config to use automatic thresholds."""
50
+ compaction: CompactionConfig | None = CompactionConfig()
51
+ """Context compaction. Auto-compaction by default; set `summarize_at_tokens`
52
+ for a fixed threshold, and `null` (`"None"` in TOML) to disable it."""
52
53
 
53
54
 
54
55
  class BashHarness(Harness[BashHarnessConfig]):
@@ -45,6 +45,7 @@ from verifiers.v1.configs.client import (
45
45
  BaseClientConfig,
46
46
  TrainClientConfig,
47
47
  resolve_api_key,
48
+ resolve_headers,
48
49
  )
49
50
  from verifiers.v1.dialects import DIALECTS, Dialect
50
51
  from verifiers.v1.dialects.base import (
@@ -962,7 +963,7 @@ class InterceptionServer(Interception):
962
963
  session.adopt(asyncio.current_task())
963
964
  logger.debug("intercept models: id=%s", session.trace.id)
964
965
  config = session.ctx.client
965
- headers = dict(config.headers or {})
966
+ headers = httpx.Headers(resolve_headers(config))
966
967
  headers.update(dialect.auth_headers(resolve_api_key(config)))
967
968
  try:
968
969
  # Finite read timeout: a hung provider must not stall threshold discovery
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: verifiers
3
- Version: 0.3.2.dev190
3
+ Version: 0.3.2.dev192
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
@@ -37,13 +37,13 @@ verifiers/v1/cli/eval/main.py,sha256=46aHpha6yhFzbqUrRogC5wC2XAwdZcpp-4siqLpUExY
37
37
  verifiers/v1/cli/eval/resume.py,sha256=rnqkNIuuZ5zx8O-eEfALOJ1GEOUmSRnKHQrsU3dduU8,2187
38
38
  verifiers/v1/cli/eval/runner.py,sha256=utBDBgU7H_utJBDqQ4bOuG3aLFHTaCSb3OW602L5X8I,6468
39
39
  verifiers/v1/clients/__init__.py,sha256=Ysig0tE_0E4Jsfgfes1XHN-fK1s_RCXdqZD6E7lK4PU,507
40
- verifiers/v1/clients/base.py,sha256=iBqu2XXxVLPi3pociWEFfg7eEEctzGfwewg_JC5AO7A,1648
40
+ verifiers/v1/clients/base.py,sha256=C0G5lRm3nxt1xmPoA2cweBgCnN2KcLepmCYq1vdDrnU,1691
41
41
  verifiers/v1/clients/client.py,sha256=zqC_AkiD9pl0kxxIbupNiehbS-YnVdp3EMZ0LOHTd8U,3125
42
- verifiers/v1/clients/eval.py,sha256=x_5E8XnhFu4v-k4yI8WWHd39rDkvB7mSEPCVAWL4AiE,8268
42
+ verifiers/v1/clients/eval.py,sha256=qMm1W4H1JN2xa6e-aSUL19iQ_QHCB7MxEofUD7_MsEU,8299
43
43
  verifiers/v1/clients/train.py,sha256=lSJTwHjwOET3D_CI_eYZSoXSQcv2H0K5sYJ7kD_kdw4,19489
44
44
  verifiers/v1/configs/__init__.py,sha256=X7u6X7B3ieD1HZl79Tv1kg-yPHbT0QLvAebaGqxVtvA,317
45
45
  verifiers/v1/configs/agent.py,sha256=Vut73R2EW8QuL5c0iTnNFC_g-Obvl8YUKsjlvkABuL0,5311
46
- verifiers/v1/configs/client.py,sha256=i45QOop2Wb-LQRpNgUZGTCT1_HpNmdcG41eQrGMgJKQ,5297
46
+ verifiers/v1/configs/client.py,sha256=5OW_kAmFf2DkmzH2cerd4bINrIL2t68MKKcREUdrQyQ,6224
47
47
  verifiers/v1/configs/env.py,sha256=k47XBYYWLOf-8P1dbek3x_s0ucNb726xxoryG69DIr4,7256
48
48
  verifiers/v1/configs/harness.py,sha256=ZrR-Egzfft95oMoqQ78bAq9TqP882Q68M_47Ajw9lE8,2918
49
49
  verifiers/v1/configs/judge.py,sha256=3ZvxcTf-3clj8bDLyaqsMSKCRclTQCvbyb2qp3QSRD8,2166
@@ -81,12 +81,12 @@ verifiers/v1/gepa/__init__.py,sha256=6nmdRE0-34AKioPHBjTxUg5Jo_2z7tMX-OU3zMNpAJI
81
81
  verifiers/v1/gepa/adapter.py,sha256=YNvHMR2L5Utl-vtPfjZxmDCd2tTcoAPWG6aVGnV1icM,6139
82
82
  verifiers/v1/gepa/config.py,sha256=zRjrFkiyMWzD1LXvjuUV_rJtXVO5fWNiraVruHoIADA,4830
83
83
  verifiers/v1/gepa/dataset.py,sha256=cS4MtQVoBOnAHKs8REQm5lKGeqUpdXPU1hROU67aBG4,2130
84
- verifiers/v1/gepa/reflection.py,sha256=ptHhx0lcDLcWhWhXuslh9T8gPVNpnX5XLPtXoneW1yA,1054
84
+ verifiers/v1/gepa/reflection.py,sha256=V1VSXuszkw5Fikwqwe5KSwunhlibudZ7F8csUXraENk,1144
85
85
  verifiers/v1/gepa/runner.py,sha256=-pMy3u5sffEQ4-aDexQviHeQ9NXdNv5rBBnNmhyx_0U,5943
86
86
  verifiers/v1/harnesses/__init__.py,sha256=2JPwrRoYoigH-HfBtiFnatRdFEVHLv4rwlKfsFEibyE,1803
87
87
  verifiers/v1/harnesses/node.py,sha256=Cci-zCNiVRCtLkJuNOt9iKr7ZIb3ik_YugefXtRyt78,4349
88
88
  verifiers/v1/harnesses/bash/__init__.py,sha256=IAV4eMMqDHSl-9ANb0Q3kxmBZ22SeHZFBM448X4gQio,140
89
- verifiers/v1/harnesses/bash/harness.py,sha256=nsjLKFMGFSya4s9fMHiNVrO92RRCTS3VHqTK3rv3AFA,5233
89
+ verifiers/v1/harnesses/bash/harness.py,sha256=uah4-kRMMwqwHyA2qe-3shPdBn_Ksx4HPsBGVr3egUc,5317
90
90
  verifiers/v1/harnesses/browser_use/__init__.py,sha256=yxm2IG5TDLadxZEkX8SL26XWbcPcODXcrJfPfm1GqwU,171
91
91
  verifiers/v1/harnesses/browser_use/harness.py,sha256=sIPRxF-dxiB5xXddCCCOMP6BF1kO01Azyr9AR16x4aw,5582
92
92
  verifiers/v1/harnesses/browser_use/program.py,sha256=hhQSU1-F3BtkBkHcddl_K7HvsfnVHjU-FGtietZeamg,10052
@@ -126,7 +126,7 @@ verifiers/v1/harnesses/utils/mcp.py,sha256=EtDraHEqgsOB6xKvcF2z9C6HlQyKoST0ZDvmy
126
126
  verifiers/v1/interception/__init__.py,sha256=5Kvo7tcBUVaa65s9A1NiOH3CPpzw-P5btXwxB4Nbbvs,4251
127
127
  verifiers/v1/interception/base.py,sha256=Mg16Y104lyZilF9shdivdqYoqz4OYp978i_myyrulu8,2529
128
128
  verifiers/v1/interception/pool.py,sha256=sk_zcdTV8EVRuzqlYMXxon_42tSDAlFvwcyOO2EF7hw,6473
129
- verifiers/v1/interception/server.py,sha256=f8uLJ2rdZgD_EFIG2eKen3qIdPcCfo6MlwfTM4gCPcw,46362
129
+ verifiers/v1/interception/server.py,sha256=yeKMo3gVZl4G_iXpY2PWkwnwGBlfeb3uOhnc7jEtNeY,46395
130
130
  verifiers/v1/interception/tunnel/__init__.py,sha256=eVNZJszj6myrKhx9jmJz7VRd9qlfj0AUvUZwI2bXEj8,893
131
131
  verifiers/v1/interception/tunnel/base.py,sha256=DZB6uPLwM4Qy7n7m0vKeyg-Px87MhsmpYTpe2vpPEng,1998
132
132
  verifiers/v1/interception/tunnel/custom.py,sha256=yL4UbGf4bAuMsxk42mEP-t1wITQCT8BE9FHQIz0qRMA,1708
@@ -196,8 +196,8 @@ verifiers/v1/utils/scope.py,sha256=bzUEiWDOVdbj7dXOwGOlzsQ_-Xu0j9NR5TalQB-8TS8,8
196
196
  verifiers/v1/utils/score.py,sha256=493yJVMw8teCu9JxapxMFPFzI0hNUqdo0Y2nGW4kckk,6200
197
197
  verifiers/v1/utils/trace_store.py,sha256=RsCDonGR-bs-tvEstcppiJm3jFmAdIiG83fA5KtCbAw,2801
198
198
  verifiers/v1/utils/version.py,sha256=-obEo_-l9-D8FLef4hYxncOe-uJpxrM1g2Hig_37Sgs,1607
199
- verifiers-0.3.2.dev190.dist-info/METADATA,sha256=jwLpGVMLt-np-rpPQXiXmpyVDaz729jwrQQcO_YO7BA,4228
200
- verifiers-0.3.2.dev190.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
201
- verifiers-0.3.2.dev190.dist-info/entry_points.txt,sha256=iugElcdWPKbQM7uFF0lZ8iUpHsNr17-BwEAAjJWxV3U,259
202
- verifiers-0.3.2.dev190.dist-info/licenses/LICENSE,sha256=v0RrUsdV3IDoZhrRce297IXS3xMHNJ-_LdLpFAUWb9k,1072
203
- verifiers-0.3.2.dev190.dist-info/RECORD,,
199
+ verifiers-0.3.2.dev192.dist-info/METADATA,sha256=hTrgsWJUqM4CYmly0k9MiCmzEsXYqMHwOWxqo7Ox7xQ,4228
200
+ verifiers-0.3.2.dev192.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
201
+ verifiers-0.3.2.dev192.dist-info/entry_points.txt,sha256=iugElcdWPKbQM7uFF0lZ8iUpHsNr17-BwEAAjJWxV3U,259
202
+ verifiers-0.3.2.dev192.dist-info/licenses/LICENSE,sha256=v0RrUsdV3IDoZhrRce297IXS3xMHNJ-_LdLpFAUWb9k,1072
203
+ verifiers-0.3.2.dev192.dist-info/RECORD,,