Skip to main content
Two feedback loops keep an assistant from getting worse. Annotations are ratings people leave on individual turns. Eval scenarios are scripted conversations with checks that decide pass or fail; the gate suite runs on every publish (see Versions and publish), and the other suites run when you ask. Promote connects the two: one call turns a downrated turn into a gate scenario.

Credentials

Scenario authoring and on-demand runs are also available in the portal on the instance’s Evals tab. Follower instances refuse authoring and runs with 409 instance_follows_canonical; their scenarios live on the instance they follow.

Annotations

An annotation rates one turn: good, bad, or neutral, with an optional comment and reason. POST .../conversations/{conversation_id}/annotations With submitter_id and feedback_key, posting again for the same turn, submitter, and key updates the one annotation instead of adding another. Use it for a thumbs control that the user can change.
Response 201:
  • Restore after a reload: GET .../annotations?end_user=...&submitter_id=... returns {annotations, truncated}: up to 500 of that submitter’s API annotations on the conversation, newest first. Annotations made in the portal are never returned here.
  • Retract: DELETE .../annotations/{annotation_id} with a JSON body {end_user, submitter_id}. Answers 204. A mismatch, a portal annotation, or one already retracted is 404 annotation_not_found.
Annotation errors: 400 invalid_turn_id, invalid_rating, invalid_comment, invalid_reason, invalid_target, invalid_feedback_key, invalid_request; 404 conversation_not_found, turn_not_found, annotation_not_found. In the portal, the instance’s Feedback tab shows good and bad ratings from both the API and the portal, and your team can read them there. Nexio staff set a triage status on each one: new, acknowledged, in progress, fixed, won’t fix, or duplicate. Changing it needs review:moderate, which only Nexio staff hold.

Eval scenarios

A scenario is a scripted conversation plus a rubric. No application is attached during an eval, so the script plays your application’s part. A client tool handed off with no scripted result gets a scripted error. A confirmation with no scripted decision is denied. Platform read tools run for real against your org’s data; platform write tools run as a dry run with no side effect (see Platform tools). Every scripted turn makes real model calls, metered to your org.

Rubric checks

Deterministic checks alone decide pass or fail. judge dimensions are scored by a model and recorded, and never fail a scenario.

Suites and caps

A scenario over the cap is refused with 409 conversation_eval_scenario_cap. Editing or retiring a gate scenario while a publish’s gate is running aborts that publish with 409 scenario_set_changed_during_publish.

Scenario routes

  • GET .../eval-scenarios?suite=... lists active scenarios in authoring order.
  • POST .../eval-scenarios creates one. 201 with the scenario.
  • PATCH .../eval-scenarios/{scenario_id} corrects one in place, keeping its id and its past results. Every field is optional; the merged scenario is validated as a whole.
  • DELETE .../eval-scenarios/{scenario_id} retires one. 204. Past results stay readable. Later selections skip it; an on-demand run that already read its scenario list may still run it. Retiring one that is already retired is 404.
Scenario errors: 400 invalid_eval_scenario (with details), 400 invalid_request, 404 conversation_eval_scenario_not_found, 409 conversation_eval_scenario_cap, 409 instance_follows_canonical.

Promote an annotation

POST /api/v1/conversation-instances/{instance_slug}/annotations/{annotation_id}/promote with {rubric, name?} drafts a gate scenario from the annotated conversation. The script replays the user messages on that turn’s branch up to and including the annotated turn (at most the last 8 turns), with the recorded client tool results scripted in and those calls scripted as approved. The rubric is required and must carry a deterministic check. Answers 201 with the scenario, whose origin is promoted_from_annotation and whose annotation_id points back.
Errors: 400 invalid_request (body is not JSON), 400 invalid_eval_scenario (no rubric in the request), 404 annotation_not_found, 409 conversation_eval_scenario_cap, 409 instance_follows_canonical, 422 annotation_not_promotable (the annotated turn is not among the conversation’s newest 500 messages, there are no user turns to script, or the drafted scenario is invalid, for example a rubric that is {} or has no checks).

Run a suite on demand

An eval run measures the instance’s latest published version, not the draft. An instance with no published version is 409 instance_not_published.
1

Start the run

POST .../eval-runs with {"suite": "workflows"}. Needs an organization API key. The response is 201 with the run at status running.
2

Poll until it finishes

GET .../eval-runs/{run_id} returns {run, results}. Poll every 30 seconds or more; scenarios run one after another.
3

Diff against a baseline

GET .../eval-runs/{run_id}/diff compares with the previous completed (passed, failed, or waived) run of the same suite, or with ?baseline={run_id}. With no baseline and no earlier completed run, the answer is 404 conversation_eval_baseline_not_found.
GET .../eval-runs?suite=...&limit=... lists runs newest first; limit is 1 to 200, default 50.

Eval run states

triggered_by is publish, manual, schedule, or event. Starting a run in a deployment without the eval executor is 503 conversation_eval_unavailable.

Read a version’s latest eval run

GET .../versions/{version}/eval-run returns the most recent eval run recorded for that version, whatever started it. The publish gate run is the first, and a later on-demand run for the same version replaces it in this answer: {version, config_version_hash, run, results, diff?}. version is the integer as a string, and diff compares with the run of the version immediately before it (prior_version, newly_failing, new_failing, newly_passing); it is absent when that version has no recorded run. Errors: 400 instance_version_invalid_format, 404 instance_version_not_found, 404 conversation_eval_run_not_found.

Versions and publish

How the gate suite decides a release.

Guardrails

Rules that must_refuse and must_escalate test.
Last modified on September 25, 2026