mastra-ai/mastra · error · MastraError

RUN_EXPERIMENT_FAILED_NO_DATA_PROVIDED

RUN_EXPERIMENT_FAILED_NO_DATA_PROVIDED

Error message

Failed to run experiment: Data array is empty

What it means

`validateEvalsInputs` (called by `runEvals`) requires a non-empty dataset before launching an experiment. If the `data` array has length 0, a MastraError with id RUN_EXPERIMENT_FAILED_NO_DATA_PROVIDED (category USER) is thrown. Running an eval on zero examples would produce an empty experiment, so the library refuses up front.

Source

Thrown at packages/core/src/evals/run/index.ts:675

}

function isAgentScorerConfig(scorers: any): scorers is AgentScorerConfig {
  return (
    typeof scorers === 'object' &&
    !Array.isArray(scorers) &&
    ('agent' in scorers || ('trajectory' in scorers && !('workflow' in scorers) && !('steps' in scorers)))
  );
}

function validateEvalsInputs(
  data: RunEvalsDataItem<any>[],
  scorers: MastraScorer<any, any, any, any>[] | WorkflowScorerConfig | AgentScorerConfig,
  target: Agent | Workflow,
  gates?: MastraScorer<any, any, any, any>[],
): void {
  const hasGates = !!gates && gates.length > 0;
  if (data.length === 0) {
    throw new MastraError({
      domain: 'SCORER',
      id: 'RUN_EXPERIMENT_FAILED_NO_DATA_PROVIDED',
      category: 'USER',
      text: 'Failed to run experiment: Data array is empty',
    });
  }

  // Tracks whether any data item carries per-turn gates/scorers, which (like
  // top-level scorers/gates) satisfies the "at least one scorer or gate" rule.
  let hasAnyTurnAssertions = false;

  for (let i = 0; i < data.length; i++) {
    const item = data[i];
    if (!item || typeof item !== 'object' || (!('input' in item) && !('inputs' in item) && !('turns' in item))) {
      throw new MastraError({
        domain: 'SCORER',
        id: 'INVALID_DATA_ITEM',
        category: 'USER',

View on GitHub (pinned to 75dd419e61)

Solutions

  1. Pass a non-empty `data` array to runEvals — check `data.length > 0` before calling
  2. Fix the upstream data-loading query/file so it actually returns rows
  3. Log the dataset size right after loading to catch silently-empty sources
  4. Fail fast in CI with an explicit assertion that the eval dataset exists

Example fix

// before
await mastra.runEvals({ data: loaded.filter(x => x.skip !== true), scorers, target });
// after
const data = loaded.filter(x => x.skip !== true);
if (data.length === 0) throw new Error('Eval dataset is empty: check data file/query');
await mastra.runEvals({ data, scorers, target });
Defensive patterns

Strategy: validation

Validate before calling

function assertNonEmptyDataset(data) {
  if (!Array.isArray(data) || data.length === 0) {
    throw new Error('runEvals requires a non-empty data array');
  }
}
assertNonEmptyDataset(data);
await mastra.runEvals({ data, scorers, target });

Try / catch

try {
  await mastra.runEvals({ data, scorers, target });
} catch (e) {
  if (e instanceof MastraError && e.id === 'RUN_EXPERIMENT_FAILED_NO_DATA_PROVIDED') {
    console.error('Eval data was empty — check the loader/query that produced the dataset');
  } else throw e;
}

Prevention

When it happens

Trigger: Calling `mastra.runEvals({ data: [], scorers, target })` (or equivalent run-experiment API) with an empty array; a data-loading step that filtered out all rows before the call.

Common situations: Loading eval data from a file/DB whose filter matched nothing (wrong path, stale table, wrong date range); slicing or paginating data incorrectly; building the dataset conditionally so it can be empty in CI; JSONL/CSV parse failures swallowed upstream resulting in zero items.

Related errors


AI-assisted analysis of mastra-ai/mastra@75dd419e61 (2026-08-30). Data as JSON: /api/errors/d24fda025224ec90. Report an issue: GitHub.