Defines the shape of one score name for the caller's org and answers 201 with…
Defines the shape of one score name for the caller's org and answers 201 with it.
POST /v1/eval/rubrics
| Address | https://api.hanzo.ai/v1/eval/rubrics |
| Method | POST |
| Operation | post_eval_rubrics |
| Auth | Authorization: Bearer $HANZO_API_KEY |
Defines the shape of one score name for the caller's org and answers 201 with it.
This is the integrity contract, not documentation: once a rubric exists for a name, every score recorded under that name is checked against it and the rubric's data type is AUTHORITATIVE — a caller cannot claim a different one. Out-of-range values, unlisted labels and non-finite numbers are refused at write time.
A CATEGORICAL rubric with no categories is 400, as is a non-finite bound or a minValue above maxValue. Requires a validated principal; 403 without one.
Request
5 fields, body application/json (required).
| Field | In | Type | Required | Description |
|---|---|---|---|---|
categories | body | string[] | — | Categories is the closed set of labels a CATEGORICAL score may carry. |
dataType | body | string | — | DataType is NUMERIC (the default), CATEGORICAL or BOOLEAN. |
maxValue | body | number | — | MaxValue is the inclusive ceiling a NUMERIC score must stay under, finite. |
minValue | body | number | — | MinValue is the inclusive floor a NUMERIC score must clear. |
name | body | string | yes | Name is the score name this rubric governs, matching ^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$. |
Response
| Status | Body | Meaning |
|---|---|---|
201 | scoreConfigView | created |
201 body — 7 fields.
| Field | In | Type | Always | Description |
|---|---|---|---|---|
categories | body | string[] | — | Categories is the closed set of labels a CATEGORICAL score may carry. |
createdAt | body | string | — | CreatedAt is when the rubric was first declared. |
dataType | body | string | — | DataType is NUMERIC, CATEGORICAL or BOOLEAN, and is authoritative — a score recorded under this name cannot claim a different one. |
maxValue | body | number | — | MaxValue is the inclusive ceiling a NUMERIC score must stay under, absent when unbounded. |
minValue | body | number | — | MinValue is the inclusive floor a NUMERIC score must clear, absent when unbounded. |
name | body | string | — | Name is the score name this rubric governs. |
updatedAt | body | string | — | UpdatedAt is when it last changed. |
Failure carries the platform error shape — see Errors.
Examples
hanzo evals rubrics create --name <name>import { Configuration, EvalApi } from 'hanzoai';
const api = new EvalApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.postEvalRubrics({ 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_rubrics(name="<name>")cfg := cloud.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := cloud.NewAPIClient(cfg)
resp, _, err := client.EvalAPI.PostEvalRubrics(context.Background()).Execute()
if err != nil {
return err
}use hanzo_cloud::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_rubrics(&cfg, Default::default()).await?;import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.EvalApi;
ApiClient client = new ApiClient();
client.setRequestInterceptor(b -> b.header("Authorization", "Bearer " + System.getenv("HANZO_API_KEY")));
var result = new EvalApi(client).postEvalRubrics();The method above is the one at the current release of the document. [email protected] (npm) and [email protected] (PyPI) were generated from an earlier release, where this operation carried a different id, so it spells the method differently — regenerating the clients is what makes the two agree. SDKs →
curl -X POST https://api.hanzo.ai/v1/eval/rubrics \
-H "Authorization: Bearer $HANZO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "<name>"
}'The door reaches eval through the evals tool, which names its 16 operations with its own verbs — this one among them, under a name only the door 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"
}
}
}'How is this guide?