Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
##############################################################################

name = "MemoryOS"
version = "2.0.19"
version = "2.0.20"
description = "Intelligence Begins with Memory"
license = {text = "Apache-2.0"}
readme = "README.md"
Expand Down
2 changes: 1 addition & 1 deletion src/memos/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
__version__ = "2.0.19"
__version__ = "2.0.20"

from memos.configs.mem_cube import GeneralMemCubeConfig
from memos.configs.mem_os import MOSConfig
Expand Down
13 changes: 11 additions & 2 deletions src/memos/api/handlers/formatters_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,13 @@

logger = get_logger(__name__)

__all__ = [
"format_memory_item",
"post_process_textual_mem",
"rerank_knowledge_mem",
"to_iter",
]


def to_iter(running: Any) -> list[Any]:
"""
Expand Down Expand Up @@ -164,6 +171,7 @@ def rerank_knowledge_mem(
text_mem: list[dict[str, Any]],
top_k: int,
file_mem_proportion: float = 0.5,
strip_conversation_sources: bool = False,
) -> list[dict[str, Any]]:
"""
Rerank knowledge memories and keep conversation memories.
Expand Down Expand Up @@ -193,8 +201,9 @@ def rerank_knowledge_mem(
item["memory"] = item["metadata"]["sources"][0]["content"]
item["metadata"]["sources"] = []

for item in conversation_mem:
item.setdefault("metadata", {})["sources"] = []
if strip_conversation_sources:
for item in conversation_mem:
item.setdefault("metadata", {})["sources"] = []

# deduplicate: remove items with duplicate memory content
original_count = len(reranked_knowledge_mem)
Expand Down
17 changes: 17 additions & 0 deletions src/memos/api/handlers/search_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,23 @@ def handle_search_memories(self, search_req: APISearchRequest) -> SearchResponse
top_k=search_req_local.top_k,
file_mem_proportion=0.5,
)
hooked_results = trigger_hook(
H.SEARCH_RESULTS_AFTER_RERANK,
handler=self,
search_req=search_req_local,
results=results,
)
if hooked_results is not None:
results = hooked_results

hooked_results = trigger_hook(
H.SEARCH_CONTEXT_RENDER,
handler=self,
search_req=search_req_local,
results=results,
)
if hooked_results is not None:
results = hooked_results

self.logger.info(
f"[SearchHandler] Final search results: count={len(results)} results={results}"
Expand Down
13 changes: 13 additions & 0 deletions src/memos/api/product_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -422,6 +422,14 @@ class APISearchRequest(BaseRequest):
),
)

rerank: bool = Field(
True,
description=(
"Whether to apply the textual memory reranker during search. "
"Set false to return retrieval-order candidates before post-search dedup/formatting."
),
)

pref_top_k: int = Field(
6,
ge=0,
Expand Down Expand Up @@ -464,6 +472,11 @@ class APISearchRequest(BaseRequest):
description="Number of skill memories to retrieve (top-K). Default: 3.",
)

context_format: str = Field(
"memory",
description="Optional search context format passed through to installed plugins.",
)

# ==== Filter conditions ====
# TODO: maybe add detailed description later
filter: dict[str, Any] | None = Field(
Expand Down
Loading
Loading