GNL
Dokümanlar menüsü
Studio@gnldev/studio

Eval kapısı (promote yönetişimi)

Suite geçmeden promote yok (412).

Ne işe yarar / ne zaman kullanılır#

Agent versiyonlama ile bir agent'ın birden çok sürümü journal'da tutulur ve dilediğiniz sürüm promote ile aktif edilir. Ama "yeni system prompt'u/modeli üretime aç" kararı insan takdirine bırakılırsa regresyon riski vardır. evalGate, bunu otomatikleştirir: createStudioApp'a bir { datasetId, minAvg } verildiğinde, her promote isteği ÖNCE o eval dataset suite'ini koşturur; suite'in tüm aggregate skorları minAvg eşiğini geçmezse promote 412 ile reddedilir — sürüm aktif olmaz.

Tipik senaryo: production agent'ınız için bir regresyon dataset'i (ör. sık sorulan sorular + beklenen cevaplar) tanımlarsınız; bir mühendis yeni bir system prompt sürümü ekleyip promote etmeye çalıştığında, suite geçmezse Studio bunu otomatik engeller — kararın kendisi de (geçti/kaldı + aggregate skorlar) audit log'a agent.gate olayı olarak düşer, kim ne zaman denedi kalıcı iz bırakır.

Kurulum / import#

evalGate ayrı bir paket değil — @gnldev/studio'nun createStudioApp (veya createStudioApi) çağrısına verilen bir seçenektir. Devreye girmesi için aynı çağrıya bir datasets (StudioDatasets sözleşmesi) sağlamanız ŞARTTIR — datasets yoksa promote isteği 501 döner.

import
import { createStudioApp } from '@gnldev/studio';
import type { StudioDatasets, EvalDatasetResultLike } from '@gnldev/studio';
import { evalDataset } from '@gnldev/evals';

Adım adım kullanım#

1) StudioDatasets sözleşmesini uygulayın — Studio çekirdeği @gnldev/evals'a bağımlı değildir; siz datasets.run(id) içinde evalDataset'i çağırıp EvalDatasetResultLike ile yapısal olarak uyumlu bir sonuç döndürürsünüz:

datasets sağlayıcısı
const datasets: StudioDatasets = {
  list: () => [{ id: 'regression', cases: 12, description: 'Frequently asked questions' }],
  run: async (id) => {
    const report = await evalDataset({
      dataset: regressionDataset, // { id: 'regression', cases: [...] }
      run: async (input, { runId }) => gnl.run('starwars', { runId, prompt: input }),
      scorers: [exactMatch()],
      journal,
    });
    return report; // { datasetId, cases, aggregate }
  },
};

2) evalGate'i createStudioApp'a verin — datasetId hangi suite'in koşulacağını, minAvg (varsayılan 0.5) geçme eşiğini belirler:

Studio'yu eval kapısıyla kur
app.route('/studio', createStudioApp({
  reader: toJournal(storage.runs),
  gnl: createStudioRunner(gnl, config, { toJsonSchema: aiToolSchema }),
  datasets,                                     // required without it evalGate returns 501
  evalGate: { datasetId: 'regression', minAvg: 0.7 },
  auth,
}));

3) Promote isteği artık kapıdan geçer — POST /managed-agents/:name/promote çağrıldığında Studio önce datasets.run('regression')'ı koşturur; her aggregate skor 0.7'nin altındaysa (`failing`) istek 412 ile reddedilir, hiçbiri altında değilse sürüm aktif edilir:

promote — kapı KALDI
POST /studio/api/managed-agents/starwars/promote
{ "version": 3 }

// 412 Precondition Failed
{
  "error": "the eval gate FAILED: exact-match=0.42<0.7 — promotion refused",
  "aggregate": { "exact-match": 0.42 }
}
// an 'agent.gate' event lands in the audit log: { version: 3, datasetId: 'regression', minAvg: 0.7, aggregate, passed: false }
promote — kapı GEÇTİ
POST /studio/api/managed-agents/starwars/promote
{ "version": 3 }

// 200 OK
{ "ok": true, "name": "starwars", "active": 3, "previous": 2 }
// 'agent.gate' (passed: true) lands in the audit log first, then 'agent.promote'

API referansı#

typeStudioAppOptions.evalGate

{ datasetId: string; minAvg?: number } — verilirse her promote öncesi bu dataset suite'i koşulur; minAvg (varsayılan 0.5) altında kalan HERHANGİ bir aggregate skor promote'u 412 ile reddeder.

typeStudioDatasets

{ list(): DatasetMeta[]; run(id, opts?): EvalDatasetResultLike } — host tarafından sağlanan dataset sözleşmesi; evalGate ve /datasets/:id/run bunu kullanır.

typeEvalDatasetResultLike

{ datasetId; cases: { caseId, output, scores }[]; aggregate: Record<string, number> } — @gnldev/evals evalDataset çıktısıyla yapısal olarak uyumlu.

constPOST /managed-agents/:name/promote

{ version } gövdesiyle çağrılır. evalGate etkinse suite koşar: HERHANGİ bir aggregate skor minAvg altındaysa 412 döner, aksi halde sürüm aktif edilir. datasets yoksa 501 döner.

Ön koşul
evalGate ayarlıyken datasets seçeneği verilmezse promote isteği 501 ("evalGate yapılandırılmış ama datasets opsiyonu yok") döner — kapı sessizce devre dışı kalmaz, promote tamamen engellenir.
Garanti
Kapı kararı (geçti VEYA kaldı) suite'in sonucundan bağımsız olarak HER durumda agent.gate olayıyla audit'e yazılır — reddedilen bir promote denemesi de aggregate skorlarıyla birlikte kalıcı iz bırakır.
İlgili
Suite'i kendiniz elle de koşabilirsiniz: POST /datasets/:id/run aynı datasets.run'ı çağırır — bkz. değerlendirme: scorer &amp; LLM-judge.