Add configurable case-insensitive search

- Add MEM0_CASE_INSENSITIVE config option (default: false)
- When enabled, searches with both original and lowercase query
- Merges results, keeping highest score for each memory
- Fixes case sensitivity issues with Qdrant embeddings
- Generalize after-install.md with placeholders instead of personal values
This commit is contained in:
2026-04-15 18:19:52 +02:00
parent a1240adbb9
commit 32b97bee87
3 changed files with 72 additions and 17 deletions
+15
View File
@@ -8,6 +8,7 @@ Config via environment variables:
MEM0_AGENT_ID — Agent identifier (default: hermes)
MEM0_PREFETCH_LIMIT — Max memories to prefetch (default: 3)
MEM0_PREFETCH_SCORE_THRESHOLD — Min similarity score % to include memory (default: 60)
MEM0_CASE_INSENSITIVE — Enable case-insensitive search (default: false)
Or via $HERMES_HOME/mem0-local.json.
"""
@@ -52,6 +53,8 @@ def _load_config() -> dict:
"prefetch_score_threshold": int(
os.environ.get("MEM0_PREFETCH_SCORE_THRESHOLD", "60")
),
"case_insensitive": os.environ.get("MEM0_CASE_INSENSITIVE", "false").lower()
== "true",
}
config_path = get_hermes_home() / "mem0-local.json"
@@ -154,6 +157,7 @@ class Mem0LocalMemoryProvider(MemoryProvider):
self._rerank = True
self._prefetch_limit = 3
self._prefetch_score_threshold = 60
self._case_insensitive = False
self._prefetch_result = ""
self._prefetch_lock = threading.Lock()
self._prefetch_thread = None
@@ -224,6 +228,12 @@ class Mem0LocalMemoryProvider(MemoryProvider):
"description": "Min similarity score % to include memory (0-100)",
"default": "60",
},
{
"key": "case_insensitive",
"description": "Enable case-insensitive search (uses 2x API calls)",
"default": False,
"type": "boolean",
},
]
def _get_client(self) -> LocalMem0Client:
@@ -241,6 +251,7 @@ class Mem0LocalMemoryProvider(MemoryProvider):
self._prefetch_score_threshold = int(
self._config.get("prefetch_score_threshold", 60)
)
self._case_insensitive = self._config.get("case_insensitive", False)
base_url = self._config.get("base_url", "http://localhost:8000")
timeout = float(self._config.get("timeout", 10.0))
self._client = LocalMem0Client(base_url, timeout=timeout)
@@ -293,6 +304,7 @@ class Mem0LocalMemoryProvider(MemoryProvider):
self._prefetch_score_threshold = int(
self._config.get("prefetch_score_threshold", 60)
)
self._case_insensitive = self._config.get("case_insensitive", False)
def system_prompt_block(self) -> str:
return (
@@ -333,6 +345,7 @@ class Mem0LocalMemoryProvider(MemoryProvider):
query=query,
user_id=self._user_id,
limit=self._prefetch_limit,
case_insensitive=self._case_insensitive,
)
# Filter by score threshold
threshold = self._prefetch_score_threshold / 100.0
@@ -370,6 +383,7 @@ class Mem0LocalMemoryProvider(MemoryProvider):
query=query,
user_id=self._user_id,
limit=self._prefetch_limit,
case_insensitive=self._case_insensitive,
)
# Filter by score threshold
threshold = self._prefetch_score_threshold / 100.0
@@ -466,6 +480,7 @@ class Mem0LocalMemoryProvider(MemoryProvider):
query=query,
user_id=self._user_id,
limit=top_k,
case_insensitive=self._case_insensitive,
)
self._record_success()
if not results: