claude plugin eval esegue il tuo plugin rispetto a una suite di casi di test e valuta i risultati. Ogni caso è un prompt realistico più uno o più grader. Un grader è un controllo pass/fail su ciò che Claude ha prodotto, come una regex sulla risposta, se uno strumento particolare è stato chiamato, o una rubrica che un secondo modello valuta sulla risposta.
Non devi scrivere la suite a mano; claude plugin eval init ti pone domande sul tuo plugin, propone i casi e i grader, li prova, scrive i file, e puoi chiedere a Claude di fare lo stesso da una sessione che hai già aperta.
Usa evals per misurare quanto affidabilmente il tuo plugin guida Claude verso il risultato corretto, per catturare regressioni quando modifichi il plugin o viene rilasciato un nuovo modello, e per vedere quale contributo il plugin apporta rispetto a nessun plugin.
Questa pagina è per gli autori di plugin e skill che hanno un plugin funzionante e vogliono testarne il comportamento, e per i team che gating le modifiche ai plugin in CI. Il suo formato di caso è separato dal file evals/evals.json che il plugin skill-creator utilizza. Per creare un plugin, vedi Creare plugin; per controllare i file di un plugin per errori di sintassi e schema piuttosto che il suo comportamento, usa claude plugin validate.
Ogni esecuzione di eval e ogni grader judge è una vera chiamata al modello sul tuo account, conteggiata rispetto all’utilizzo del tuo piano o alla tua fattura API, quindi controlla prima i requisiti. Poi crea la tua prima suite di eval, o vai a Eseguire evals in CI se ne hai già una.
Requisiti
Per eseguire plugin evals hai bisogno di:- Claude Code v2.1.269 o successivo. Esegui
claude --versionper controllare eclaude updateper aggiornare. - Una directory di plugin con un manifesto
plugin.jsono.claude-plugin/plugin.json, o un plugin skills-directory. - La stessa autenticazione e provider di modello che le tue normali sessioni Claude Code utilizzano. Le esecuzioni di eval, i grader valutati da judge, e
claude plugin eval initchiamano il modello con le tue credenziali, quindi contano rispetto ai tuoi limiti di utilizzo del piano o alla tua fattura API. Quando il comando riporta un costo, la cifra è una stima del prezzo di listino di quelle chiamate.
Come funziona un’esecuzione di eval
Una suite di eval vive in una directory chiamataevals/ dentro il tuo plugin, organizzata come mostra Scrivere e perfezionare i casi. Ogni caso è la sua sottodirectory con un prompt e uno o più grader. Il prompt è qualcosa che una persona che usa il tuo plugin potrebbe digitare, come una richiesta che una delle sue skill dovrebbe gestire.
Cosa succede in un’esecuzione
Per ogni esecuzione di un caso, Claude Code avvia una sessione fresca, isolata non-interattiva con solo il tuo plugin caricato, invia il prompt, e lascia che Claude lavori finché non finisce o non raggiunge il limite di turni o tempo del caso. Ogni grader quindi controlla la risposta finale, la trascrizione, o un file che Claude ha creato, e passa o fallisce.Come viene valutato un caso
Un’esecuzione di un agente non deterministico ti dice poco, quindi ogni caso viene eseguito tre volte per impostazione predefinita. Il punteggio di un’esecuzione è la frazione dei suoi grader che hanno passato, ponderata se imposti pesi, e il punteggio del caso è la media tra le sue esecuzioni. Un caso passa quando il suo punteggio soddisfa la--threshold, 1.0 per impostazione predefinita. Nelle chiamate di modello, una suite fa approssimativamente casi × esecuzioni esecuzioni di agenti con il plugin e altrettante per la baseline senza plugin, più tre brevi chiamate judge per grader llm o baseline per esecuzione.
La baseline senza plugin
Un punteggio alto di per sé non ti dice se il plugin ha aiutato, perché Claude potrebbe fare altrettanto bene senza di esso. Per separare i due, le esecuzioni di ogni caso vengono ripetute senza plugin caricato per impostazione predefinita, e ottieni due punteggi,WITH e W/OUT. La loro differenza, Δ, è quello che il plugin ha contribuito. Se un caso ottiene 1.0 sia con che senza il plugin, il plugin non è quello che l’ha fatto passare. I due set di esecuzioni sono chiamati with-arm e without-arm; Confrontare con una baseline senza plugin copre come i grader vengono valutati tra loro e come disattivare la baseline.
Crea la tua prima suite di eval
Questa procedura scrive un caso per il tuo plugin, lo esegue, e legge il risultato. Prima di iniziare, assicurati di avere:- Claude Code v2.1.269 o successivo e gli altri requisiti
- Un terminale aperto nella directory root del tuo plugin, quella che contiene
plugin.jsono.claude-plugin/plugin.json - Una skill nel plugin che vuoi testare, e una richiesta che un utente digiterebbe che dovrebbe attivarla
1
Crea i casi
Dalla root del plugin, esegui:Se Claude Code non ha già fiducia in questa directory, prima chiede
Trust this plugin directory?; rispondi y. Una sessione Claude Code interattiva si apre quindi. Claude legge il tuo plugin e ti chiede quale sia un buon risultato, propone prompt che dovrebbero e non dovrebbero attivare il plugin, progetta grader per ognuno, li pilota una volta per controllare che si comportino, e scrive una directory di caso per prompt sotto evals/, ognuna denominata dal suo prompt. Quando Claude ti dice che la suite è pronta, esci da quella sessione con /exit o Ctrl+D per tornare alla tua shell.Se hai già una sessione Claude Code aperta nella root del plugin, puoi invece chiedere a Claude di eseguire claude plugin eval init. Claude esegue il comando e poi ti pone le stesse domande in quella conversazione.Se preferisci scrivere un caso tu stesso per vedere esattamente cosa contengono i file, segui Scrivi un caso a mano e torna qui per eseguirlo.2
Esegui la suite
Di nuovo alla tua shell nella root del plugin, esegui ogni caso sotto Hai già fiducia in questa directory durante il passaggio 1, quindi l’esecuzione inizia immediatamente. Se hai scritto il caso a mano invece, l’esecuzione prima chiede
evals/:Trust this plugin directory? [y/N]; rispondi y. Cosa un’esecuzione può accedere spiega a cosa stai acconsentendo.Ogni caso viene eseguito tre volte con il tuo plugin e tre volte senza, quindi un caso è sei esecuzioni. Una linea di progresso viene stampata mentre ogni esecuzione finisce, con il punteggio di quella esecuzione e il verdetto di ogni grader.3
Leggi il riepilogo
Quando la suite finisce vedi una tabella di riepilogo, seguita da dove è andato il rapporto:
WITH è il punteggio del caso con il tuo plugin caricato, W/OUT è il punteggio senza di esso, e un Δ positivo significa che il plugin ha aumentato il punteggio. COST è una stima del prezzo di listino delle chiamate al modello, e NOTES mostra la spiegazione del grader con il peso più alto che fallisce, o l’errore dell’esecuzione, dal with-arm.4
Apri il rapporto e itera
Apri l’URL Sostituisci
Published:, o il percorso Report: quando non appare una linea Published:, per vedere il verdetto di ogni grader e la spiegazione per ogni esecuzione, e per i grader llm i voti del judge e l’estratto che ha valutato. La linea Published: appare solo quando il tuo account può pubblicare rapporti.Il risultato più comune della prima ricerca è un Δ vicino a zero con il grader tool_used: Skill del caso che fallisce, il che significa che Claude non sta scegliendo la tua skill sulla formulazione naturale. Regola la description della skill, esegui di nuovo claude plugin eval ., e confronta.Per iterare su un caso in modo economico, esegui un singolo arm una volta. Un’esecuzione singola è rumorosa, quindi conferma qualsiasi modifica alle tre esecuzioni predefinite prima di fidarti. Con un arm la tabella mostra colonne SCORE e PASS% invece di WITH, W/OUT, e Δ:<case-name> con uno dei nomi di directory sotto evals/.Scrivi e perfeziona i casi
I casi checlaude plugin eval init scrive sono file semplici che puoi aprire, modificare e aggiungere. Un caso è una directory sotto la directory eval del plugin che contiene un prompt.md, un case.yaml, o entrambi. Per raggruppare i casi, annidali sotto una directory che non è essa stessa un caso; qualsiasi cosa dentro una directory di caso, come graders/ e file fixture, appartiene a quel caso.
Questo è il layout che claude plugin eval init scrive e quello da usare per le nuove suite. Il riferimento della suite di eval ha l’albero completo, inclusi mock e risultati:
Scrivi un caso a mano
Avere Claude che scrive i casi conclaude plugin eval init è il percorso consigliato. Per scriverne uno tu stesso invece, inizia da un modello vuoto. Il seguente comando scrive un caso denominato first-case con un prompt.md segnaposto e un grader segnaposto, e non esegue nulla:
prompt.md scrivi il messaggio che Claude riceve in ogni esecuzione, e imposta i limiti dell’esecuzione e gli strumenti che il caso può usare nel suo frontmatter. Apri evals/first-case/prompt.md e sostituisci il corpo segnaposto con una richiesta che una delle tue skill dovrebbe gestire, formulata nel modo in cui un utente la digiterebbe piuttosto che nominare la skill. Questo esempio è per una skill che redige messaggi di commit; usa la tua richiesta:
graders/ è un controllo applicato dopo l’esecuzione. Apri evals/first-case/graders/criteria.md e sostituisci il segnaposto con una rubrica per il modello judge, scritta come condizioni PASS e FAIL concrete:
evals/first-case/graders/skill-fired.md, sostituendo your-skill-name con il name dal SKILL.md della tua skill:
plugin-name:skill-name con namespace. Tipi di grader elenca gli altri controlli disponibili, come la corrispondenza di una regex o la conferma che un file è stato creato.
Con entrambi i file salvati, esegui il caso nel modo in cui la guida rapida fa, con claude plugin eval . dalla root del plugin.
Imposta i limiti di esecuzione e gli strumenti in prompt.md
Impostamax_turns, timeout_seconds, model, tags di un caso, e gli allowed_tools che può usare nel frontmatter di prompt.md; il riferimento prompt.md frontmatter elenca ogni campo e il suo valore predefinito. Claude riceve il corpo esattamente come l’hai scritto. Le menzioni @path in esso non vengono espanse in allegati di file, quindi se Claude ha bisogno di leggere un file, concedi uno strumento per esso in allowed_tools.
Scegli e pesa i grader
Il frontmatter di un grader imposta il suotype, e opzionalmente un weight che lo fa contare per più del punteggio dell’esecuzione e un arm che controlla come viene valutato rispetto alla baseline. Dei sei tipi, regex, tool_used, tool_order, e file_exists vengono calcolati dalla trascrizione e dai file e non costano nulla, mentre llm e baseline chiamano un modello judge e si aggiungono al costo dell’esecuzione.
Non ci sono grader di codice personalizzato. Tipi di grader elenca il tipo di ogni, le opzioni e la condizione di passaggio, e cosa un grader può guardare elenca i valori che target e focus accettano.
Il judge per i grader llm e baseline è un modello piccolo e veloce per impostazione predefinita. Passa --judge-model sonnet o un ID modello completo per usarne uno più forte per le rubriche sfumate.
Scegli grader che danno un segnale stabile
Un graderllm chiede a un modello un verdetto, quindi la sua risposta può differire tra le esecuzioni, e differisce di più il testo più lungo che deve leggere. Queste abitudini mantengono i punteggi di una suite abbastanza stabili da fidarsi:
- Per output lungo come un file generato, valutalo con un grader
regexsui contenuti del file, che controlla l’intero file allo stesso modo ogni volta. Mantieni i graderllmper output brevi, con rubriche scritte come condizioni PASS e FAIL concrete. - Dai a ogni caso un grader sul risultato, come il messaggio finale o un file prodotto, e uno su come Claude ci è arrivato, come
tool_usedotool_order. Insieme ti dicono sia se la risposta era corretta che se il tuo plugin l’ha prodotta. - Se il grader
tool_used: Skilldi un caso passa maΔè negativo, sospetta il judge prima del plugin. Un modello judge piccolo può contrassegnare una risposta corretta come sbagliata perché è formattata diversamente da quello che la rubrica descrive. Riesegui con--judge-model sonnet, e stringi la rubrica in modo che la formattazione non decida il verdetto. - Per controllare che una build o un test sia passato dentro l’esecuzione, chiedi al prompt a Claude di eseguirlo e scrivere il risultato in un file, valuta quel file, e asserire che il comando è stato eseguito con un grader
tool_usedil cuiinput_matchnomina il comando.
Valuta rispetto alla baseline senza plugin
Quando un plugin è sotto test, ogni caso viene eseguito in due arm per impostazione predefinita. Il with-arm è le sue esecuzioni con il plugin caricato, e il without-arm è lo stesso numero di esecuzioni senza plugin. Il riepilogo e il rapporto mostrano entrambi i punteggi eΔ, il punteggio with-arm meno il punteggio without-arm. Passa --ablation none per eseguire solo il with-arm, che dimezza il costo quando non hai bisogno del confronto, come durante l’iterazione sui grader.
In un’esecuzione a due arm, alcuni grader vengono riportati con scored: false. Un controllo come “la skill è stata invocata” non può mai passare senza il plugin, quindi contarlo spingerebbe il without-arm verso zero e gonfierebbe Δ. Per mantenere i due arm comparabili, Claude Code esclude tali grader dal punteggio in entrambi gli arm e li riporta nel with-arm come indicatori pass/fail solo. Questo include:
- Ogni grader
tool_usedil cuitoolèSkill - Qualsiasi grader che contrassegni
arm: with-only
arm: both su un grader per valutarlo in entrambi gli arm indipendentemente, che è quello che vuoi per un controllo “non deve invocare la skill” con min: 0 e max: 0. Sotto --ablation none nulla viene escluso, quindi la stessa suite può produrre un punteggio assoluto diverso nei due modi.
Usa una directory eval diversa
Seevals/ è già presa da un altro strumento, mantieni la suite in una directory diversa. Puoi registrare quella directory nel plugin.json del plugin in modo che ogni esecuzione e ogni collaboratore la usi, o passarla sulla riga di comando per un’esecuzione singola:
- In
plugin.json: aggiungi"experimental": { "evals": "quality/evals" }. - Sulla riga di comando: passa
--eval-dir quality/evalssia aclaude plugin evalche aclaude plugin eval init.
qa o quality/evals; un percorso assoluto o uno contenente .. viene rifiutato: come valore di flag è un errore, mentre un valore di manifest inutilizzabile stampa una riga Warning: e l’esecuzione usa evals/ invece. I casi, i risultati, e l’output init si spostano tutti in quella directory.
Configurare fixture e mock
Un caso può richiedere più di un prompt: file o un repository git nell’area di lavoro, una conversazione precedente da continuare, o risposte dai server MCP con cui il vostro plugin comunica. Ognuno di questi viene configurato accanto al caso in modo che le esecuzioni rimangono ripetibili.Inizializzare l’area di lavoro o la conversazione
Ogni esecuzione inizia in un’area di lavoro vuota. Quando un caso ha bisogno di più del prompt, aggiungete uncase.yaml accanto a prompt.md con un blocco context.
Per creare file fixture o un repository git prima, scrivete uno script Bash nella directory del caso e nominate lo script in context.scaffold_script. Lo script viene eseguito come voi, al di fuori della sandbox dell’agente, e solo quando passate --scaffold, quindi passate questo flag solo per suite che voi o la vostra organizzazione avete scritto. Per continuare una conversazione precedente, salvate la trascrizione come file .jsonl e nominate lo file in context.history_file, e il prompt del caso diventa il turno utente successivo. Per permettere a Claude di leggere directory fixture nel caso durante l’esecuzione, elencatele in context.add_dirs.
Un case.yaml ha anche bisogno di schema_version: "1.1" e name; il riferimento case.yaml fields ha l’elenco completo.
Questo case.yaml inizializza un’area di lavoro da uno script e permette a Claude di leggere fixture da una directory resources/:
Mock dei server MCP
Potete valutare un plugin le cui skill chiamano tool MCP senza il servizio reale dietro di essi. Mettete un file Markdown per tool sottoevals/mocks/<server>/<tool>.md per l’intera suite, o sotto la directory mocks/ del caso stesso per un singolo caso, dove <server> è il nome del server nella configurazione MCP del vostro plugin.
Un’esecuzione non avvia mai i veri server MCP del vostro plugin a meno che non lo chiediate. Claude Code registra un sostituto sotto il nome di ogni server. I tool con un file mock rispondono da esso e sono consentiti senza una concessione --allow-tools, e un tool senza file mock non è disponibile per Claude. Un server senza alcun mock appare nella riga di progresso mocked: del caso come plugin_<plugin>_<server>[not started: no mock].
Il corpo del file è quello che il tool restituisce a Claude. Questo mock sostituisce un tool create_issue su un server denominato tracker, controlla l’input che Claude invia, e ripete il titolo. Salvate lo come evals/mocks/tracker/create_issue.md:
{{input.<field>}}, e il contenuto di un file fixture accanto al mock con {{file:fixtures/{input.<field>}.json}}. Il blocco expect: protegge l’input. Se una chiamata lo viola, l’esecuzione si interrompe con punteggio 0 e registra il motivo, in modo che un caso possa asserire cosa il vostro plugin ha chiesto al server di fare. Impostate error: true per restituire il corpo come errore di tool, oppure type: agent per far rispondere un modello piccolo come il server da istruzioni nel corpo. Il mock file reference elenca ogni chiave e i file _server.md e _tools.json.
Per valutare le chiamate stesse, puntate un grader a target: mock_calls.
Per eseguire contro i veri server MCP del plugin, passate uno di questi flag. In entrambi i casi questi processi vengono eseguiti come voi, al di fuori della sandbox dell’esecuzione, e i loro tool hanno bisogno di una concessione --allow-tools:
--allow-real-servers: avvia il processo reale per ogni server che non avete mockato, e continua a rispondere ai tool mockati dai loro file--mocks off: ignoramocks/completamente e avvia ogni server che il plugin dichiara
Riprodurre risposte mock dell’agente
Un mocktype: agent risponde con una chiamata al --judge-model, quindi il suo output varia tra le esecuzioni e cambia se cambiate il giudice. Quando un’esecuzione si completa senza errore o interruzione, Claude Code salva ogni risposta che un mock dell’agente ha dato sotto la directory dei risultati in mock-recordings/.
Aprite ADOPT.txt lì per vedere ogni registrazione e la directory .replay/<server>/ in cui copiarla, accanto al mock che l’ha prodotta. Dopo aver copiato una registrazione lì, le esecuzioni successive rispondono alla chiamata identica da essa senza alcuna chiamata al modello. Committete mocks/.replay/ insieme al resto di mocks/ in modo che le esecuzioni CI siano ripetibili.
Esegui evals
Una volta che una suite esiste,claude plugin eval la esegue. Scegli quale plugin e quali casi eseguire con l’argomento target, concedi qualsiasi strumento che i casi hanno bisogno oltre il set di sola lettura con --allow-tools, e controlla il conteggio delle esecuzioni, i modelli, il costo, e l’output con le altre opzioni.
Scegli cosa valutare
La maggior parte delle volte eseguiclaude plugin eval . dalla root del plugin, che esegue ogni caso nella suite con il plugin in cui stai caricato. Per eseguire un singolo file di caso, o per valutare un plugin che hai installato piuttosto che uno che stai sviluppando, passa un target diverso:
Aggiungi
--case <glob> per filtrare per nome di caso e --tag <tag> per mantenere i casi con uno qualsiasi dei tag dati. Metti il target prima di --tag, --allow-tools, e --json. I primi due prendono un elenco e --json prende un percorso opzionale, quindi ognuno di loro legge un target che segue come il suo valore proprio.
Concedi strumenti
Le esecuzioni non si fermano mai per chiedere il permesso. Gli strumenti incorporati che hanno bisogno di una concessione che non hai dato, comeBash, Write, Edit, WebFetch, e WebSearch, vengono rimossi dalla sessione, quindi Claude non può chiamarli affatto. L’allowlist è gli strumenti di sola lettura che il caso elenca in allowed_tools, da Read, Glob, Grep, NotebookRead, Skill, Agent, TodoWrite, e gli strumenti di task TaskCreate, TaskGet, TaskList, TaskUpdate, TaskStop, e TaskOutput, più quello che concedi con --allow-tools, che si applica a ogni caso nell’esecuzione. Per lasciare che i casi usino Bash, Write, Edit, WebFetch, o WebSearch, concedili tu stesso:
not granted. Gli strumenti su un server MCP mockato non hanno bisogno di concessione. Gli strumenti su un vero server MCP del plugin hanno bisogno sia del server avviato, con --allow-real-servers o --mocks off, che di una concessione per nome, come --allow-tools "mcp__plugin_my-plugin_github__*"; gli strumenti MCP di un plugin sono denominati mcp__plugin_<plugin>_<server>__<tool>.
Quando concedi Bash in qualsiasi forma, ogni comando viene eseguito sotto la sandbox a livello di OS di Claude Code. Le scritture sono confinate allo spazio di lavoro dell’esecuzione, la tua directory home e la configurazione di Claude Code sono illeggibili, e l’accesso alla rete è limitato ai domini che concedi con --allow-tools "WebFetch(domain:example.com)". Se concedi Bash o PowerShell su una macchina senza backend sandbox, Claude Code rifiuta ogni esecuzione piuttosto che eseguirla non confinata, e il caso mostra un errore di esecuzione e di solito ottiene un punteggio 0. Windows nativo non ha backend, quindi esegui le suite che concedono shell sotto WSL2; su Linux, installa prima bubblewrap e socat. Vedi i prerequisiti di sandboxing.
Opzioni di comando
Questa tabella copre le opzioni per il conteggio delle esecuzioni, i modelli, la valutazione, il costo, le concessioni di strumenti, i mock, e l’output. Eseguiclaude plugin eval --help per l’elenco completo, che include anche --case, --tag, --eval-dir, --no-scaffold, --report, e --verbose.
Esegui evals in CI
Nel tuo lavoro CI, esegui la suite con--json per scrivere il risultato per l’archiviazione, e fallisci la build sul codice di uscita. Passa --trust-plugin in modo che il lavoro non aspetti mai al primo prompt di fiducia, fissa entrambi i modelli in modo che i punteggi siano comparabili nel tempo, mantieni il rapporto locale, e imposta un limite di costo come limite superiore:
I problemi di scrittura o pubblicazione del rapporto HTML non cambiano mai il codice di uscita. Per vedere perché un caso ha ottenuto un punteggio basso, eseguilo localmente senza
--json in modo che le linee di progresso per caso e per grader vengano stampate.
Un runner CI ha bisogno di un’installazione di Claude Code e credenziali nell’ambiente come ANTHROPIC_API_KEY. Senza --trust-plugin, un lavoro la cui directory di checkout Claude Code non ha già fiducia è rifiutato con uscita 1 quando non ha terminale, o aspetta al prompt quando il runner ne alloca uno. claude plugin eval init ha bisogno di un terminale per farti le sue domande; in CI, esegui claude plugin eval init --bare <name> per ottenere il modello vuoto.
Per mantenere i costi prevedibili, dai alle suite di ogni cambio veloce solo grader che non chiamano un judge, usa --ablation none dove non hai bisogno di Δ, e lascia i documenti partial: true e le esecuzioni con skippedPaidGraders fuori da qualsiasi tendenza che grafici.
Leggi i risultati
Ogni esecuzione con almeno un caso scrive una directoryresults/<timestamp>/ dentro la directory eval, contenente aggregate-result.json e report.html. Per un target di percorso che è sotto il plugin; per un plugin che hai denominato, è sotto la tua directory corrente, come la tabella target mostra. La tabella di riepilogo, il JSON, e il rapporto rendono tutti gli stessi dati di risultato.
Rapporto HTML
report.html è un singolo file autonomo che non fa richieste esterne, quindi puoi allegarlo a un lavoro CI o aprirlo dal disco. Questo esempio è la parte superiore di un rapporto per un’esecuzione di suite a tre casi con --threshold 0.8; il costo mostrato è una stima al prezzo di listino e varia con il modello e il numero di casi:

- La linea di verdetto e i riquadri rispondono se il plugin ha aiutato in tutta la suite. Il punteggio della suite è la media dei punteggi con plugin per caso, Ablation Δ è quanto quella si trova sopra o sotto il punteggio di base, e Cases conta quanti hanno raggiunto la soglia. Perfect runs è la quota di esecuzioni con plugin dove ogni grader ha superato.
- Ogni scheda di caso mostra il
Δdel caso e il punteggio con plugin, con un segno sulla barra alla soglia. Un caso il cuiΔè negativo ottiene un bordo sinistro rosso, quindi le regressioni risaltano quando scorri. - All’interno di un caso, le esecuzioni con plugin vengono prima e le esecuzioni di base dopo. Ogni esecuzione elenca i suoi grader con un chip di passaggio o fallimento. Un grader fallito è già espanso con la sua spiegazione, e un grader
llmmostra anche i voti del giudice e le prove che gli sono state mostrate, che è dove scopri perché un’esecuzione ha ottenuto un punteggio basso. I grader che non contano verso il punteggio, cometool_used: Skill, portano un badgeplugin-fired indicator. - Prompt e Graders, sotto le esecuzioni, mostrano il prompt del caso e la rubrica o il modello di ogni grader, quindi qualcuno che legge il rapporto senza la suite può vedere cosa è stato chiesto e cosa è contato come buono.
Published: <url>. Passa --no-publish per mantenerlo locale. Se non appare una linea Published:, come con l’autenticazione con chiave API, il file locale è il rapporto.
Un’esecuzione che una sessione Claude Code ha avviato, come quando chiedi a Claude di eseguire la suite per te, rimane anche locale, e la sua linea Report: dice kept local. Aggiungi --publish-report a quel comando per pubblicarla.
Risultato JSON
aggregate-result.json, e l’output --json, è un documento versionato con schemaVersion: 1 per gli script CI da analizzare. I nomi dei campi sono camelCase e i nuovi campi vengono aggiunti senza rinominare quelli esistenti, quindi scrivi il tuo script per ignorare i campi che non riconosce.
Questi sono i campi che uno script di gating di solito legge. Il documento porta anche la configurazione della suite, ogni definizione di grader, e risultati di grader per esecuzione con spiegazioni e prove:
Cosa un’esecuzione può accedere
claude plugin eval carica le skill e gli hook del plugin target e esegue la sua suite di eval sulla tua macchina, come te. Puntare a un plugin è la stessa decisione di fiducia di claude --plugin-dir, quindi valuta solo i plugin di cui ti fidi. L’isolamento descritto in questa sezione limita quello che l’agente sotto test può raggiungere; non è un confine contro il codice del plugin stesso, e una suite che passa non dice nulla su se il plugin è sicuro.
Fidati della directory del plugin
La prima volta che eseguiclaude plugin eval rispetto a una directory, Claude Code chiede Trust this plugin directory? prima di caricare qualsiasi cosa da essa, a meno che non hai già accettato il prompt di fiducia lì in una sessione claude interattiva. All’interno di un repository git, rispondere sì fidati dell’intero repository, per le sessioni interattive anche. Quando stdin o stdout non è un terminale, o sotto --json, l’esecuzione non può chiedere ed è rifiutata con uscita 1; passa --trust-plugin per asserire la fiducia tu stesso, solo per un plugin che eseguiresti sulla tua macchina. Un target che nomini piuttosto che dai come percorso, significando un plugin installato o un plugin skills-directory, salta il prompt.
Alcune parti del plugin e della suite vengono eseguite solo quando passi il loro flag per quella esecuzione: uno scaffold_script di un caso con --scaffold, strumenti oltre il set di sola lettura con --allow-tools, e i veri server MCP del plugin con --allow-real-servers o --mocks off. Un allowed_tools di un caso e un frontmatter allowed-tools proprio di una skill non possono ampliare nessuno di loro. Quando il plugin spedisce hook che non hai scritto, o inizi i suoi veri server MCP, tratta i suoi punteggi come consultivi a meno che non l’hai eseguito in un ambiente isolato come un contenitore o runner CI, poiché gli hook e i server vengono eseguiti fuori dalla sandbox dell’agente e potrebbero toccare i file che i grader leggono.
Come le esecuzioni sono isolate
Ogni esecuzione ottiene una directory home, directory di lavoro, e configurazione di Claude Code monouso, e l’agente sotto test viene eseguito lì come processo figlioclaude -p con solo il tuo plugin caricato. Tieni a mente queste conseguenze quando scrivi i casi:
- Nulla di personale o a livello di progetto carica. Le tue impostazioni utente, gli hook, i file
CLAUDE.md, i server MCP, gli altri plugin installati, la memoria, e le skill sono assenti, e nessun.claude/o.mcp.jsoncon scope di progetto sopra la sandbox viene letto. La maggior parte del tuo ambiente shell è anche trattenuta; solo un allowlist e le variabiliEVAL_*raggiungono l’esecuzione. Se il plugin ha bisogno di setup, spediscilo nel plugin, crealo in unoscaffold_script, o passa le variabiliEVAL_*. - La politica gestita può ancora limitare un’esecuzione. Le restrizioni nelle impostazioni gestite che un amministratore ha distribuito alla macchina si applicano dentro un’esecuzione, quindi i risultati su una macchina gestita possono differire da una non gestita da quella politica.
- Lo strumento Artifact è spento. Una skill che pubblica un artifact può essere valutata solo su quello che produce prima di quel passaggio.
- Le definizioni del caso sono nascoste all’agente. Un’esecuzione non può leggere la directory eval, quindi Claude non può vedere il prompt del caso, i suoi grader, o i casi fratelli.
- Nessuna sandbox di rete al di fuori dei comandi shell. I comandi shell che concedi vengono eseguiti sotto le regole sandbox della rete. Una concessione
WebFetch(domain:…)raggiunge quel dominio direttamente, e gli hook del plugin stesso e qualsiasi vero server MCP che inizi possono raggiungere qualsiasi host.
Riferimento della suite di eval
Tutto quello che una suite di eval può contenere vive sotto la directory eval del plugin,evals/ a meno che non hai configurato un’altra. Questo albero mostra ogni file che claude plugin eval legge o scrive lì; solo prompt.md o case.yaml è richiesto per un caso per esistere:
prompt.md frontmatter
Il frontmatter diprompt.md accetta questi campi. Una chiave sconosciuta è un errore:
case.yaml fields
case.yaml descrive lo stesso caso in YAML e aggiunge i campi che puntano ad altri file. Richiede schema_version: "1.1" e name. I campi prompt.md description, tags, plugins, runs, e expected_outcome vanno al livello superiore; model, max_turns, timeout_seconds, allowed_tools, append_system_prompt, e env vanno sotto execution:. Quando entrambi i file esistono, il frontmatter di prompt.md sostituisce i campi corrispondenti di case.yaml, il corpo di prompt.md è il prompt, e graders/*.md vengono aggiunti dopo qualsiasi grader elencato in case.yaml.
Questi campi esistono solo in case.yaml:
Frontmatter del grader
Ogni file di grader sottograders/ prende queste chiavi nel frontmatter, più le opzioni per il suo tipo. Il nome del grader è il nome del file senza .md:
Cosa un grader può guardare
I graderregex prendono un target e i grader llm prendono un focus. Entrambi accettano gli stessi valori:
Tipi di grader
Ogni tipo di grader sotto elenca le sue opzioni e quando passa:File mock
Un file<tool>.md sotto mocks/<server>/ risponde a uno strumento. Il suo corpo è il risultato dello strumento, con sostituzioni {{input.<field>}} e {{file:fixtures/<name>}}. Il suo frontmatter accetta queste chiavi:
Due file opzionali si trovano accanto ai file dello strumento nella directory di un server:
_server.md: un singolo mocktype: agentche risponde a diversi strumenti, elencati nella sua chiave frontmattertools:. Un<tool>.mdper lo stesso strumento ha precedenza. Metti una guardiaexpect:sul singolo<tool>.md, non qui_tools.json: una rispostatools/listsalvata dal vero server, in modo che gli strumenti mockati portino le loro vere descrizioni e schemi di input invece di un placeholder permissivo
mocks/ propria di un caso usa lo stesso layout e sostituisce i file della suite file per file.
Risoluzione dei problemi
Questi sono i problemi che gli autori incontrano più spesso, chiavi su quello che vedi.“plugin eval is currently in early access”
La tua build precede la disponibilità generale del comando. Eseguiclaude update, poi esegui di nuovo il comando in una sessione fresca.
“plugin eval is currently unavailable”
Anthropic ha disattivato il comando lato server. Nulla sulla tua macchina lo riattiva; eseguiclaude update e riprova in una sessione fresca più tardi.
“is not a trusted plugin directory, and this run cannot stop to ask you about it”
Questa è la prima esecuzione rispetto a una directory di cui Claude Code non ha ancora fiducia, e non può chiedere perché stdin o stdout non è un terminale o hai passato--json. Esegui claude plugin eval <dir> una volta in un terminale e rispondi al prompt, o passa --trust-plugin se ti fidi del codice e della suite del plugin. Vedi Cosa un’esecuzione può accedere.
“No eval cases found”
Nessun<case>/prompt.md o <case>/case.yaml esiste sotto la directory eval in vigore, o i tuoi filtri --case e --tag non hanno corrisposto a nessun caso. Esegui dalla root del plugin, o esegui claude plugin eval init per creare una suite.
Il baseline arm mostra nessun plugin, o delta è zero
Se il riepilogo non ha colonnaW/OUT, o il caso fallisce con “ablation requested but no plugin resolved”, nessun plugin è stato trovato per il caso. Aggiungi plugins: ["../.."] al caso, dando il percorso dalla directory del caso alla directory del plugin.
Se il plugin è stato caricato e Δ è ancora vicino a zero con il tuo grader tool_used: Skill che fallisce, questo è di solito un risultato reale, significando che la description della skill non attiva sulla formulazione del prompt. Regola la descrizione e riesegui la stessa suite.
Tutto ottiene un punteggio zero sebbene i file corretti siano stati prodotti
I tuoi grader puntano afiles, l’elenco dei percorsi creati, quando intendevi i contenuti del file. Usa { source: file, path: <path> } come target o focus. Separatamente, file_exists conta solo i file creati durante l’esecuzione, quindi un file che lo scaffold ha creato o che Claude ha solo modificato è invisibile ad esso; valuta i suoi contenuti, o usa tool_used su Edit.
Una regex sulla traccia non corrisponde al testo che posso vedere
Iltarget predefinito è last_message, non la traccia. Quando fai il target trace, è JSON per riga, quindi le virgolette appaiono come \". Le regex usano la sintassi JavaScript, quindi metti i in flags piuttosto che scrivere (?i).
Gli strumenti vengono negati, gli strumenti MCP mancano, o Bash non verrà eseguito
Qualsiasi cosa oltre il set di sola lettura ha bisogno della tua concessione, come--allow-tools Bash Write. I tuoi server MCP personali non caricano mai in un’esecuzione. I server del plugin stesso non si avviano a meno che non opti per esso, e i loro strumenti hanno quindi bisogno anche di una concessione --allow-tools "mcp__plugin_<plugin>_<server>__*"; uno strumento mockato non ha bisogno di nessuno dei due.
L’esecuzione esce 1 ma i risultati sembrano bene
Il--threshold predefinito è 1.0, quindi il comando esce 1 quando qualsiasi caso ottiene un punteggio inferiore a perfetto. Imposta una soglia che corrisponda al tuo bar. L’uscita 1 copre anche un file di caso che non è stato caricato, che viene riportato su stderr sopra la tabella.
“—json output path must end in .json”
Hai messo il target dopo--json, quindi è stato letto come il percorso di output. Metti il target per primo, come in claude plugin eval . --json, o dai a --json un percorso .json esplicito.
Un grader mostra passed: false sotto un’esecuzione che ha ottenuto un punteggio 1.0
Quel grader è escluso dal punteggio per design in un’esecuzione a due arm, e il suo camposcored è false. Vedi Confrontare con una baseline senza plugin.
Le esecuzioni falliscono con un errore di limite di utilizzo o limite di velocità a metà strada
Se il tuo account raggiunge il limite di utilizzo del piano o un limite di velocità API mentre una suite è in esecuzione, ogni esecuzione successiva termina con quell’errore, viene valutata su quello che ha prodotto, e di solito ottiene un punteggio 0. La suite finisce comunque e non è contrassegnatapartial, quindi il risultato può sembrare una regressione. Controlla la colonna NOTES o cases[].arms.with[].error nel JSON per il messaggio di limite prima di fidarti dei punteggi, poi riesegui dopo che il limite si ripristina, con --runs 1 o un filtro --case se hai bisogno di rimanere sotto di esso.
Le esecuzioni scadono o colpiscono il limite di turni
I predefiniti sono 10 turni e 300 secondi. Aumentamax_turns e timeout_seconds nel caso per compiti che hanno bisogno di più, e usa --max-cost-usd come limite di costo piuttosto che limiti stretti per esecuzione.
Vedi anche
- Creare plugin: costruisci il plugin che stai testando, e caricalo con
--plugin-dirdurante lo sviluppo - Riferimento dei plugin: le voci di comando
plugin evaleplugin eval inite la chiaveexperimental.evalsdel manifesto - Skills: come la descrizione di una skill decide quando Claude la invoca, che è quello che un caso che controlla se la skill si attiva sta misurando
- Sandboxing: la sandbox a livello di OS che si applica quando concedi Bash a un’esecuzione
- Creare e distribuire un marketplace di plugin: pubblica il plugin una volta che la sua suite passa