Configure a lineage's promotion gate
Every field is optional and replaces the stored one. While enabled, moving production to a version needs a completed experiment of exactly that version on the gate snapshot, scored by exactly the pinned evaluator versions with at least trials trials, that meets every threshold, the error and valid-item limits, has no failed critical rows and (with non_regression) is no worse than the current production version’s run; otherwise the move is refused with 409 eval_gate_failed. enabled: false turns the gate off and keeps the config. Rollback is never gated.
curl --request PATCH \
--url https://api.veri.studio/v1/models/{name}/gate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"enabled": true,
"dataset_snapshot_id": "<string>",
"evaluators": [
{
"evaluator_id": "<string>",
"version": 123
}
],
"thresholds": {},
"trials": 123,
"max_error_rate": 123,
"min_valid_items": 123,
"non_regression": true,
"regression_tolerance": 123
}
'import requests
url = "https://api.veri.studio/v1/models/{name}/gate"
payload = {
"enabled": True,
"dataset_snapshot_id": "<string>",
"evaluators": [
{
"evaluator_id": "<string>",
"version": 123
}
],
"thresholds": {},
"trials": 123,
"max_error_rate": 123,
"min_valid_items": 123,
"non_regression": True,
"regression_tolerance": 123
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
enabled: true,
dataset_snapshot_id: '<string>',
evaluators: [{evaluator_id: '<string>', version: 123}],
thresholds: {},
trials: 123,
max_error_rate: 123,
min_valid_items: 123,
non_regression: true,
regression_tolerance: 123
})
};
fetch('https://api.veri.studio/v1/models/{name}/gate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"object": "<string>",
"model": "<string>",
"enabled": true,
"judge_human_agreement": [
{
"evaluator_id": "<string>",
"version": 123,
"name": "<string>",
"count": 123,
"agreement": 123,
"warning": "<string>"
}
],
"config": {
"dataset_snapshot_id": "<string>",
"evaluators": [
{
"evaluator_id": "<string>",
"version": 123
}
],
"thresholds": {},
"trials": 123,
"max_error_rate": 123,
"min_valid_items": 123,
"non_regression": true,
"regression_tolerance": 123
},
"updated_at": "2023-11-07T05:31:56Z",
"updated_by": "<string>",
"latest_production_experiment": {
"object": "<string>",
"id": "<string>",
"name": "<string>",
"status": "<string>",
"dataset_id": "<string>",
"dataset_snapshot_id": "<string>",
"target": {},
"evaluators": [
{
"evaluator_id": "<string>",
"version": 123,
"name": "<string>",
"scope": "<string>",
"method": "<string>",
"judge_model": "<string>"
}
],
"bindings": {},
"generation": {
"temperature": 123,
"max_tokens": 123
},
"trials": 123,
"items_total": 123,
"items_done": 123,
"created_at": "2023-11-07T05:31:56Z",
"target_deployment_id": "<string>",
"target_model": "<string>",
"target_model_version_id": "<string>",
"target_served_model": "<string>",
"aggregates": {},
"passed": true,
"baseline_experiment_id": "<string>",
"diff": {},
"error": "<string>",
"created_by": "<string>",
"started_at": "2023-11-07T05:31:56Z",
"finished_at": "2023-11-07T05:31:56Z"
}
}Authorizations
API key with the vk_ prefix. Create one from the dashboard.
Path Parameters
Lineage name
Body
PATCH /v1/models/{name}/gate: every field optional; a present field replaces the stored one.
true turns the gate on (needs a snapshot and at least one evaluator); false turns it off and keeps the config.
<dataset_id>@snap-N in the workspace, not purged.
llm_judge and code evaluators (human evaluators can't gate).
Show child attributes
Show child attributes
Pinned evaluator (id or name) -> minimum pass rate in [0, 1]. Only evaluators with a pass rule. Replaces the whole map.
Show child attributes
Show child attributes
1-10.
[0, 1].
= 1.
[0, 1].
Response
The updated gate
A lineage's promotion gate.
Always "model_gate".
Lineage name.
While true, moving production needs evidence that meets config.
Per pinned llm_judge evaluator: agreement with human scores on the same targets. Informational; never blocks a promotion.
Show child attributes
Show child attributes
null until configured. Kept when the gate is disabled.
Show child attributes
Show child attributes
The current production version's latest completed run on the gate snapshot with the gate's evaluator pins: the non-regression baseline.
Show child attributes
Show child attributes
curl --request PATCH \
--url https://api.veri.studio/v1/models/{name}/gate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"enabled": true,
"dataset_snapshot_id": "<string>",
"evaluators": [
{
"evaluator_id": "<string>",
"version": 123
}
],
"thresholds": {},
"trials": 123,
"max_error_rate": 123,
"min_valid_items": 123,
"non_regression": true,
"regression_tolerance": 123
}
'import requests
url = "https://api.veri.studio/v1/models/{name}/gate"
payload = {
"enabled": True,
"dataset_snapshot_id": "<string>",
"evaluators": [
{
"evaluator_id": "<string>",
"version": 123
}
],
"thresholds": {},
"trials": 123,
"max_error_rate": 123,
"min_valid_items": 123,
"non_regression": True,
"regression_tolerance": 123
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
enabled: true,
dataset_snapshot_id: '<string>',
evaluators: [{evaluator_id: '<string>', version: 123}],
thresholds: {},
trials: 123,
max_error_rate: 123,
min_valid_items: 123,
non_regression: true,
regression_tolerance: 123
})
};
fetch('https://api.veri.studio/v1/models/{name}/gate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"object": "<string>",
"model": "<string>",
"enabled": true,
"judge_human_agreement": [
{
"evaluator_id": "<string>",
"version": 123,
"name": "<string>",
"count": 123,
"agreement": 123,
"warning": "<string>"
}
],
"config": {
"dataset_snapshot_id": "<string>",
"evaluators": [
{
"evaluator_id": "<string>",
"version": 123
}
],
"thresholds": {},
"trials": 123,
"max_error_rate": 123,
"min_valid_items": 123,
"non_regression": true,
"regression_tolerance": 123
},
"updated_at": "2023-11-07T05:31:56Z",
"updated_by": "<string>",
"latest_production_experiment": {
"object": "<string>",
"id": "<string>",
"name": "<string>",
"status": "<string>",
"dataset_id": "<string>",
"dataset_snapshot_id": "<string>",
"target": {},
"evaluators": [
{
"evaluator_id": "<string>",
"version": 123,
"name": "<string>",
"scope": "<string>",
"method": "<string>",
"judge_model": "<string>"
}
],
"bindings": {},
"generation": {
"temperature": 123,
"max_tokens": 123
},
"trials": 123,
"items_total": 123,
"items_done": 123,
"created_at": "2023-11-07T05:31:56Z",
"target_deployment_id": "<string>",
"target_model": "<string>",
"target_model_version_id": "<string>",
"target_served_model": "<string>",
"aggregates": {},
"passed": true,
"baseline_experiment_id": "<string>",
"diff": {},
"error": "<string>",
"created_by": "<string>",
"started_at": "2023-11-07T05:31:56Z",
"finished_at": "2023-11-07T05:31:56Z"
}
}
