Evaluations
An eval set is a saved test of your search quality: named cases pinned to one version of your data, scored by a judge, giving one number — the pass rate.
- A case is one real search — “waterproof running jacket” — with its own standard for a good result.
- A judge is an AI model that reads each result and decides pass or fail against that standard, billed to your own API key.
- Pin a version, then measure every change against it — a new embedding model, a reranker, re-imported records, a setting moved from test to production. If the rate falls, the change hurt quality.
What an eval set is
An eval set is a saved relevance test — a handful of named cases, one real search each, pinned to one version of your data and scored on your own API key. Run it and you get a single number, the pass rate. Run it again after any change and compare. It lives under Insights → Evaluations.

Create a set
Pin a target (a list or group version), pick the saved API key that pays for the grading, and write what a pass means by default. The set is created empty — you add its cases next, so the form never grows with the test.

Your saved tests, in one place
Each set shows what it pins, how it is scored, and how many cases it runs. Open its … menu and choose Cases to add one — a search plus the bar for that search. Think of it as a health check you can re-run any time — by hand, or automatically when your data changes.

See the cost before you run
Open Runs & history and it tells you the cost up front — how many judge calls this run will make on your key — before you commit. Hit Run now and it scores every search in the background.

Catch a regression as a number
Every run plots a point. Here quality held around 94%, then a new embedding model dropped it to 78% — caught at once — and the fix brought it back. That is the whole point: you see a regression as a number, before your users feel it. (Illustrative trend.)

Auto-plays · use Back / Next to step through at your own pace.
A set and its cases
| What it is | What it holds | |
|---|---|---|
| Eval set | The test | Name, the pinned target, how it is judged (an API key and model), default criteria, and its auto-run settings |
| Case | One search in that test | Name, the search text, how many results to judge, and its own criteria |
- Criteria belong to the case, not the set. The judge sees one result at a time, never the search that found it, so one standard cannot cover both “running shoes” (a shoe made for running, in stock, with a size) and “waterproof jackets” (waterproof, not just water-resistant).
- Blank case criteria use the set’s default — its What counts as a pass text. Blank never means “don’t score this case”.
Create an eval set
- Insights → Evaluations, then New eval set.
- Pin a target: a list version or a group version. This fixes which records the test searches.
- Tick Score each result with a judge. Under Grade with, pick the saved credential whose API key pays and optionally that vendor’s model, then write the set’s default What counts as a pass criteria, used by every case that states none of its own — e.g. “the product matches the search and is in stock”.
- Unticked gives a metrics-only set: cheap counts of results returned per search, and searches that returned nothing.
- Optionally turn on auto-run, then click Create.
A new set is created empty and cannot run until it has at least one case. Add them from the set’s own row.
Add the cases
On the eval set’s row, open the … menu, choose Cases, then click Add case.
| Field | What it does |
|---|---|
| Name | Identifies the case so you can edit it alone and follow it across runs. Unique within the set, fixed once created. |
| Search text | What a user would really search for, e.g. mens waterproof jacket. Suggest drafts one for you, on your key, from the records the set is pinned to. |
| Results to judge | How many of the top results this case fetches and scores (1–25, default 10). Each one is a call to the judge, billed to your key. |
| What counts as a pass | The standard for this search. Leave blank to use the set’s default criteria. |
- The list shows each case’s name, results judged, search text, and either its own criteria or “Uses the set’s default criteria”. Pencil and bin edit or delete a row.
- 25 cases on the free plan, 50 on paid, unlimited on Enterprise. The same target can be run from several sets.
You pick a key, not a judge
- An eval always asks the model the same question — does this result meet the criteria? — so there are no instructions to write.
- Name the credential whose key pays, and optionally one of that vendor’s models; without one you get the vendor’s cheapest tier.
- A judge is separate: a model with reusable, named instructions for filtering live search results. You don’t have to set one up first.
- The judge an eval uses is found and reused per credential and model, so ten sets sharing a key share one judge instead of using up your plan’s judge allowance.
What pinning does, and what it doesn’t
- A pin fixes which records are searched — the same records, not the same results.
- Records, embeddings, model and reranker are read live on every run, which is what lets a re-run catch a drop in quality.
- Two runs a week apart can differ if the model, reranker, judge or records changed in between. Each run records the model, reranker and judge it ran under.
Run it and read the pass rate
Open Runs & history. The cost is shown up front: how many judge calls this run makes on your key, totalled from your cases. Run now scores every case in the background, a few at a time.
| Metric | What it tells you |
|---|---|
| Pass rate | Of every result the judge looked at, how many passed. Your headline quality number. |
| Cases with no results | How many of your cases returned no results at all. You want this low. |
- The pass rate counts results, not cases. A case asking for 10 results contributes 10 verdicts, one asking for 3 contributes 3: five cases returning 25 results, of which the judge approved 6, score 24%.
- A result the judge could not reach a verdict on counts as not passed.
- A low rate has two causes: the results really are poor, or the cases ask for more results than the data holds — ask for 25 when only 8 records could match and the other 17 drag it down.
- Each run reports whole numbers first — results judged, passed against failed, errors, cases that came back empty — then every case worst first with its own counts, so a bad score points you at the case to look at.
- Runs build a trend line; each point carries its counts and the model, reranker and judge that run used — hover to see them. Only compare points where those match.
A worked example
A products group scores a steady 94%. A new embedding model drops it to 78%; switching back (or fixing it) returns the line to 91% — caught in seconds rather than from a customer complaint.
An illustrative trend: the shape a drop in quality makes when an eval catches it.
Measure every change automatically
- Turn on auto-run and the set re-runs whenever the pinned data changes: after an automatic media re-import, or once a group has finished moving to a new embedding model.
- Each auto-run bills your key; a metrics-only set is free.
- A set never starts a second run while one is still going.
Sets you made before cases existed
- Sets created before cases held a plain list of searches and one set of criteria. They read those queries back as cases named
case-1,case-2and so on, each with no criteria of its own, so each uses the set’s. Runs score as they always did. - The first edit, add or delete of a case writes the whole list out as real cases before applying the change. Left alone, it keeps working.
API and MCP
Cases have their own routes, under the set they belong to:
| Route | Notes | |
|---|---|---|
| Sets | eval/{account-name} | List, view, create, delete |
| Cases | eval-case/{account-name}/{eval-set-name} | List and create |
| One case | eval-case/{account-name}/{eval-set-name}/{case-name} | View, edit, delete (deleting twice is safe; the second call does nothing extra) |
| Run | eval/{account-name}/{eval-set-name}/run | Starts a run; returns a run id and an estimate of how many billed calls it will make |
| Run status | eval/{account-name}/{eval-set-name}/run/{run-id} | Check on one run |
| History | eval/{account-name}/{eval-set-name}/runs | Score history, newest first |
- Create a set with
judge = {"credential_name": …, "model": …, "criteria": …}— a credential and an optional model, not a judge name. - On a case, leave out
criteriato use the set’scontext_text. - Agents get the same operations through MCP:
eval_case_list,eval_case_view,eval_case_create,eval_case_edit,eval_case_delete,eval_set_list,eval_set_view,eval_run,eval_run_status,eval_run_history.