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
- Check experiment.targetType before running; if null, use submitExperimentResult instead
- Create a new experiment with a target (targetType/targetId) if you want Mastra to execute items
- 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
- Track experiment mode (targeted vs targetless) in your runner config
- Branch on experiment.targetType before choosing run vs submit APIs
- Avoid sharing one experiment id between external pipelines and local runs
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
- EXPERIMENT_HAS_TARGET
- EXPERIMENT_ALREADY_FINALIZED
- EXPERIMENTS_STORE_NOT_AVAILABLE
- DATASET_ITEM_NOT_FOUND
- Storage not configured. Configure storage in Mastra instance
AI-assisted analysis of mastra-ai/mastra@75dd419e61 (2026-08-30).
Data as JSON: /api/errors/69c16926dbeef74c.
Report an issue: GitHub.