mastra-ai/mastra · error · MastraError

EXPERIMENT_HAS_NO_TARGET

EXPERIMENT_HAS_NO_TARGET

Error message

Experiment ${args.experimentId} has no target; ingest results via submitExperimentResult instead

What it means

runExperimentItem executes the bound target (agent/tool/workflow) for one dataset item, so it requires the experiment to have a target. If the experiment was created as targetless (targetType null) — meaning results are supplied externally — Mastra refuses to run anything and directs you to submitExperimentResult.

Source

Thrown at packages/core/src/datasets/dataset.ts:827

   * Built for caller-driven loops (mode 2): a durable orchestrator (e.g. a
   * Temporal workflow) fans out one call per item and owns retries/timeouts —
   * a retried call converges on the same row. Requires an experiment created
   * with a target via {@link Dataset.createExperiment}.
   *
   * Scorer precedence: experiment `scorers` → item `scorerIds` → dataset
   * `scorerIds` → none.
   */
  async runExperimentItem(args: {
    experimentId: string;
    itemId: string;
    /** Zero-based repetition index for repeated trials. Defaults to `0`. */
    attempt?: number;
    /** Request context merged with the item's own request context (item wins). */
    requestContext?: Record<string, unknown>;
  }): Promise<{ result: ExperimentResult; scores: Awaited<ReturnType<typeof executeExperimentItem>>['scores'] }> {
    const experiment = await this.#getOwnedExperiment(args.experimentId);
    if (experiment.targetType === null) {
      throw new MastraError({
        id: 'EXPERIMENT_HAS_NO_TARGET',
        text: `Experiment ${args.experimentId} has no target; ingest results via submitExperimentResult instead`,
        domain: 'STORAGE',
        category: 'USER',
      });
    }
    if (experiment.status === 'completed' || experiment.status === 'failed') {
      throw new MastraError({
        id: 'EXPERIMENT_ALREADY_FINALIZED',
        text: `Experiment ${args.experimentId} is already ${experiment.status}; no further items can be run`,
        domain: 'STORAGE',
        category: 'USER',
      });
    }

    const datasetsStore = await this.#getDatasetsStore();
    const dataset = await datasetsStore.getDatasetById({ id: this.id, filters: this.#scope });
    const item = await datasetsStore.getItemById({

View on GitHub (pinned to 75dd419e61)

Solutions

  1. Check experiment.targetType before running; if null, use submitExperimentResult instead
  2. Create a new experiment with a target (targetType/targetId) if you want Mastra to execute items
  3. Route external results through submitExperimentResult in your pipeline code

Example fix

// before
await dataset.runExperimentItem({ experimentId: 'exp-1', itemId: 'item-9' }); // exp-1 is targetless
// after
const exp = await getExperiment('exp-1');
if (exp.targetType === null) {
  await dataset.submitExperimentResult({ experimentId: 'exp-1', itemId: 'item-9', result: myResult });
}
Defensive patterns

Strategy: validation

Validate before calling

const exp = await getExperimentById(experimentId);
if (!exp || exp.targetType === null) throw new Error('Experiment is targetless; use submitExperimentResult');

Type guard

function hasTarget(exp) { return exp !== null && exp.targetType !== null && exp.targetId !== null; }

Try / catch

try {
  await dataset.runExperimentItem(args);
} catch (e) {
  if (isMastraError(e) && e.id === 'EXPERIMENT_HAS_NO_TARGET') {
    await dataset.submitExperimentResult({ experimentId: args.experimentId, ... });
  } else throw e;
}

Prevention

When it happens

Trigger: Calling dataset.runExperimentItem({ experimentId, itemId }) on an experiment created with no target (targetType null), typically one populated via submitExperimentResult from an external evaluation pipeline.

Common situations: Mixing the two execution models: an external harness created the experiment, then a developer tries to run it locally; a helper script reuses an experiment id that happened to be created targetless; refactoring moved from Mastra-driven to external evaluation without updating callers.

Related errors


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