evalcore 2.4.2__tar.gz → 2.4.3__tar.gz
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.
- {evalcore-2.4.2 → evalcore-2.4.3}/CHANGELOG.md +30 -1
- {evalcore-2.4.2 → evalcore-2.4.3}/PKG-INFO +3 -3
- {evalcore-2.4.2 → evalcore-2.4.3}/README.md +1 -1
- {evalcore-2.4.2 → evalcore-2.4.3}/pyproject.toml +1 -1
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/graders/judge.py +3 -4
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/pairwise.py +2 -3
- {evalcore-2.4.2 → evalcore-2.4.3}/uv.lock +1 -1
- {evalcore-2.4.2 → evalcore-2.4.3}/.github/workflows/ci.yml +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/.github/workflows/publish.yml +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/.gitignore +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/.pre-commit-config.yaml +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/LICENSE +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/docs/design.md +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/examples/__init__.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/README.md +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/__init__.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/adapter.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/datasets/support_reply/v1/cases/angry_complaint.yaml +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/datasets/support_reply/v1/cases/billing_question.yaml +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/datasets/support_reply/v1/cases/double_charge.yaml +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/datasets/support_reply/v1/cases/refund_request.yaml +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/fixtures/support_reply_judge.yaml +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/fixtures/support_reply_pairwise.yaml +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/fixtures/support_reply_replay.yaml +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/graders.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/run_eval.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/suite.yaml +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/tests/__init__.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/tests/test_quickstart.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/justfile +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/pyrightconfig.json +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/__init__.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/adapters/__init__.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/adapters/base.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/adapters/env.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/adapters/http.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/adapters/replay.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/cli.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/compare.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/errors.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/graders/__init__.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/graders/base.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/graders/classification.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/graders/deterministic.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/graders/numeric.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/loader.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/models.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/py.typed +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/rating.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/refs.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/report.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/reporters/__init__.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/reporters/base.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/reporters/html.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/reporters/markdown.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/retry.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/runner.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/store.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/sweep.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/tests/__init__.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_adapters.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_cli.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_edge_cases.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_judge.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_judge_extra.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_live_clients.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_pairwise_extra.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_rating.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_rating_server.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_reporters.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_retry.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_runner.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_store.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_sweep_pairwise.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_unit.py +0 -0
- {evalcore-2.4.2 → evalcore-2.4.3}/uv.toml +0 -0
|
@@ -6,6 +6,34 @@ All notable changes to this project are documented here. The format is based on
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [2.4.3] - 2026-08-11
|
|
10
|
+
|
|
11
|
+
Live Anthropic judges work on current Claude models again.
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
- The Anthropic judge and pairwise clients no longer send `temperature=0`.
|
|
15
|
+
`temperature` (with `top_p`/`top_k`) was removed from the Claude request
|
|
16
|
+
surface at Opus 4.7, and sending it at all is a 400 there and on every model
|
|
17
|
+
after it - so a judge or a pairwise comparison pinned to `claude-opus-4-7`,
|
|
18
|
+
`claude-opus-4-8`, `claude-opus-5`, `claude-sonnet-5` or `claude-fable-5`
|
|
19
|
+
failed every call. The OpenAI clients still send it; that API still takes it.
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
- Live judge `max_tokens` defaults are now 8192 (from 1024 on the rubric
|
|
23
|
+
judge, 512 on pairwise). Thinking is on by default from Opus 5 and Sonnet 5
|
|
24
|
+
onward and `max_tokens` bounds thinking plus reply together, so a
|
|
25
|
+
1024-token budget could be spent on reasoning before the forced tool call
|
|
26
|
+
landed - which surfaced as error scores rather than as an error. It is a
|
|
27
|
+
ceiling, not a spend: a model that does not think generates the same handful
|
|
28
|
+
of tokens it did before.
|
|
29
|
+
|
|
30
|
+
**Upgrading:** a judge on a model that still accepts `temperature` (Sonnet
|
|
31
|
+
4.6, Opus 4.6, the 4.5 line and older) now samples at the API default instead
|
|
32
|
+
of 0, so its scores are no longer pinned run to run - expect more variance in
|
|
33
|
+
a rubric dimension or a win-rate than before, and re-baseline if a gate sits
|
|
34
|
+
close to its threshold. A judge on a thinking model also now bills thinking
|
|
35
|
+
tokens on every call. Pass `max_tokens=` to a client to keep the old budget.
|
|
36
|
+
|
|
9
37
|
## [2.4.2] - 2026-08-09
|
|
10
38
|
|
|
11
39
|
Every `llm_as_judge` row now describes what it measures.
|
|
@@ -312,7 +340,8 @@ by semantic versioning: a breaking change to either means a 2.0.
|
|
|
312
340
|
rating + ranking with judge agreement, Markdown/HTML reporters, JSON +
|
|
313
341
|
column-store outbox, and content-hash provenance.
|
|
314
342
|
|
|
315
|
-
[Unreleased]: https://github.com/scottpmiller/evalcore/compare/2.4.
|
|
343
|
+
[Unreleased]: https://github.com/scottpmiller/evalcore/compare/2.4.3...HEAD
|
|
344
|
+
[2.4.3]: https://github.com/scottpmiller/evalcore/compare/2.4.2...2.4.3
|
|
316
345
|
[2.4.2]: https://github.com/scottpmiller/evalcore/compare/2.4.1...2.4.2
|
|
317
346
|
[2.4.1]: https://github.com/scottpmiller/evalcore/compare/2.4.0...2.4.1
|
|
318
347
|
[2.4.0]: https://github.com/scottpmiller/evalcore/compare/2.3.0...2.4.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: evalcore
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.3
|
|
4
4
|
Summary: A generic, consumer-agnostic evaluation engine for prompt, model, and API outputs.
|
|
5
5
|
Project-URL: Homepage, https://github.com/scottpmiller/evalcore
|
|
6
6
|
Project-URL: Repository, https://github.com/scottpmiller/evalcore
|
|
@@ -327,7 +327,7 @@ degrade to `null`. `compare`'s guardrails and a `win_metric` with
|
|
|
327
327
|
`generation_cost` or `tool_error_rate` alongside quality judges.
|
|
328
328
|
|
|
329
329
|
The judge runs live (`AnthropicJudgeClient` forced tool call, or
|
|
330
|
-
`OpenAIJudgeClient` `json_schema`
|
|
330
|
+
`OpenAIJudgeClient` `json_schema` at temperature 0 - needing the `judge`
|
|
331
331
|
extra plus `ANTHROPIC_API_KEY`/`OPENAI_API_KEY`) or offline
|
|
332
332
|
(`ReplayJudgeClient`), chosen by the run mode like the adapter. Each
|
|
333
333
|
dimension becomes a metric `<name>.<key>` plus a `<name>.overall` mean.
|
|
@@ -295,7 +295,7 @@ degrade to `null`. `compare`'s guardrails and a `win_metric` with
|
|
|
295
295
|
`generation_cost` or `tool_error_rate` alongside quality judges.
|
|
296
296
|
|
|
297
297
|
The judge runs live (`AnthropicJudgeClient` forced tool call, or
|
|
298
|
-
`OpenAIJudgeClient` `json_schema`
|
|
298
|
+
`OpenAIJudgeClient` `json_schema` at temperature 0 - needing the `judge`
|
|
299
299
|
extra plus `ANTHROPIC_API_KEY`/`OPENAI_API_KEY`) or offline
|
|
300
300
|
(`ReplayJudgeClient`), chosen by the run mode like the adapter. Each
|
|
301
301
|
dimension becomes a metric `<name>.<key>` plus a `<name>.overall` mean.
|
|
@@ -104,7 +104,7 @@ class AnthropicJudgeClient:
|
|
|
104
104
|
self,
|
|
105
105
|
model: str,
|
|
106
106
|
api_key_env: str = 'ANTHROPIC_API_KEY',
|
|
107
|
-
max_tokens: int =
|
|
107
|
+
max_tokens: int = 8192,
|
|
108
108
|
timeout: float = 30.0,
|
|
109
109
|
):
|
|
110
110
|
self.model = model
|
|
@@ -156,7 +156,6 @@ class AnthropicJudgeClient:
|
|
|
156
156
|
response = await client.messages.create(
|
|
157
157
|
model=self.model,
|
|
158
158
|
max_tokens=self.max_tokens,
|
|
159
|
-
temperature=0,
|
|
160
159
|
timeout=self.timeout,
|
|
161
160
|
system=system,
|
|
162
161
|
tools=[tool],
|
|
@@ -179,7 +178,7 @@ class OpenAIJudgeClient:
|
|
|
179
178
|
self,
|
|
180
179
|
model: str,
|
|
181
180
|
api_key_env: str = 'OPENAI_API_KEY',
|
|
182
|
-
max_tokens: int =
|
|
181
|
+
max_tokens: int = 8192,
|
|
183
182
|
timeout: float = 30.0,
|
|
184
183
|
):
|
|
185
184
|
# Accept a 'provider:model' id (e.g. 'openai:gpt-4o'); SDK wants bare.
|
|
@@ -326,7 +325,7 @@ class RubricJudge:
|
|
|
326
325
|
judge_version: str = 'v1',
|
|
327
326
|
replay_path: str | None = None,
|
|
328
327
|
client: JudgeClient | None = None,
|
|
329
|
-
max_tokens: int =
|
|
328
|
+
max_tokens: int = 8192,
|
|
330
329
|
):
|
|
331
330
|
self.name = name
|
|
332
331
|
self.content_ref = content_ref
|
|
@@ -70,7 +70,7 @@ class AnthropicPairwiseClient:
|
|
|
70
70
|
self,
|
|
71
71
|
model: str,
|
|
72
72
|
api_key_env: str = 'ANTHROPIC_API_KEY',
|
|
73
|
-
max_tokens: int =
|
|
73
|
+
max_tokens: int = 8192,
|
|
74
74
|
timeout: float = 30.0,
|
|
75
75
|
):
|
|
76
76
|
self.model = model
|
|
@@ -88,7 +88,6 @@ class AnthropicPairwiseClient:
|
|
|
88
88
|
response = await client.messages.create(
|
|
89
89
|
model=self.model,
|
|
90
90
|
max_tokens=self.max_tokens,
|
|
91
|
-
temperature=0,
|
|
92
91
|
timeout=self.timeout,
|
|
93
92
|
system=system,
|
|
94
93
|
tools=[tool],
|
|
@@ -111,7 +110,7 @@ class OpenAIPairwiseClient:
|
|
|
111
110
|
self,
|
|
112
111
|
model: str,
|
|
113
112
|
api_key_env: str = 'OPENAI_API_KEY',
|
|
114
|
-
max_tokens: int =
|
|
113
|
+
max_tokens: int = 8192,
|
|
115
114
|
timeout: float = 30.0,
|
|
116
115
|
):
|
|
117
116
|
self.model = model.split(':', 1)[1] if ':' in model else model
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|