mastra-ai/mastra · error · Error

`retrieval: { vector: true }` requires an embedder. Pass an

Error message

`retrieval: { vector: true }` requires an embedder. Pass an `embedder` option to your Memory instance.

What it means

`retrieval: { vector: true }` performs embedding-based semantic retrieval, which requires both a vector store and an embedder. After confirming a vector store exists, the Memory constructor checks `this.embedder` and throws if none was supplied, since observations cannot be embedded for retrieval without one.

Source

Thrown at packages/memory/src/index.ts:509

        // and someone bumps @mastra/memory without bumping @mastra/core the defaults wouldn't exist yet
        enabled: false,
        template: this.defaultWorkingMemoryTemplate,
      },
      observationalMemory: config.options?.observationalMemory as ObservationalMemoryOptions | boolean | undefined,
    });
    this.assertWorkingMemoryStateSignalsCompatibility(mergedConfig);
    this.threadConfig = mergedConfig;

    // Validate retrieval vector config at construction time
    const omConfig = normalizeObservationalMemoryConfig(mergedConfig.observationalMemory);
    if (omConfig?.retrieval && typeof omConfig.retrieval === 'object' && omConfig.retrieval.vector) {
      if (!this.vector) {
        throw new Error(
          '`retrieval: { vector: true }` requires a vector store. Pass a `vector` option to your Memory instance.',
        );
      }
      if (!this.embedder) {
        throw new Error(
          '`retrieval: { vector: true }` requires an embedder. Pass an `embedder` option to your Memory instance.',
        );
      }
    }
    if (omConfig?.experimental_subconscious) {
      if (!this.vector) {
        throw new Error('Subconscious semantic knowledge requires a vector store. Pass a `vector` option to Memory.');
      }
      if (!this.embedder) {
        throw new Error('Subconscious semantic knowledge requires an embedder. Pass an `embedder` option to Memory.');
      }
    }
  }

  private async getKnowledgeStore(): Promise<KnowledgeStorage> {
    const store = await this.storage.getStore('knowledge');
    if (!store) {
      throw new Error(`Knowledge storage domain is not available on ${this.storage.constructor.name}`);

View on GitHub (pinned to 75dd419e61)

Solutions

  1. Pass an `embedder` option (e.g. `new FastEmbed(...)` or an OpenAI embedding model wrapper) to the Memory constructor
  2. If embeddings are not needed, disable `retrieval.vector`
  3. Confirm the embedder is constructed with valid credentials/model config

Example fix

// before
new Memory({ vector: new LibSQLVector({ connectionUrl: url }), options: { observationalMemory: { retrieval: { vector: true } } } })
// after
new Memory({ vector: new LibSQLVector({ connectionUrl: url }), embedder: new FastEmbed(), options: { observationalMemory: { retrieval: { vector: true } } } })
Defensive patterns

Strategy: validation

Validate before calling

if (memoryOptions.options?.observationalMemory?.retrieval?.vector && !memoryOptions.embedder) {
  throw new Error('retrieval.vector=true requires an embedder option on Memory');
}

Try / catch

try {
  const memory = new Memory(opts);
} catch (err) {
  if (err instanceof Error && err.message.includes('requires an embedder')) {
    // add an embedder instance and rebuild Memory
  } else throw err;
}

Prevention

When it happens

Trigger: Creating Memory with `observationalMemory.retrieval.vector: true` and a `vector` option but no `embedder` option in the Memory constructor.

Common situations: Adding a vector store but forgetting the embedder (they are configured as separate options); assuming the model used for the agent doubles as the embedder; upgrading Memory and enabling retrieval without reviewing all required options.

Related errors


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