Create scores

Files one score event for the caller's org and answers 201 with it.

POST /v1/eval/scores

Addresshttps://api.hanzo.ai/v1/eval/scores
MethodPOST
Operationpost_eval_scores
AuthAuthorization: Bearer $HANZO_API_KEY

Files one score event for the caller's org and answers 201 with it.

This is how human review and out-of-band graders land beside the automatic ones: name the score, give it a value (or a stringValue for a categorical label), and attach it to a trace, a run, a dataset example, or any combination.

Scores are validated fail-closed. A value must be FINITE — NaN and Inf are 400 — and if the org has declared a rubric for this name, that rubric decides the type and the value must satisfy it: inside the numeric bounds, or one of the allowed categories. A caller cannot override the declared type by sending a different dataType.

A score is TELEMETRY, not metadata, so it needs the datastore: a deployment with none wired answers 503 rather than accepting a score it cannot persist. Requires a validated principal; 401 without one, and the org is stamped from the validated claim rather than read off the body.

Request

9 fields, body application/json (required).

FieldInTypeRequiredDescription
commentbodystring—Comment is the grader's reasoning, truncated at 2000 characters.
dataTypebodystring—DataType is NUMERIC, CATEGORICAL or BOOLEAN.
datasetItemIdbodystring—ItemID attaches the score to one graded example.
datasetNamebodystring—Dataset attaches the score to one dataset.
namebodystringyesName is the score name.
runNamebodystring—RunName attaches the score to one run.
stringValuebodystring—StringValue is the label of a CATEGORICAL score, which must be one the rubric allows.
traceIdbodystring—TraceID attaches the score to one model call.
valuebodynumber (double)—Value is the numeric score, which must be finite: NaN and Inf are refused.

Response

StatusBodyMeaning
201eval.scoreViewcreated
defaultproblem-detailsrefused

201 body — 9 fields.

FieldInTypeAlwaysDescription
commentbodystring—Comment is the grader's reasoning, truncated at 2000 characters.
dataTypebodystring—DataType is NUMERIC, CATEGORICAL or BOOLEAN.
idbodystring—ID is the score event's handle.
namebodystring—Name is the score name, which a rubric of the same name governs.
runNamebodystring—RunName is the run this score was recorded under, when it came from one.
stringValuebodystring—StringValue is the label of a CATEGORICAL score.
timestampbodystring—Timestamp is when the score was recorded.
traceIdbodystring—TraceID is the model call this score grades, when it grades one.
valuebodynumber (double)—Value is the numeric score; for BOOLEAN it is 0 or 1.

Failure carries the platform error shape — see Errors.

Examples

hanzo eval scores create --name <name>
import { Configuration, EvalApi } from 'hanzoai';

const api = new EvalApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.postEvalScores({ name: "<name>" });
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import EvalApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = EvalApi(client).post_eval_scores(name="<name>")
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.EvalAPI.PostEvalScores(context.Background()).Execute()
if err != nil {
	return err
}
use hanzo_client::apis::{configuration::Configuration, eval_api};

let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();

let result = eval_api::post_eval_scores(&cfg, Default::default()).await?;
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.EvalApi;

ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));

var result = new EvalApi(client).postEvalScores();
curl -X POST https://api.hanzo.ai/v1/eval/scores \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "name": "<name>"
     }'

MCP reaches eval through the eval tool, which names its 16 operations with its own verbs — this one among them, under a name only MCP declares. describe explains any of them:

curl -X POST https://api.hanzo.ai/v1/mcp \
  -H "Content-Type: application/json" \
  -d '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/call",
       "params": {
         "name": "describe",
         "arguments": {
           "op": "list_eval_datasets"
         }
       }
     }'

Eval API · All Hanzo APIs · Interactive reference

Was this page useful?