MastraScorer
La classe MastraScorer est la classe de base de tous les Scorers de Mastra. Elle fournit une méthode .run() standard permettant d'évaluer des paires entrée/sortie et prend en charge les workflows de scoring en plusieurs étapes avec le flux d'exécution preprocess → analyze → generateScore → generateReason.
La plupart des utilisateurs devraient employer createScorer pour créer des instances de Scorer. Il est déconseillé d'instancier directement MastraScorer.
Obtenir une instance de MastraScorerLien direct vers how-to-get-a-mastrascorer-instance
Utilisez la fonction de fabrique createScorer, qui renvoie une instance de MastraScorer :
import { createScorer } from '@mastra/core/evals'
const scorer = createScorer({
name: 'My Custom Scorer',
description: 'Evaluates responses based on custom criteria',
}).generateScore(({ run, results }) => {
// scoring logic
return 0.85
})
// scorer is now a MastraScorer instance
Méthode .run()Lien direct vers run-method
La méthode .run() est le principal moyen d'exécuter votre Scorer et d'évaluer des paires entrée/sortie. Elle traite les données à travers les étapes que vous avez définies (preprocess → analyze → generateScore → generateReason) et renvoie un objet de résultat détaillé contenant le score, sa justification et les résultats intermédiaires.
const result = await scorer.run({
input: 'What is machine learning?',
output: 'Machine learning is a subset of artificial intelligence...',
runId: 'optional-run-id',
requestContext: {/* optional context */},
})
Entrée de .run()Lien direct vers run-input
input:
output:
runId:
requestContext:
groundTruth:
Valeur renvoyée par .run()Lien direct vers run-returns
runId:
score:
reason:
preprocessStepResult:
analyzeStepResult:
preprocessPrompt:
analyzePrompt:
generateScorePrompt:
generateReasonPrompt:
judge:
Résultats du jugeLien direct vers Résultats du juge
L'enregistrement facultatif judge contient des informations sur les appels du modèle juge effectués par les étapes du Scorer fondées sur un prompt. Ses clés connues sont preprocess, analyze, generateScore et generateReason. Chaque clé contient un tableau executions ordonné.
interface ScorerJudgeExecutionBase {
prompt: string
judgeModelId: string
judgeProvider?: string
attemptCount: number
modelCallCount: number
durationMs: number
}
interface ScorerJudgeExecutionSuccess extends ScorerJudgeExecutionBase {
status: 'success'
output: JSONValue
usage: ScorerJudgeUsage
cost?: {
amount: number
unit: string
source: string
}
}
interface ScorerJudgeExecutionFailure extends ScorerJudgeExecutionBase {
status: 'failed'
output?: JSONValue
rawOutput?: string
usage?: ScorerJudgeUsage
finishReason?: string
error: {
name: string
message: string
code?: string
}
}
type ScorerJudgeExecution = ScorerJudgeExecutionSuccess | ScorerJudgeExecutionFailure
interface ScorerJudgeUsage {
inputTokens?: number
outputTokens?: number
totalTokens?: number
reasoningTokens?: number
cachedInputTokens?: number
cacheCreationInputTokens?: number
}
type ScorerJudgeResults = Partial<
Record<
'preprocess' | 'analyze' | 'generateScore' | 'generateReason',
{ executions: ScorerJudgeExecution[] }
>
>
Utilisez la clé de l'étape pour accéder aux détails de l'exécution du juge :
const execution = result.judge?.generateScore?.executions[0]
console.log(execution?.status)
console.log(execution?.judgeModelId)
console.log(execution?.usage?.totalTokens)
console.log(execution?.durationMs)
La valeur status décrit le résultat de l'exécution logique de l'étape de prompt, et non la qualité de la réponse évaluée. Une solution de repli pour sortie structurée qui finit par réussir crée une exécution success avec un attemptCount supérieur à un. Lorsque toutes les tentatives sont épuisées, une exécution failed est créée.
Les exécutions réussies nécessitent un output validé et une valeur usage normalisée. Les exécutions en échec nécessitent un résumé error et incluent uniquement les éléments reçus par l'environnement d'exécution. Une exécution en échec inclut output uniquement lorsque la sortie a été validée avant un échec ultérieur du callback ou de l'orchestration. Mastra n'analyse pas rawOutput pour créer output.
attemptCount compte les appels du juge, y compris une solution de repli pour sortie structurée. modelCallCount compte les étapes du modèle terminées sur l'ensemble de ces tentatives. durationMs couvre l'exécution complète de l'étape de prompt.
Les étapes de fonction ne créent pas d'entrées judge. L'utilisation consignée dans cet enregistrement appartient au modèle juge du Scorer, et non à l'agent ou au workflow évalué. Filtrez selon status lors de l'agrégation des exécutions réussies. Incluez les deux états lors de l'agrégation de toute l'utilisation terminée du Provider. Le champ facultatif cost est présent uniquement dans les exécutions réussies qui indiquent directement un coût, une source et une unité faisant autorité.
Utilisez les métriques Mastra pour interroger l'utilisation agrégée, la latence et le coût estimé sur plusieurs exécutions de Scorers. L'enregistrement judge décrit une seule exécution de Scorer et n'interroge ni les métriques ni les traces.
Exécutions en échecLien direct vers Exécutions en échec
L'échec d'une étape du Scorer rejette toujours la promesse .run(). Interceptez ScorerRunError afin d'examiner les étapes terminées et les éventuels résultats qu'elles ont produits :
import { ScorerRunError } from '@mastra/core/evals'
try {
const result = await scorer.run({ input, output })
console.log(result.score)
} catch (error) {
if (error instanceof ScorerRunError) {
console.log(error.failedStep)
console.log(error.completedSteps)
console.log(error.result?.score)
const failedExecution = error.result?.judge?.[error.failedStep]?.executions.find(
execution => execution.status === 'failed',
)
console.log(failedExecution?.error)
}
throw error
}
ScorerRunError expose les propriétés suivantes :
failedStep:
completedSteps:
result:
L'instantané result contient les sorties des étapes terminées et les éléments d'exécution du juge. Par exemple, si generateReason échoue après que generateScore a renvoyé 0, error.result.score vaut 0, l'exécution generateScore possède status: 'success' et l'exécution generateReason possède status: 'failed'. L'exécution reste en échec.
L'échec d'un prompt peut créer error.result avec uniquement l'identité de l'exécution, l'entrée et une entrée judge en échec. Une étape de fonction qui échoue avant de produire un champ du Scorer ne crée pas de résultat.
JSON.stringify(error) utilise la sérialisation standard de MastraError et omet result, y compris les éléments du juge réussis et en échec. Lisez explicitement result lorsque vous avez besoin des artefacts du Scorer ou de la sortie brute en échec.
Le résultat en mémoire d'une expérience peut conserver un score ou une justification terminés provenant d'un Scorer en échec, ainsi que error, failedStep et completedSteps. Le Scorer est toujours considéré comme étant en échec et un score récupéré n'est pas écrit dans l'ancien stockage des scores réussis.
Flux d'exécution des étapesLien direct vers Flux d'exécution des étapes
Lorsque vous appelez .run(), MastraScorer exécute les étapes définies dans l'ordre suivant :
- preprocess (facultatif) : extrait ou transforme les données
- analyze (facultatif) : traite l'entrée, la sortie et les données prétraitées
- generateScore (requis) : calcule le score numérique
- generateReason (facultatif) : fournit une explication du score
Chaque étape reçoit les résultats des étapes précédentes, ce qui vous permet de créer des pipelines d'évaluation complexes.
Exemple d'utilisationLien direct vers Exemple d'utilisation
const scorer = createScorer({
name: 'Quality Scorer',
description: 'Evaluates response quality',
})
.preprocess(({ run }) => {
// Extract key information
return { wordCount: run.output.split(' ').length }
})
.analyze(({ run, results }) => {
// Analyze the response
const hasSubstance = results.preprocessStepResult.wordCount > 10
return { hasSubstance }
})
.generateScore(({ results }) => {
// Calculate score
return results.analyzeStepResult.hasSubstance ? 1.0 : 0.0
})
.generateReason(({ score, results }) => {
// Explain the score
const wordCount = results.preprocessStepResult.wordCount
return `Score: ${score}. Response has ${wordCount} words.`
})
// Use the scorer
const result = await scorer.run({
input: 'What is machine learning?',
output: 'Machine learning is a subset of artificial intelligence...',
})
console.log(result.score) // 1.0
console.log(result.reason) // "Score: 1.0. Response has 12 words."
IntégrationLien direct vers Intégration
Les instances de MastraScorer peuvent être utilisées pour les agents et les étapes de workflows.
Consultez la référence createScorer pour en savoir plus sur la définition d'une logique de scoring personnalisée.