Skip to content

feat(studio): LLM-judge evaluators - #763

Merged
LinuxDevil merged 4 commits into
mainfrom
obs/o25-judge-evaluators
Oct 28, 2026
Merged

LinuxDevil merged 4 commits into
mainfrom
obs/o25-judge-evaluators

Conversation

@LinuxDevil

Copy link
Copy Markdown
Owner

LLM-judge online evaluators: the daemon queues judge jobs (bounded 500, leased) and the Agent Forge server pulls them, grades with its own provider keys and posts source:'online' scores back; the daemon never holds keys. Adds Studio test-on-trace for judge rules.

Ticket: O25 (Forge Observe vs LangSmith evaluation follow-up)

Changes

  • fix(studio): bound judge calls by timeout and lease deadline
  • feat(studio): LLM-judge evaluators

Verification: focused vitest, tsc --noEmit, eslint on changed files (details in the review package); full suite and fallow run in CI.

🤖 Generated with Claude Code

LinuxDevil and others added 4 commits October 29, 2026 01:58
The observe daemon holds no provider keys, so a matching judge rule now
queues an in-memory job (bounded at 500, pending + leased). Agent Forge's
server pulls them (POST /api/v1/evaluators/judge-jobs/claim, leased,
expired leases requeue at the front), runs each judge as one direct
provider call with the playground's provider resolution (no spans, so no
observe feedback loop), and posts the result back
(POST /api/v1/evaluators/judge-jobs/:job_id/result -> online score).
Studio also handles test-on-trace for judge rules and forwards code rules.

The evaluator trace builder moves to src/observe/evaluatorTrace.ts and is
exported from the traces subpath so Studio builds the identical object.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each judge call now gets an AbortSignal and a cap (judgeTimeoutMs,
default 20 s, cut to what is left of the job's lease minus a 1 s post
margin); a claimed job whose local lease deadline has passed is skipped
and left to requeue. The claim sends lease_ms explicitly. A non-JSON 2xx
claim answer goes through the once-per-outage warning. The test-on-trace
route rejects unsafe ids and caps its dry run the same way. baseDir is
dropped from the loop options; LOUSHO_STUDIO_JUDGE=0 turns the loop off
and the e2e server sets it. The daemon accepts a null result comment.
Docs note the timeout and that a renamed rule scores under its
claim-time name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@LinuxDevil
LinuxDevil merged commit c6834bb into main Oct 28, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant