mastra-ai/mastra · error · Error
Dataset not found: ${args.datasetId}
Error message
Dataset not found: ${args.datasetId} What it means
InMemory storage's _doAddItem() fetches the dataset by args.datasetId and throws this plain Error if missing, before bumping the dataset version and inserting the SCD-2 row. Normally batchInsertItems() already verified existence, so this fires when the dataset vanishes between the base-class check and the subclass mutation, or when _doAddItem is reached with a stale/foreign datasetId.
Source
Thrown at packages/core/src/storage/domains/datasets/inmemory.ts:236
const end = perPageInput === false ? datasets.length : start + perPage;
return {
datasets: datasets.slice(start, end).map(toDatasetRecord),
pagination: {
total: datasets.length,
page,
perPage: perPageForResponse,
hasMore: perPageInput === false ? false : datasets.length > end,
},
};
}
// --- SCD-2 item mutations ---
protected async _doAddItem(args: AddDatasetItemInput): Promise<DatasetItem> {
const dataset = this.db.datasets.get(args.datasetId);
if (!dataset) {
throw new Error(`Dataset not found: ${args.datasetId}`);
}
// Bump version (T3.7, T3.26 — only bumps version, not updatedAt)
const newVersion = dataset.version + 1;
this.db.datasets.set(args.datasetId, { ...dataset, version: newVersion });
const now = new Date();
const id = crypto.randomUUID();
const row: DatasetItemRow = {
id,
datasetId: args.datasetId,
datasetVersion: newVersion,
externalId: args.externalId ?? null,
// Tenancy inherited from parent dataset (Option B — never settable per item)
organizationId: dataset.organizationId ?? null,
projectId: dataset.projectId ?? null,
validTo: null,
isDeleted: false,View on GitHub (pinned to 75dd419e61)
Solutions
- Create the dataset first (createDataset) or confirm getDatasetById({id: datasetId}) returns a row.
- Check for concurrent deleteDataset calls racing with item inserts; serialize mutations per dataset.
- Use a persistent storage adapter if the process restarts between creating datasets and adding items.
- Fix tenancy filters so they match the dataset's stored organizationId/projectId.
Example fix
// before
await storage.datasets.addItems({ datasetId: 'ds', items: [item] });
// after
const ds = await storage.datasets.getDatasetById({ id: 'ds' });
if (!ds) throw new Error(`Create dataset 'ds' before adding items`);
await storage.datasets.addItems({ datasetId: 'ds', items: [item] }); Defensive patterns
Strategy: validation
Validate before calling
const ds = await storage.datasets.getDatasetById({ id: datasetId });
if (!ds) throw new Error(`Dataset '${datasetId}' must exist before adding items`); Type guard
function datasetExists(ds: Awaited<ReturnType<typeof storage.datasets.getDatasetById>>): ds is NonNullable<typeof ds> {
return ds !== null;
} Try / catch
try {
await storage.datasets.addItems({ datasetId, items });
} catch (e) {
if (e instanceof Error && e.message.startsWith('Dataset not found:')) {
await storage.datasets.createDataset({ id: datasetId, name: datasetId });
await storage.datasets.addItems({ datasetId, items });
} else throw e;
} Prevention
- Create the dataset before any item inserts; bootstrap it in setup code.
- Avoid deleteDataset racing with concurrent item inserts.
- Use persistent storage if datasets/items must outlive the process.
When it happens
Trigger: addItems()/batchInsertItems() on an InMemory store where the datasetId does not exist, was deleted concurrently, or tenancy filters removed the row after the base check.
Common situations: Inserting items into a dataset after a concurrent deleteDataset, restart-erased InMemory state, or test scaffolding that never created the dataset.
Related errors
- Dataset not found: ${args.id}
- Item not found: ${args.id}
- DATASET_NOT_FOUND
- Agent with id ${id} not found
- Dataset not found: ${args.id}
AI-assisted analysis of mastra-ai/mastra@75dd419e61 (2026-08-30).
Data as JSON: /api/errors/b6d7f438504689c2.
Report an issue: GitHub.