Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
985b912
feat(inference): add transparent rate-limit and transient error retry…
kweinmeister Sep 13, 2026
5195361
Merge branch 'main' into fix/llm-judge-rate-limit-retry
kweinmeister Sep 19, 2026
5149651
feat(tier3): enforce structured JSON schemas in LLM judges with 400/4…
kweinmeister Sep 19, 2026
cb61058
refactor(tier3): pass explicit response_schema in judges and deduplic…
kweinmeister Sep 19, 2026
2679cb6
refactor(inference): remove redundant LLM_JUDGE_* retry env aliases
kweinmeister Sep 19, 2026
c841013
Merge branch 'main' into fix/llm-judge-rate-limit-retry
kweinmeister Sep 20, 2026
b19c67b
Merge branch 'main' into fix/llm-judge-rate-limit-retry
rng1995 Sep 21, 2026
7280545
fix(inference): delegate retries to outer loop and cache only genuine…
kweinmeister Sep 24, 2026
4ffa7e0
Merge branch 'main' into fix/llm-judge-rate-limit-retry
kweinmeister Sep 24, 2026
0cf9aed
fix(tier3): bound judge retries and preserve schema integrity
chrisknvidia Sep 25, 2026
3bfb382
test(tier2): expect configured retries for transient chat errors
chrisknvidia Sep 25, 2026
248d129
Merge branch 'main' into fix/llm-judge-rate-limit-retry
rng1995 Sep 26, 2026
53e6991
Merge branch 'main' into fix/llm-judge-rate-limit-retry
rng1995 Sep 26, 2026
0ff61c7
Merge branch 'main' into fix/llm-judge-rate-limit-retry
kweinmeister Sep 27, 2026
18df7aa
fix(tier3): forward host LLM retry settings through Harbor runner
kweinmeister Sep 27, 2026
4871dbf
Merge branch 'main' into fix/llm-judge-rate-limit-retry
rng1995 Sep 29, 2026
c7efb5a
fix(tier3): resolve Harbor verifier env collisions and bounded Bedroc…
kweinmeister Sep 29, 2026
db308ca
Merge branch 'main' into fix/llm-judge-rate-limit-retry
kweinmeister Oct 1, 2026
c992b1f
Merge branch 'main' into fix/llm-judge-rate-limit-retry
kweinmeister Oct 1, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,23 @@ All notable changes to SkillEvaluator are documented in this file.

### Added

- Transparent HTTP 429 (rate-limiting), transient 5xx, and timeout recovery for
LLM judges in both the Harbor container verifier (`eval.py`) and host runtime
(`LLMClient`). Features zero-dependency full jitter exponential backoff,
RFC-7231 `Retry-After` header parsing, finite-value environment overrides
(`SKILL_EVAL_LLM_MAX_RETRIES`, `SKILL_EVAL_LLM_RETRY_BASE_DELAY`, and
`SKILL_EVAL_LLM_RETRY_MAX_DELAY`), and
automatic container forwarding via Harbor `task.toml`, and a per-judge
verifier time budget that leaves room for failure artifacts, without altering
benchmark metrics or scoring formulas.
- Provider-aware structured JSON schema enforcement (`response_format` for
OpenAI-compatible / Gemini Vertex / NVIDIA NIM endpoints and `output_config`
for Anthropic `/v1/messages`) across the custom `judge_accuracy`,
`judge_goal_accuracy`, and `judge_behavior_check` paths, with automatic
schema-specific `HTTP 400`/`422` downgrade and per-target memoization
(`_SCHEMA_UNSUPPORTED_TARGETS`), boolean prompt alignment, and a guard for
missing `message` fields on reasoning token exhaustion. The canonical OpenAI
RAGAS goal scorer retains its separate scoring path.
- Configurable evidence bundle budgets (`SKILL_EVAL_ACCURACY_BUDGET`, `SKILL_EVAL_GOAL_ACCURACY_BUDGET`, `SKILL_EVAL_BEHAVIOR_CHECK_BUDGET`) and final response limit (`SKILL_EVAL_BEHAVIOR_FINAL_RESPONSE_LIMIT`).

## 0.4.0 - 2026-09-30
Expand Down
10 changes: 10 additions & 0 deletions docs/environment-variables.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ These variables select and configure the provider used for LLM-backed checks and
| `SKILL_EVAL_LLM_MODEL` | OpenAI: `gpt-5.6-sol`; Anthropic: `claude-opus-5`; NVIDIA Build: `nvidia/nemotron-3-super-120b-a12b`; OpenAI-compatible: `nvidia/nvidia/nemotron-3-super-120b-long-ctx`; Bedrock: `us.anthropic.claude-opus-5` | Chat model override. For gateways, use the exact catalog ID when it differs from the default. Setting it to an empty string is a configuration error. For a lower-cost OpenAI option, use `gpt-5.4-mini`. |
| `SKILL_EVAL_LLM_BASE_URL` | provider default endpoint | Endpoint override; takes precedence over `OPENAI_BASE_URL` and `ANTHROPIC_BASE_URL`. Required for `openai-compatible`. Ignored by `nv_build`, whose endpoint is fixed to `https://integrate.api.nvidia.com/v1` — point a custom endpoint at the `openai-compatible` provider instead. |
| `SKILL_EVAL_LLM_API_KEY` | — | API key for the `openai-compatible` provider (local servers still require it to be set). |
| `SKILL_EVAL_LLM_MAX_RETRIES` | `3` | Extra attempts for transient LLM judge failures after the initial request. `0` disables retries; invalid or negative values use the default. |
| `SKILL_EVAL_LLM_RETRY_BASE_DELAY` | `1` second | Base for exponential jitter between direct LLM judge attempts. Values must be finite and nonnegative. |
| `SKILL_EVAL_LLM_RETRY_MAX_DELAY` | `30` seconds | Maximum sleep between direct LLM judge attempts. A `Retry-After` value above this limit fails fast; values must be finite and nonnegative. |
| `SKILL_EVAL_LLM_JUDGE_BUDGET_SEC` | `180` seconds | Wall-time budget per required LLM judge in the Harbor verifier. Values must be finite and positive; invalid or nonpositive values use the default. |
| `SKILL_EVAL_MODEL_CATALOG_ALLOW_HTTP_HOSTS` | unset | Comma-separated hosts whose model catalog may be read over plain HTTP. Catalog reads otherwise require HTTPS unless the host is loopback, because the request carries a bearer token. Use this only when the transport is already encrypted and authenticated below HTTP — a WireGuard or comparable tunnel peer, for example — where the tool cannot see that the link is protected. Each entry matches one whole host as written, with no resolution, no suffix matching, and no wildcards. A plain-HTTP request to an accepted host also bypasses any inherited HTTP proxy, so the bearer token is never offered to an intermediary. The transport rechecks authorization before dispatch and rejects hosts that are no longer allowed. HTTPS routing is unchanged. |
| `NVIDIA_API_KEY` | — | Credential for the `nv_build` provider (NVIDIA Build). |
| `OPENAI_API_KEY` | — | Credential for the `openai` provider. |
Expand All @@ -38,6 +42,12 @@ These variables select and configure the provider used for LLM-backed checks and
| `AWS_REGION` | `us-west-2` | Region for the `bedrock` provider. |
| `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_SESSION_TOKEN`, `AWS_PROFILE`, ... | — | Standard AWS credential chain, used as-is by the `bedrock` provider. |

The retry settings apply to the shared host LLM client and direct public-provider
calls in the Harbor verifier. The canonical OpenAI RAGAS goal scorer uses its
own adapter and scoring path. Harbor's managed verifier limits each required
judge to `SKILL_EVAL_LLM_JUDGE_BUDGET_SEC` (180 seconds by default) so retries
leave time to write a failed-run report.

### Anthropic endpoint roots

When `anthropic` is the selected evaluator provider, endpoint precedence is `SKILL_EVAL_LLM_BASE_URL`, then `ANTHROPIC_BASE_URL`, then the Anthropic default. A root such as `https://gateway.example.com` and a legacy terminal `/v1` root such as `https://gateway.example.com/team/v1` both produce request paths with exactly one `/v1/messages` suffix for the Anthropic SDK, the Tier 3 verifier, and a matching Claude Code agent. An independently credentialed Claude Code route applies the same normalization and validation to `ANTHROPIC_BASE_URL` when the evaluator uses another provider. Routing through path prefixes, ports, IP addresses, internationalized domain names, and ordinary safe percent escapes is preserved.
Expand Down
Loading
Loading