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.
Files changed (76) hide show
  1. {evalcore-2.4.2 → evalcore-2.4.3}/CHANGELOG.md +30 -1
  2. {evalcore-2.4.2 → evalcore-2.4.3}/PKG-INFO +3 -3
  3. {evalcore-2.4.2 → evalcore-2.4.3}/README.md +1 -1
  4. {evalcore-2.4.2 → evalcore-2.4.3}/pyproject.toml +1 -1
  5. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/graders/judge.py +3 -4
  6. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/pairwise.py +2 -3
  7. {evalcore-2.4.2 → evalcore-2.4.3}/uv.lock +1 -1
  8. {evalcore-2.4.2 → evalcore-2.4.3}/.github/workflows/ci.yml +0 -0
  9. {evalcore-2.4.2 → evalcore-2.4.3}/.github/workflows/publish.yml +0 -0
  10. {evalcore-2.4.2 → evalcore-2.4.3}/.gitignore +0 -0
  11. {evalcore-2.4.2 → evalcore-2.4.3}/.pre-commit-config.yaml +0 -0
  12. {evalcore-2.4.2 → evalcore-2.4.3}/LICENSE +0 -0
  13. {evalcore-2.4.2 → evalcore-2.4.3}/docs/design.md +0 -0
  14. {evalcore-2.4.2 → evalcore-2.4.3}/examples/__init__.py +0 -0
  15. {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/README.md +0 -0
  16. {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/__init__.py +0 -0
  17. {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/adapter.py +0 -0
  18. {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/datasets/support_reply/v1/cases/angry_complaint.yaml +0 -0
  19. {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/datasets/support_reply/v1/cases/billing_question.yaml +0 -0
  20. {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/datasets/support_reply/v1/cases/double_charge.yaml +0 -0
  21. {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/datasets/support_reply/v1/cases/refund_request.yaml +0 -0
  22. {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/fixtures/support_reply_judge.yaml +0 -0
  23. {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/fixtures/support_reply_pairwise.yaml +0 -0
  24. {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/fixtures/support_reply_replay.yaml +0 -0
  25. {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/graders.py +0 -0
  26. {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/run_eval.py +0 -0
  27. {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/suite.yaml +0 -0
  28. {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/tests/__init__.py +0 -0
  29. {evalcore-2.4.2 → evalcore-2.4.3}/examples/quickstart/tests/test_quickstart.py +0 -0
  30. {evalcore-2.4.2 → evalcore-2.4.3}/justfile +0 -0
  31. {evalcore-2.4.2 → evalcore-2.4.3}/pyrightconfig.json +0 -0
  32. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/__init__.py +0 -0
  33. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/adapters/__init__.py +0 -0
  34. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/adapters/base.py +0 -0
  35. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/adapters/env.py +0 -0
  36. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/adapters/http.py +0 -0
  37. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/adapters/replay.py +0 -0
  38. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/cli.py +0 -0
  39. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/compare.py +0 -0
  40. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/errors.py +0 -0
  41. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/graders/__init__.py +0 -0
  42. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/graders/base.py +0 -0
  43. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/graders/classification.py +0 -0
  44. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/graders/deterministic.py +0 -0
  45. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/graders/numeric.py +0 -0
  46. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/loader.py +0 -0
  47. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/models.py +0 -0
  48. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/py.typed +0 -0
  49. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/rating.py +0 -0
  50. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/refs.py +0 -0
  51. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/report.py +0 -0
  52. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/reporters/__init__.py +0 -0
  53. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/reporters/base.py +0 -0
  54. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/reporters/html.py +0 -0
  55. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/reporters/markdown.py +0 -0
  56. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/retry.py +0 -0
  57. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/runner.py +0 -0
  58. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/store.py +0 -0
  59. {evalcore-2.4.2 → evalcore-2.4.3}/src/evalcore/sweep.py +0 -0
  60. {evalcore-2.4.2 → evalcore-2.4.3}/tests/__init__.py +0 -0
  61. {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_adapters.py +0 -0
  62. {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_cli.py +0 -0
  63. {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_edge_cases.py +0 -0
  64. {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_judge.py +0 -0
  65. {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_judge_extra.py +0 -0
  66. {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_live_clients.py +0 -0
  67. {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_pairwise_extra.py +0 -0
  68. {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_rating.py +0 -0
  69. {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_rating_server.py +0 -0
  70. {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_reporters.py +0 -0
  71. {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_retry.py +0 -0
  72. {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_runner.py +0 -0
  73. {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_store.py +0 -0
  74. {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_sweep_pairwise.py +0 -0
  75. {evalcore-2.4.2 → evalcore-2.4.3}/tests/test_unit.py +0 -0
  76. {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.2...HEAD
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.4
1
+ Metadata-Version: 2.5
2
2
  Name: evalcore
3
- Version: 2.4.2
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` - both temperature 0, needing the `judge`
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` - both temperature 0, needing the `judge`
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.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "evalcore"
3
- version = "2.4.2"
3
+ version = "2.4.3"
4
4
  description = "A generic, consumer-agnostic evaluation engine for prompt, model, and API outputs."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -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 = 1024,
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 = 1024,
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 = 1024,
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 = 512,
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 = 512,
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
@@ -188,7 +188,7 @@ wheels = [
188
188
 
189
189
  [[package]]
190
190
  name = "evalcore"
191
- version = "2.4.2"
191
+ version = "2.4.3"
192
192
  source = { editable = "." }
193
193
  dependencies = [
194
194
  { name = "pydantic" },
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