Skip to main content

MastraScorer

The MastraScorer class is the base class for all scorers in Mastra. It provides a standard .run() method for evaluating input/output pairs and supports multi-step scoring workflows with preprocess → analyze → generateScore → generateReason execution flow.

Note: Most users should use createScorer to create scorer instances. Direct instantiation of MastraScorer is not recommended.

How to Get a MastraScorer Instance

Use the createScorer factory function, which returns a MastraScorer instance:

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

.run() Method

The .run() method is the primary way to execute your scorer and evaluate input/output pairs. It processes the data through your defined steps (preprocess → analyze → generateScore → generateReason) and returns a comprehensive result object with the score, reasoning, and intermediate results.

const result = await scorer.run({
input: "What is machine learning?",
output: "Machine learning is a subset of artificial intelligence...",
runId: "optional-run-id",
runtimeContext: {
/* optional context */
},
});

.run() Input

input:

any
Input data to be evaluated. Can be any type depending on your scorer's requirements.

output:

any
Output data to be evaluated. Can be any type depending on your scorer's requirements.

runId:

string
Optional unique identifier for this scoring run.

runtimeContext:

any
Optional runtime context from the agent or workflow step being evaluated.

groundTruth:

any
Optional expected or reference output for comparison during scoring. Automatically passed when using runExperiment.

.run() Returns

runId:

string
The unique identifier for this scoring run.

score:

number
Numerical score computed by the generateScore step.

reason:

string
Explanation for the score, if generateReason step was defined (optional).

preprocessStepResult:

any
Result of the preprocess step, if defined (optional).

analyzeStepResult:

any
Result of the analyze step, if defined (optional).

preprocessPrompt:

string
Preprocess prompt, if defined (optional).

analyzePrompt:

string
Analyze prompt, if defined (optional).

generateScorePrompt:

string
Generate score prompt, if defined (optional).

generateReasonPrompt:

string
Generate reason prompt, if defined (optional).

Step Execution Flow

When you call .run(), the MastraScorer executes the defined steps in this order:

  1. preprocess (optional) - Extracts or transforms data
  2. analyze (optional) - Processes the input/output and preprocessed data
  3. generateScore (required) - Computes the numerical score
  4. generateReason (optional) - Provides explanation for the score

Each step receives the results from previous steps, allowing you to build complex evaluation pipelines.

Usage Example

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."

Integration

MastraScorer instances can be used for agents and workflow steps

See the createScorer reference for detailed information on defining custom scoring logic.