feat(eval): LLM-as-judge evaluators, dataset item fixes, and Experiments runs #13
Reference in New Issue
Block a user
Delete Branch "fix/dataset-item-url-safe-ids"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Three layered changes for the Langfuse eval side of pragent:
1. Dataset item ids that survive a URL path
Items were keyed
{repo}#{pr}— both characters break the UI item route/datasets/{id}/items/{item_id}. Now{owner}__{repo}__pr{n}, which round-trips throughquote(safe=)unchanged. The real repo and pr stay ininput. 28 broken items were deleted and recreated (29 now).2. Filterable metadata + Experiments runs
The filter bar matches on
metadataonly, so every facet worth slicing on is a flat primitive key:repo,owner,repo_name,pr,head_sha,finding_count,has_findings,max_severity,reviews_run,last_reviewed_at/_iso,labelled_by_human. Nested objects and lists are deliberately absent: the bar cannot reach into them.eval_experiment.pylinks already-traced reviews into dataset runs grouped by model. One trace per (run, item), the newest. Re-review churn no longer duplicates results.3. LLM-as-judge evaluators
Two
llm_as_judgeevaluators score the review generation: NUMERIC 0–1 on finding actionability, BOOLEAN on whether the summary agrees with the findings. Both run on every observation whose trace name ispr-revieworopencode-review. The judge iskimi-k2.7-codethrough the headroom hub, routed via a newjudge-proxypod that patches thesignaturefield local Ollama drops from thinking blocks.Trace + generation output now includes the findings themselves (capped at 25) rather than just the count, so a judge has something to grade. Generation input/output mirrors the trace so an observation-level evaluator can read them.
Idempotent on re-run: evaluators and rules are skipped, not duplicated. The connection is upserted on provider.
🤖 Generated with Claude Code
Items were keyed `{repo}#{pr}`, e.g. `netcracker/interview#29`. Both characters break the UI's item route: the `/` in `owner/repo` splits into extra path segments, and everything after the `#` is a fragment the browser never sends. Items were created successfully and then 404'd when opened. Ids are now `{owner}__{repo}__pr{n}`, which needs no percent-encoding. The real repo and pr stay intact in `input`, so nothing downstream reads the id back apart. Session ids elsewhere keep the `{repo}#{pr}` form — those are never path segments and feedback_scores depends on that shape. The 28 existing items were unusable and are regenerable from feedback.db; they were deleted and recreated under the new ids. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>fix(eval): dataset item ids that survive a URL pathto fix(eval): url-safe dataset item ids, filterable metadata, and Experiments runsfix(eval): url-safe dataset item ids, filterable metadata, and Experiments runsto feat(eval): LLM-as-judge evaluators, dataset item fixes, and Experiments runs