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 src/memos/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
__version__ = "2.0.14"
__version__ = "2.0.15"

from memos.configs.mem_cube import GeneralMemCubeConfig
from memos.configs.mem_os import MOSConfig
Expand Down
2 changes: 2 additions & 0 deletions src/memos/api/handlers/search_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
from memos.multi_mem_cube.composite_cube import CompositeCubeView
from memos.multi_mem_cube.single_cube import SingleCubeView
from memos.multi_mem_cube.views import MemCubeView
from memos.plugins.hooks import hookable


logger = get_logger(__name__)
Expand All @@ -44,6 +45,7 @@ def __init__(self, dependencies: HandlerDependencies):
"naive_mem_cube", "mem_scheduler", "searcher", "deepsearch_agent"
)

@hookable("search")
def handle_search_memories(self, search_req: APISearchRequest) -> SearchResponse:
"""
Main handler for search memories endpoint.
Expand Down
8 changes: 8 additions & 0 deletions src/memos/api/product_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -438,6 +438,14 @@ class APISearchRequest(BaseRequest):
)

# ==== Context ====
reference_time: str | None = Field(
None,
description=(
"Optional reference time for time-sensitive search parsing. "
"If omitted, search uses the current server time."
),
)

chat_history: MessageList | None = Field(
None,
description=(
Expand Down
10 changes: 9 additions & 1 deletion src/memos/mem_reader/multi_modal_struct.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
from memos.mem_reader.utils import parse_json_result
from memos.memories.textual.item import TextualMemoryItem, TreeNodeTextualMemoryMetadata
from memos.plugins.hook_defs import H
from memos.plugins.hooks import trigger_single_hook
from memos.plugins.hooks import trigger_hook, trigger_single_hook
from memos.templates.mem_reader_prompts import MEMORY_MERGE_PROMPT_EN, MEMORY_MERGE_PROMPT_ZH
from memos.templates.tool_mem_prompts import TOOL_TRAJECTORY_PROMPT_EN, TOOL_TRAJECTORY_PROMPT_ZH
from memos.types import MessagesType
Expand Down Expand Up @@ -785,6 +785,14 @@ def _process_one_item(
)
rawfile_node.metadata.summary_ids = [mem_node.id for mem_node in fine_items]
fine_items.append(rawfile_node)
enriched_items = trigger_hook(
H.MEMORY_ITEMS_AFTER_FINE_EXTRACT,
items=fine_items,
user_context=kwargs.get("user_context"),
mem_reader=self,
extract_mode="fine",
)
fine_items = enriched_items if enriched_items is not None else fine_items
return fine_items

fine_memory_items: list[TextualMemoryItem] = []
Expand Down
8 changes: 8 additions & 0 deletions src/memos/memories/textual/item.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,14 @@ class ArchivedTextualMemory(BaseModel):
default_factory=lambda: datetime.now().isoformat(),
description="The time the memory was created.",
)
timespec: dict[str, Any] | None = Field(
default=None,
description="Compact temporal index snapshot for this archived version, used by retrieval-side version selection.",
)
memory_form: Literal["state", "event"] | None = Field(
default=None,
description="Internal memory form snapshot for this archived version, used by retrieval-side routing.",
)


class TextualMemoryMetadata(BaseModel):
Expand Down
8 changes: 8 additions & 0 deletions src/memos/plugins/hook_defs.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ class H:

# mem_reader — generic extension point before LLM extraction
MEM_READER_PRE_EXTRACT = "mem_reader.pre_extract"
MEMORY_ITEMS_AFTER_FINE_EXTRACT = "memory_items.after_fine_extract"

# memory version — single-provider business hooks
MEMORY_VERSION_PREPARE_UPDATES = "memory_version.prepare_updates"
Expand All @@ -102,6 +103,13 @@ class H:
pipe_key="prompt",
)

define_hook(
H.MEMORY_ITEMS_AFTER_FINE_EXTRACT,
description="Post-process memory items after mem_reader fine extraction completes",
params=["items", "user_context", "mem_reader", "extract_mode"],
pipe_key="items",
)

define_hook(
H.MEMORY_VERSION_PREPARE_UPDATES,
description=(
Expand Down
Loading