{"record":{"id":"26a36099ce6f609f","repo":"mastra-ai/mastra","slug":"semantic-recall-requires-an-embedder-to-be-configu","errorCode":null,"errorMessage":"Semantic recall requires an embedder to be configured.\n\nhttps://mastra.ai/en/docs/memory/semantic-recall","messagePattern":"Semantic recall requires an embedder to be configured\\.\n\nhttps://mastra\\.ai/en/docs/memory/semantic-recall","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/core/src/memory/memory.ts","lineNumber":181,"sourceCode":"      );\n    }\n    if (config.storage) {\n      this._storage = augmentWithInit(config.storage);\n      this._hasOwnStorage = true;\n    }\n\n    if (this.threadConfig.semanticRecall) {\n      if (!config.vector) {\n        throw new Error(\n          `Semantic recall requires a vector store to be configured.\n\nhttps://mastra.ai/en/docs/memory/semantic-recall`,\n        );\n      }\n      this.vector = config.vector;\n\n      if (!config.embedder) {\n        throw new Error(\n          `Semantic recall requires an embedder to be configured.\n\nhttps://mastra.ai/en/docs/memory/semantic-recall`,\n        );\n      }\n\n      // Convert string embedder to ModelRouterEmbeddingModel\n      if (typeof config.embedder === 'string') {\n        this.embedder = new ModelRouterEmbeddingModel(config.embedder);\n      } else {\n        this.embedder = config.embedder;\n      }\n\n      // Set embedder options (e.g., providerOptions for Google models)\n      if (config.embedderOptions) {\n        this.embedderOptions = config.embedderOptions;\n      }\n    } else {","sourceCodeStart":163,"sourceCodeEnd":199,"githubUrl":"https://github.com/mastra-ai/mastra/blob/75dd419e613fe9c39f846ffc500716141b74fda6/packages/core/src/memory/memory.ts#L163-L199","documentation":"Memory's semantic recall feature stores message embeddings in a vector database and retrieves them by similarity, which requires an embedding model (embedder) to convert text into vectors. Memory throws this Error in its constructor when semantic recall is enabled but config.embedder is not provided. It fails fast at construction time rather than at first recall, so misconfiguration is caught immediately.","triggerScenarios":"new Memory({ options: { semanticRecall: true/..., vector: <store> } }) without an embedder property in the config object.","commonSituations":"Developers add a vector store (e.g. PgVector) for semantic recall but forget to also pass an embedder like fastembed or an AI SDK embedding model; copying old snippets where the embedder defaulted or was optional; switching Memory configs and dropping the embedder field during refactors.","solutions":["Pass an embedder in the Memory config, e.g. embedder: new FastEmbed() or an AI SDK embedding model via embedMany-compatible wrapper.","If you do not need semantic recall, remove the semanticRecall option from memory options.","Verify the config object shape: semanticRecall requires BOTH vector (vector store) and embedder."],"exampleFix":"// before\nconst memory = new Memory({\n  options: { semanticRecall: { topK: 5 } },\n  vector: new PgVector connectionString,\n});\n\n// after\nconst memory = new Memory({\n  embedder: new FastEmbed(),\n  vector: new PgVector(connectionString),\n  options: { semanticRecall: { topK: 5 } },\n});","handlingStrategy":"validation","validationCode":"function assertEmbedder(config) {\n  if (config?.options?.semanticRecall && !config.embedder) {\n    throw new Error('semanticRecall requires an embedder in Memory config');\n  }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always pass embedder alongside vector when enabling semanticRecall.","Centralize Memory construction in one factory function so required fields are not dropped.","Add a unit test that constructs Memory with your production config."],"tags":["memory","semantic-recall","configuration","missing-embedder"],"backgroundTag":"missing-required-option","analyzedSha":"75dd419e613fe9c39f846ffc500716141b74fda6","analyzedAt":"2026-08-30T00:15:31.844Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}