{"record":{"id":"97579be58b3ba174","repo":"mem0ai/mem0","slug":"filters-must-contain-at-least-one-of-user-id-age","errorCode":null,"errorMessage":"filters must contain at least one of: user_id, agent_id, run_id. Example: filters: { user_id: 'u1' }","messagePattern":"filters must contain at least one of: user_id, agent_id, run_id\\. Example: filters: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"mem0-ts/src/oss/src/memory/index.ts","lineNumber":1415,"sourceCode":"      for (const fk of Object.keys(effectiveFilters)) {\n        if (\n          ![\"AND\", \"OR\", \"NOT\", \"user_id\", \"agent_id\", \"run_id\"].includes(fk) &&\n          typeof effectiveFilters[fk] === \"object\" &&\n          effectiveFilters[fk] !== null\n        ) {\n          delete effectiveFilters[fk];\n        }\n      }\n      effectiveFilters = { ...effectiveFilters, ...processedFilters };\n    }\n\n    // Validate filters contains at least one entity ID (snake_case)\n    if (\n      !effectiveFilters.user_id &&\n      !effectiveFilters.agent_id &&\n      !effectiveFilters.run_id\n    ) {\n      throw new Error(\n        \"filters must contain at least one of: user_id, agent_id, run_id. \" +\n          \"Example: filters: { user_id: 'u1' }\",\n      );\n    }\n\n    const searchStartMs = Date.now();\n\n    // Step 1: Preprocess query\n    const queryLemmatized = lemmatizeForBm25(query);\n    const queryEntities = extractEntities(query);\n\n    // Step 2: Embed query\n    const queryEmbedding = await this.embedder.embed(query, \"search\");\n\n    // Step 3: Semantic search (over-fetch for scoring pool)\n    const internalLimit = Math.max(topK * 4, 60);\n    const semanticResults = await this.vectorStore.search(\n      queryEmbedding,","sourceCodeStart":1397,"sourceCodeEnd":1433,"githubUrl":"https://github.com/mem0ai/mem0/blob/001c235229be8795e3834520467bd0d661ed8f34/mem0-ts/src/oss/src/memory/index.ts#L1397-L1433","documentation":"Thrown by Memory.search() after filter processing when the effective filters contain none of user_id, agent_id, or run_id. Search is scoped per entity in the OSS SDK, so an unscoped query is rejected rather than run across all users' memories. Note the check is on snake_case keys — top-level camelCase config keys are converted first, but arbitrary filter keys are not.","triggerScenarios":"Calling memory.search('query', { filters: {} }), or passing filters with only non-entity keys like { category: 'prefs' }, or passing camelCase entity keys directly inside filters ({ userId: 'u1' }) so the snake_case check misses them.","commonSituations":"Assuming search() without filters searches everything (it does not — use entity-scoped search); mixing camelCase into the filters object; building filters dynamically so the entity key can be absent.","solutions":["Include an entity key in filters: memory.search(q, { filters: { user_id: 'u1' } })","Use snake_case keys inside filters (user_id, agent_id, run_id); camelCase belongs in the top-level config which is converted for you","Combine entity scope with metadata filters: { user_id: 'u1', AND: [{ category: { equals: 'pref' } }] }"],"exampleFix":"// before\nawait memory.search('preferences', { filters: { userId: 'alice' } });\n\n// after\nawait memory.search('preferences', { filters: { user_id: 'alice' } });","handlingStrategy":"type-guard","validationCode":"function scopedFilters(f: Record<string, unknown> = {}) {\n  if (!f.user_id && !f.agent_id && !f.run_id) {\n    throw new Error('search requires user_id, agent_id, or run_id');\n  }\n  return f;\n}","typeGuard":"const isEntityScoped = (\n  f?: Partial<Record<'user_id' | 'agent_id' | 'run_id', string>>,\n): boolean => Boolean(f && (f.user_id || f.agent_id || f.run_id));","tryCatchPattern":null,"preventionTips":["Use snake_case entity keys inside filters; camelCase at the top level","Type filters against the SDK's SearchFilters type so missing scope is a compile-time signal"],"tags":["validation","oss","search","filters"],"backgroundTag":null,"analyzedSha":"001c235229be8795e3834520467bd0d661ed8f34","analyzedAt":"2026-08-15T01:55:42.685Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}