Request Body
credentialId in a model choice is a saved credential’s ID, or managed-model. models[].harnesses are pi, codex, claude-code, mini-swe-agent, terminus-2, or muse-code. thinking is off, minimal, low, medium, high, xhigh, or max.
Comparisons
A comparison starts one evaluation per model, running every task on each harness as a trial. If the reply hassubmissionError, resume the same comparison with its id; it reuses the same evaluation IDs.
For scores, read results rather than adding up trials.
Harnesses and Environments
harnesses (≤4) are saved harnesses’ ids; environments (≤4) are environments’ ids. Every task runs again with each harness, in each environment, and with each harness in each environment, at most 12 in all, beside the tasks as they are. baseline: false leaves out the tasks as they are. Results report each as its own configuration.
models[].harness is one saved harness’s id, which that model runs in place of its agent as it is: on the tasks as they are and in each environment. Its agent must be the row’s. The app’s Run page picks harnesses this way.
conditions, the older form, still names each pair one by one: { saved?, environment?, subagentCredentialId? }, or the changes written out.
Subagent Models
A saved harness’ssubagent runs each model as the orchestrator and another catalog model for the work it delegates: Claude Opus on Claude Code with DeepSeek subagents, say. Without one, subagents run on the model itself.
models[].subagent: { catalogId, credentialId } still names a subagent model for one model, under the baseline and every harness without its own, with the default prompt. Comparisons named it there before harnesses did.
The trial’s key serves exactly its two models. Its cost, tokens, and model check all come from the gateway’s record of each call, priced at that call’s own model; a trial with an unpriced call has no cost rather than an estimate. billedCostUsd is set only when both credentials are API keys, since a sign-in’s calls are priced at list rates but not billed.