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:
+15
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user