POST /v1/chat/compare runs one prompt across multiple models concurrently.
See Compare for the full guide.
Some models are missing from the result (partial: true)
Model calls are isolated — if one fails or hits the 120s hard timeout, the others continue and the response carriespartial: true. Check each result’s
error / error_code; a partial response is expected behavior, not a failure
of the whole call.
The whole request failed with 502 all_models_failed
If every model fails, the request fails with502 and code all_models_failed.
This error uses a different shape from the standard envelope: it is nested under
detail and has no request_id.
detail.error.details gives one model’s error and error_code.
Fix those (a model ID, a policy restriction, a provider outage) and retry.
comparison is null
The synthesis only runs when at least two models succeed. It is also null
when you set skip_comparison: true, when every judge in the chain failed, or
when you didn’t name a comparison_model and your key’s model policy permits
none of the default judges.
Too many / duplicate models
models accepts 1–10 entries. Duplicates are removed automatically, so
listing the same model twice won’t run it twice.
Billing is higher than expected
Compare bills N+1 usage events: one per fan-out model plus the synthesis/comparison call. If the comparison model fails and a fallback judge takes over, each judge attempt is recorded as its own usage event, but only the judge that produced the synthesis is charged. (For rate limits, though, the whole comparison counts as a single request against RPM/RPD.) Setskip_comparison: true to
drop the comparison call if you only need raw outputs.
Streaming behaves differently than chat
There are two modes:- With comparison (default) — fan-out models are non-streaming; only the final comparison text streams token-by-token (
comparison_chunk). skip_comparison: true— each model streams concurrently, tagged by model name (model_chunk/model_stream_done).
comparison_fallback_used in the done event if the comparison
model had to fall back.