Skip to content
IonWarpRouterTry for free
IonWarp Docs
API

Reviewers & Models

The reviewer catalog, the model each one runs on, the benchmarks behind that choice, and how a lineup is named on a review.

A reviewer is a skill with a model behind it. The catalog is what you name reviewers from; a lineup is the reviewers array on a review and is never a stored object of its own.

The catalog

curl --fail-with-body "https://ionwarp.com/api/v1/reviewers?limit=5" \
  -H "Authorization: Bearer $IONWARP_API_KEY" \
  -H "Project-ID: $PROJECT_ID"

Registry order. Every row carries the reviewer's one model fact at two tiers — model + reasoning_effort (the governed pin the reviewer runs on today) and max (the benchmark leader the one retry runs on when the pinned attempt fails) — plus auto (the ionwarp:<id>:auto spelling of that pin), benchmark_status, and project — whether this project has the reviewer enabled. ?q= searches. A project can pin a different {model, reasoning_effort} per reviewer through ionwarp.review.model_pins; a run's reviewers[] entry outranks that pin.

The models measured for a reviewer

curl --fail-with-body "https://ionwarp.com/api/v1/reviewers/code-review/models" \
  -H "Authorization: Bearer $IONWARP_API_KEY" \
  -H "Project-ID: $PROJECT_ID"

One row per model the benchmarks app has measured for that reviewer, the current pin flagged, each with its benchmark record. benchmark_source names the environment the rows came from; an environment with no benchmarks binding answers benchmark_source_unbound rather than an empty list that reads as "nothing measured".

Naming a lineup

A review takes reviewers as strings, highest-precedence form first:

  • "security-review@google/gemini-3.8-flash" — this reviewer on this model, for this run only.
  • "security-review" (or "ionwarp:security-review:auto") — this reviewer on its governed pin.
  • omit reviewers — the planner picks the lineup from the diff.

Model ids are validated by syntax only (org/model), so any OpenRouter model runs on day one and is priced from the provider's actual usage. A string naming a reviewer that is not in the catalog is refused by name at create time. The object form — {key, skill, model} with skill as an immutable revision — is the advanced form for controlled trials, on the reviews reference.

Enabling reviewers for a project

PATCH /reviewers/{id} with {"enabled": true} (or false) is the one writable field on the per-project reviewer row; it is what the catalog page's switch writes. An enabled roster is what automatic reviews plan from; a lineup named on a review runs regardless of enablement.

Grading a trial, then promoting the winner

GET /reviews/{id} returns the receipt with one row per reviewer — the model that actually ran, verdict, findings count, real cost, phase timings. That is the grading source for every trial; a PR comment is a rendering of it. A model that wins across reviews is promoted by pinning it in the project's configuration (ionwarp.review.model_pins, keyed by reviewer id), and a winner that holds up across projects graduates into the reviewer's own SKILL.md pin.

Next: Reviews for what a lineup produces · Scorecards for the same pin mechanism on repo-wide rubrics · Control Plane for the brakes that stop a run before any reviewer starts.