MemoryOS 2.0.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- memoryos-2.0.3.dist-info/METADATA +418 -0
- memoryos-2.0.3.dist-info/RECORD +315 -0
- memoryos-2.0.3.dist-info/WHEEL +4 -0
- memoryos-2.0.3.dist-info/entry_points.txt +3 -0
- memoryos-2.0.3.dist-info/licenses/LICENSE +201 -0
- memos/__init__.py +20 -0
- memos/api/client.py +571 -0
- memos/api/config.py +1018 -0
- memos/api/context/dependencies.py +50 -0
- memos/api/exceptions.py +53 -0
- memos/api/handlers/__init__.py +62 -0
- memos/api/handlers/add_handler.py +158 -0
- memos/api/handlers/base_handler.py +194 -0
- memos/api/handlers/chat_handler.py +1401 -0
- memos/api/handlers/component_init.py +388 -0
- memos/api/handlers/config_builders.py +190 -0
- memos/api/handlers/feedback_handler.py +93 -0
- memos/api/handlers/formatters_handler.py +237 -0
- memos/api/handlers/memory_handler.py +316 -0
- memos/api/handlers/scheduler_handler.py +497 -0
- memos/api/handlers/search_handler.py +222 -0
- memos/api/handlers/suggestion_handler.py +117 -0
- memos/api/mcp_serve.py +614 -0
- memos/api/middleware/request_context.py +101 -0
- memos/api/product_api.py +38 -0
- memos/api/product_models.py +1206 -0
- memos/api/routers/__init__.py +1 -0
- memos/api/routers/product_router.py +477 -0
- memos/api/routers/server_router.py +394 -0
- memos/api/server_api.py +44 -0
- memos/api/start_api.py +433 -0
- memos/chunkers/__init__.py +4 -0
- memos/chunkers/base.py +24 -0
- memos/chunkers/charactertext_chunker.py +41 -0
- memos/chunkers/factory.py +24 -0
- memos/chunkers/markdown_chunker.py +62 -0
- memos/chunkers/sentence_chunker.py +54 -0
- memos/chunkers/simple_chunker.py +50 -0
- memos/cli.py +113 -0
- memos/configs/__init__.py +0 -0
- memos/configs/base.py +82 -0
- memos/configs/chunker.py +59 -0
- memos/configs/embedder.py +88 -0
- memos/configs/graph_db.py +236 -0
- memos/configs/internet_retriever.py +100 -0
- memos/configs/llm.py +151 -0
- memos/configs/mem_agent.py +54 -0
- memos/configs/mem_chat.py +81 -0
- memos/configs/mem_cube.py +105 -0
- memos/configs/mem_os.py +83 -0
- memos/configs/mem_reader.py +91 -0
- memos/configs/mem_scheduler.py +385 -0
- memos/configs/mem_user.py +70 -0
- memos/configs/memory.py +324 -0
- memos/configs/parser.py +38 -0
- memos/configs/reranker.py +18 -0
- memos/configs/utils.py +8 -0
- memos/configs/vec_db.py +80 -0
- memos/context/context.py +355 -0
- memos/dependency.py +52 -0
- memos/deprecation.py +262 -0
- memos/embedders/__init__.py +0 -0
- memos/embedders/ark.py +95 -0
- memos/embedders/base.py +106 -0
- memos/embedders/factory.py +29 -0
- memos/embedders/ollama.py +77 -0
- memos/embedders/sentence_transformer.py +49 -0
- memos/embedders/universal_api.py +51 -0
- memos/exceptions.py +30 -0
- memos/graph_dbs/__init__.py +0 -0
- memos/graph_dbs/base.py +274 -0
- memos/graph_dbs/factory.py +27 -0
- memos/graph_dbs/item.py +46 -0
- memos/graph_dbs/nebular.py +1794 -0
- memos/graph_dbs/neo4j.py +1942 -0
- memos/graph_dbs/neo4j_community.py +1058 -0
- memos/graph_dbs/polardb.py +5446 -0
- memos/hello_world.py +97 -0
- memos/llms/__init__.py +0 -0
- memos/llms/base.py +25 -0
- memos/llms/deepseek.py +13 -0
- memos/llms/factory.py +38 -0
- memos/llms/hf.py +443 -0
- memos/llms/hf_singleton.py +114 -0
- memos/llms/ollama.py +135 -0
- memos/llms/openai.py +222 -0
- memos/llms/openai_new.py +198 -0
- memos/llms/qwen.py +13 -0
- memos/llms/utils.py +14 -0
- memos/llms/vllm.py +218 -0
- memos/log.py +237 -0
- memos/mem_agent/base.py +19 -0
- memos/mem_agent/deepsearch_agent.py +391 -0
- memos/mem_agent/factory.py +36 -0
- memos/mem_chat/__init__.py +0 -0
- memos/mem_chat/base.py +30 -0
- memos/mem_chat/factory.py +21 -0
- memos/mem_chat/simple.py +200 -0
- memos/mem_cube/__init__.py +0 -0
- memos/mem_cube/base.py +30 -0
- memos/mem_cube/general.py +240 -0
- memos/mem_cube/navie.py +172 -0
- memos/mem_cube/utils.py +169 -0
- memos/mem_feedback/base.py +15 -0
- memos/mem_feedback/feedback.py +1192 -0
- memos/mem_feedback/simple_feedback.py +40 -0
- memos/mem_feedback/utils.py +230 -0
- memos/mem_os/client.py +5 -0
- memos/mem_os/core.py +1203 -0
- memos/mem_os/main.py +582 -0
- memos/mem_os/product.py +1608 -0
- memos/mem_os/product_server.py +455 -0
- memos/mem_os/utils/default_config.py +359 -0
- memos/mem_os/utils/format_utils.py +1403 -0
- memos/mem_os/utils/reference_utils.py +162 -0
- memos/mem_reader/__init__.py +0 -0
- memos/mem_reader/base.py +47 -0
- memos/mem_reader/factory.py +53 -0
- memos/mem_reader/memory.py +298 -0
- memos/mem_reader/multi_modal_struct.py +965 -0
- memos/mem_reader/read_multi_modal/__init__.py +43 -0
- memos/mem_reader/read_multi_modal/assistant_parser.py +311 -0
- memos/mem_reader/read_multi_modal/base.py +273 -0
- memos/mem_reader/read_multi_modal/file_content_parser.py +826 -0
- memos/mem_reader/read_multi_modal/image_parser.py +359 -0
- memos/mem_reader/read_multi_modal/multi_modal_parser.py +252 -0
- memos/mem_reader/read_multi_modal/string_parser.py +139 -0
- memos/mem_reader/read_multi_modal/system_parser.py +327 -0
- memos/mem_reader/read_multi_modal/text_content_parser.py +131 -0
- memos/mem_reader/read_multi_modal/tool_parser.py +210 -0
- memos/mem_reader/read_multi_modal/user_parser.py +218 -0
- memos/mem_reader/read_multi_modal/utils.py +358 -0
- memos/mem_reader/simple_struct.py +912 -0
- memos/mem_reader/strategy_struct.py +163 -0
- memos/mem_reader/utils.py +157 -0
- memos/mem_scheduler/__init__.py +0 -0
- memos/mem_scheduler/analyzer/__init__.py +0 -0
- memos/mem_scheduler/analyzer/api_analyzer.py +714 -0
- memos/mem_scheduler/analyzer/eval_analyzer.py +219 -0
- memos/mem_scheduler/analyzer/mos_for_test_scheduler.py +571 -0
- memos/mem_scheduler/analyzer/scheduler_for_eval.py +280 -0
- memos/mem_scheduler/base_scheduler.py +1319 -0
- memos/mem_scheduler/general_modules/__init__.py +0 -0
- memos/mem_scheduler/general_modules/api_misc.py +137 -0
- memos/mem_scheduler/general_modules/base.py +80 -0
- memos/mem_scheduler/general_modules/init_components_for_scheduler.py +425 -0
- memos/mem_scheduler/general_modules/misc.py +313 -0
- memos/mem_scheduler/general_modules/scheduler_logger.py +389 -0
- memos/mem_scheduler/general_modules/task_threads.py +315 -0
- memos/mem_scheduler/general_scheduler.py +1495 -0
- memos/mem_scheduler/memory_manage_modules/__init__.py +5 -0
- memos/mem_scheduler/memory_manage_modules/memory_filter.py +306 -0
- memos/mem_scheduler/memory_manage_modules/retriever.py +547 -0
- memos/mem_scheduler/monitors/__init__.py +0 -0
- memos/mem_scheduler/monitors/dispatcher_monitor.py +366 -0
- memos/mem_scheduler/monitors/general_monitor.py +394 -0
- memos/mem_scheduler/monitors/task_schedule_monitor.py +254 -0
- memos/mem_scheduler/optimized_scheduler.py +410 -0
- memos/mem_scheduler/orm_modules/__init__.py +0 -0
- memos/mem_scheduler/orm_modules/api_redis_model.py +518 -0
- memos/mem_scheduler/orm_modules/base_model.py +729 -0
- memos/mem_scheduler/orm_modules/monitor_models.py +261 -0
- memos/mem_scheduler/orm_modules/redis_model.py +699 -0
- memos/mem_scheduler/scheduler_factory.py +23 -0
- memos/mem_scheduler/schemas/__init__.py +0 -0
- memos/mem_scheduler/schemas/analyzer_schemas.py +52 -0
- memos/mem_scheduler/schemas/api_schemas.py +233 -0
- memos/mem_scheduler/schemas/general_schemas.py +55 -0
- memos/mem_scheduler/schemas/message_schemas.py +173 -0
- memos/mem_scheduler/schemas/monitor_schemas.py +406 -0
- memos/mem_scheduler/schemas/task_schemas.py +132 -0
- memos/mem_scheduler/task_schedule_modules/__init__.py +0 -0
- memos/mem_scheduler/task_schedule_modules/dispatcher.py +740 -0
- memos/mem_scheduler/task_schedule_modules/local_queue.py +247 -0
- memos/mem_scheduler/task_schedule_modules/orchestrator.py +74 -0
- memos/mem_scheduler/task_schedule_modules/redis_queue.py +1385 -0
- memos/mem_scheduler/task_schedule_modules/task_queue.py +162 -0
- memos/mem_scheduler/utils/__init__.py +0 -0
- memos/mem_scheduler/utils/api_utils.py +77 -0
- memos/mem_scheduler/utils/config_utils.py +100 -0
- memos/mem_scheduler/utils/db_utils.py +50 -0
- memos/mem_scheduler/utils/filter_utils.py +176 -0
- memos/mem_scheduler/utils/metrics.py +125 -0
- memos/mem_scheduler/utils/misc_utils.py +290 -0
- memos/mem_scheduler/utils/monitor_event_utils.py +67 -0
- memos/mem_scheduler/utils/status_tracker.py +229 -0
- memos/mem_scheduler/webservice_modules/__init__.py +0 -0
- memos/mem_scheduler/webservice_modules/rabbitmq_service.py +485 -0
- memos/mem_scheduler/webservice_modules/redis_service.py +380 -0
- memos/mem_user/factory.py +94 -0
- memos/mem_user/mysql_persistent_user_manager.py +271 -0
- memos/mem_user/mysql_user_manager.py +502 -0
- memos/mem_user/persistent_factory.py +98 -0
- memos/mem_user/persistent_user_manager.py +260 -0
- memos/mem_user/redis_persistent_user_manager.py +225 -0
- memos/mem_user/user_manager.py +488 -0
- memos/memories/__init__.py +0 -0
- memos/memories/activation/__init__.py +0 -0
- memos/memories/activation/base.py +42 -0
- memos/memories/activation/item.py +56 -0
- memos/memories/activation/kv.py +292 -0
- memos/memories/activation/vllmkv.py +219 -0
- memos/memories/base.py +19 -0
- memos/memories/factory.py +42 -0
- memos/memories/parametric/__init__.py +0 -0
- memos/memories/parametric/base.py +19 -0
- memos/memories/parametric/item.py +11 -0
- memos/memories/parametric/lora.py +41 -0
- memos/memories/textual/__init__.py +0 -0
- memos/memories/textual/base.py +92 -0
- memos/memories/textual/general.py +236 -0
- memos/memories/textual/item.py +304 -0
- memos/memories/textual/naive.py +187 -0
- memos/memories/textual/prefer_text_memory/__init__.py +0 -0
- memos/memories/textual/prefer_text_memory/adder.py +504 -0
- memos/memories/textual/prefer_text_memory/config.py +106 -0
- memos/memories/textual/prefer_text_memory/extractor.py +221 -0
- memos/memories/textual/prefer_text_memory/factory.py +85 -0
- memos/memories/textual/prefer_text_memory/retrievers.py +177 -0
- memos/memories/textual/prefer_text_memory/spliter.py +132 -0
- memos/memories/textual/prefer_text_memory/utils.py +93 -0
- memos/memories/textual/preference.py +344 -0
- memos/memories/textual/simple_preference.py +161 -0
- memos/memories/textual/simple_tree.py +69 -0
- memos/memories/textual/tree.py +459 -0
- memos/memories/textual/tree_text_memory/__init__.py +0 -0
- memos/memories/textual/tree_text_memory/organize/__init__.py +0 -0
- memos/memories/textual/tree_text_memory/organize/handler.py +184 -0
- memos/memories/textual/tree_text_memory/organize/manager.py +518 -0
- memos/memories/textual/tree_text_memory/organize/relation_reason_detector.py +238 -0
- memos/memories/textual/tree_text_memory/organize/reorganizer.py +622 -0
- memos/memories/textual/tree_text_memory/retrieve/__init__.py +0 -0
- memos/memories/textual/tree_text_memory/retrieve/advanced_searcher.py +364 -0
- memos/memories/textual/tree_text_memory/retrieve/bm25_util.py +186 -0
- memos/memories/textual/tree_text_memory/retrieve/bochasearch.py +419 -0
- memos/memories/textual/tree_text_memory/retrieve/internet_retriever.py +270 -0
- memos/memories/textual/tree_text_memory/retrieve/internet_retriever_factory.py +102 -0
- memos/memories/textual/tree_text_memory/retrieve/reasoner.py +61 -0
- memos/memories/textual/tree_text_memory/retrieve/recall.py +497 -0
- memos/memories/textual/tree_text_memory/retrieve/reranker.py +111 -0
- memos/memories/textual/tree_text_memory/retrieve/retrieval_mid_structs.py +16 -0
- memos/memories/textual/tree_text_memory/retrieve/retrieve_utils.py +472 -0
- memos/memories/textual/tree_text_memory/retrieve/searcher.py +848 -0
- memos/memories/textual/tree_text_memory/retrieve/task_goal_parser.py +135 -0
- memos/memories/textual/tree_text_memory/retrieve/utils.py +54 -0
- memos/memories/textual/tree_text_memory/retrieve/xinyusearch.py +387 -0
- memos/memos_tools/dinding_report_bot.py +453 -0
- memos/memos_tools/lockfree_dict.py +120 -0
- memos/memos_tools/notification_service.py +44 -0
- memos/memos_tools/notification_utils.py +142 -0
- memos/memos_tools/singleton.py +174 -0
- memos/memos_tools/thread_safe_dict.py +310 -0
- memos/memos_tools/thread_safe_dict_segment.py +382 -0
- memos/multi_mem_cube/__init__.py +0 -0
- memos/multi_mem_cube/composite_cube.py +86 -0
- memos/multi_mem_cube/single_cube.py +874 -0
- memos/multi_mem_cube/views.py +54 -0
- memos/parsers/__init__.py +0 -0
- memos/parsers/base.py +15 -0
- memos/parsers/factory.py +21 -0
- memos/parsers/markitdown.py +28 -0
- memos/reranker/__init__.py +4 -0
- memos/reranker/base.py +25 -0
- memos/reranker/concat.py +103 -0
- memos/reranker/cosine_local.py +102 -0
- memos/reranker/factory.py +72 -0
- memos/reranker/http_bge.py +324 -0
- memos/reranker/http_bge_strategy.py +327 -0
- memos/reranker/noop.py +19 -0
- memos/reranker/strategies/__init__.py +4 -0
- memos/reranker/strategies/base.py +61 -0
- memos/reranker/strategies/concat_background.py +94 -0
- memos/reranker/strategies/concat_docsource.py +110 -0
- memos/reranker/strategies/dialogue_common.py +109 -0
- memos/reranker/strategies/factory.py +31 -0
- memos/reranker/strategies/single_turn.py +107 -0
- memos/reranker/strategies/singleturn_outmem.py +98 -0
- memos/settings.py +10 -0
- memos/templates/__init__.py +0 -0
- memos/templates/advanced_search_prompts.py +211 -0
- memos/templates/cloud_service_prompt.py +107 -0
- memos/templates/instruction_completion.py +66 -0
- memos/templates/mem_agent_prompts.py +85 -0
- memos/templates/mem_feedback_prompts.py +822 -0
- memos/templates/mem_reader_prompts.py +1096 -0
- memos/templates/mem_reader_strategy_prompts.py +238 -0
- memos/templates/mem_scheduler_prompts.py +626 -0
- memos/templates/mem_search_prompts.py +93 -0
- memos/templates/mos_prompts.py +403 -0
- memos/templates/prefer_complete_prompt.py +735 -0
- memos/templates/tool_mem_prompts.py +139 -0
- memos/templates/tree_reorganize_prompts.py +230 -0
- memos/types/__init__.py +34 -0
- memos/types/general_types.py +151 -0
- memos/types/openai_chat_completion_types/__init__.py +15 -0
- memos/types/openai_chat_completion_types/chat_completion_assistant_message_param.py +56 -0
- memos/types/openai_chat_completion_types/chat_completion_content_part_image_param.py +27 -0
- memos/types/openai_chat_completion_types/chat_completion_content_part_input_audio_param.py +23 -0
- memos/types/openai_chat_completion_types/chat_completion_content_part_param.py +43 -0
- memos/types/openai_chat_completion_types/chat_completion_content_part_refusal_param.py +16 -0
- memos/types/openai_chat_completion_types/chat_completion_content_part_text_param.py +16 -0
- memos/types/openai_chat_completion_types/chat_completion_message_custom_tool_call_param.py +27 -0
- memos/types/openai_chat_completion_types/chat_completion_message_function_tool_call_param.py +32 -0
- memos/types/openai_chat_completion_types/chat_completion_message_param.py +18 -0
- memos/types/openai_chat_completion_types/chat_completion_message_tool_call_union_param.py +15 -0
- memos/types/openai_chat_completion_types/chat_completion_system_message_param.py +36 -0
- memos/types/openai_chat_completion_types/chat_completion_tool_message_param.py +30 -0
- memos/types/openai_chat_completion_types/chat_completion_user_message_param.py +34 -0
- memos/utils.py +123 -0
- memos/vec_dbs/__init__.py +0 -0
- memos/vec_dbs/base.py +117 -0
- memos/vec_dbs/factory.py +23 -0
- memos/vec_dbs/item.py +50 -0
- memos/vec_dbs/milvus.py +654 -0
- memos/vec_dbs/qdrant.py +355 -0
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Server component initialization module.
|
|
3
|
+
|
|
4
|
+
This module handles the initialization of all MemOS server components
|
|
5
|
+
including databases, LLMs, memory systems, and schedulers.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import os
|
|
9
|
+
|
|
10
|
+
from typing import TYPE_CHECKING, Any
|
|
11
|
+
|
|
12
|
+
from memos.api.config import APIConfig
|
|
13
|
+
from memos.api.handlers.config_builders import (
|
|
14
|
+
build_chat_llm_config,
|
|
15
|
+
build_embedder_config,
|
|
16
|
+
build_feedback_reranker_config,
|
|
17
|
+
build_graph_db_config,
|
|
18
|
+
build_internet_retriever_config,
|
|
19
|
+
build_llm_config,
|
|
20
|
+
build_mem_reader_config,
|
|
21
|
+
build_pref_adder_config,
|
|
22
|
+
build_pref_extractor_config,
|
|
23
|
+
build_pref_retriever_config,
|
|
24
|
+
build_reranker_config,
|
|
25
|
+
build_vec_db_config,
|
|
26
|
+
)
|
|
27
|
+
from memos.configs.mem_scheduler import SchedulerConfigFactory
|
|
28
|
+
from memos.embedders.factory import EmbedderFactory
|
|
29
|
+
from memos.graph_dbs.factory import GraphStoreFactory
|
|
30
|
+
from memos.llms.factory import LLMFactory
|
|
31
|
+
from memos.log import get_logger
|
|
32
|
+
from memos.mem_cube.navie import NaiveMemCube
|
|
33
|
+
from memos.mem_feedback.simple_feedback import SimpleMemFeedback
|
|
34
|
+
from memos.mem_os.product_server import MOSServer
|
|
35
|
+
from memos.mem_reader.factory import MemReaderFactory
|
|
36
|
+
from memos.mem_scheduler.orm_modules.base_model import BaseDBManager
|
|
37
|
+
from memos.mem_scheduler.scheduler_factory import SchedulerFactory
|
|
38
|
+
from memos.memories.textual.prefer_text_memory.factory import (
|
|
39
|
+
AdderFactory,
|
|
40
|
+
ExtractorFactory,
|
|
41
|
+
RetrieverFactory,
|
|
42
|
+
)
|
|
43
|
+
from memos.memories.textual.simple_preference import SimplePreferenceTextMemory
|
|
44
|
+
from memos.memories.textual.simple_tree import SimpleTreeTextMemory
|
|
45
|
+
from memos.memories.textual.tree_text_memory.organize.manager import MemoryManager
|
|
46
|
+
from memos.memories.textual.tree_text_memory.retrieve.retrieve_utils import FastTokenizer
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
if TYPE_CHECKING:
|
|
50
|
+
from memos.memories.textual.tree import TreeTextMemory
|
|
51
|
+
from memos.mem_agent.deepsearch_agent import DeepSearchMemAgent
|
|
52
|
+
from memos.memories.textual.tree_text_memory.retrieve.internet_retriever_factory import (
|
|
53
|
+
InternetRetrieverFactory,
|
|
54
|
+
)
|
|
55
|
+
from memos.reranker.factory import RerankerFactory
|
|
56
|
+
from memos.vec_dbs.factory import VecDBFactory
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
if TYPE_CHECKING:
|
|
60
|
+
from memos.mem_scheduler.optimized_scheduler import OptimizedScheduler
|
|
61
|
+
from memos.memories.textual.tree_text_memory.retrieve.searcher import Searcher
|
|
62
|
+
logger = get_logger(__name__)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _get_default_memory_size(cube_config: Any) -> dict[str, int]:
|
|
66
|
+
"""
|
|
67
|
+
Get default memory size configuration.
|
|
68
|
+
|
|
69
|
+
Attempts to retrieve memory size from cube config, falls back to defaults
|
|
70
|
+
if not found.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
cube_config: The cube configuration object
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
Dictionary with memory sizes for different memory types
|
|
77
|
+
"""
|
|
78
|
+
return getattr(cube_config.text_mem.config, "memory_size", None) or {
|
|
79
|
+
"WorkingMemory": 20,
|
|
80
|
+
"LongTermMemory": 1500,
|
|
81
|
+
"UserMemory": 480,
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _init_chat_llms(chat_llm_configs: list[dict]) -> dict[str, Any]:
|
|
86
|
+
"""
|
|
87
|
+
Initialize chat language models from configuration.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
chat_llm_configs: List of chat LLM configuration dictionaries
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
Dictionary mapping model names to initialized LLM instances
|
|
94
|
+
"""
|
|
95
|
+
|
|
96
|
+
def _list_models(client):
|
|
97
|
+
try:
|
|
98
|
+
models = (
|
|
99
|
+
[model.id for model in client.models.list().data]
|
|
100
|
+
if client.models.list().data
|
|
101
|
+
else client.models.list().models
|
|
102
|
+
)
|
|
103
|
+
except Exception as e:
|
|
104
|
+
logger.error(f"Error listing models: {e}")
|
|
105
|
+
models = []
|
|
106
|
+
return models
|
|
107
|
+
|
|
108
|
+
model_name_instrance_maping = {}
|
|
109
|
+
for cfg in chat_llm_configs:
|
|
110
|
+
llm = LLMFactory.from_config(cfg["config_class"])
|
|
111
|
+
if cfg["support_models"]:
|
|
112
|
+
for model_name in cfg["support_models"]:
|
|
113
|
+
model_name_instrance_maping[model_name] = llm
|
|
114
|
+
return model_name_instrance_maping
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def init_server() -> dict[str, Any]:
|
|
118
|
+
"""
|
|
119
|
+
Initialize all server components and configurations.
|
|
120
|
+
|
|
121
|
+
This function orchestrates the creation and initialization of all components
|
|
122
|
+
required by the MemOS server, including:
|
|
123
|
+
- Database connections (graph DB, vector DB)
|
|
124
|
+
- Language models and embedders
|
|
125
|
+
- Memory systems (text, preference)
|
|
126
|
+
- Scheduler and related modules
|
|
127
|
+
|
|
128
|
+
Returns:
|
|
129
|
+
A dictionary containing all initialized components with descriptive keys.
|
|
130
|
+
This approach allows easy addition of new components without breaking
|
|
131
|
+
existing code that uses the components.
|
|
132
|
+
"""
|
|
133
|
+
logger.info("Initializing MemOS server components...")
|
|
134
|
+
|
|
135
|
+
# Initialize Redis client first as it is a core dependency for features like scheduler status tracking
|
|
136
|
+
if os.getenv("MEMSCHEDULER_USE_REDIS_QUEUE", "False").lower() == "true":
|
|
137
|
+
try:
|
|
138
|
+
from memos.mem_scheduler.orm_modules.api_redis_model import APIRedisDBManager
|
|
139
|
+
|
|
140
|
+
redis_client = APIRedisDBManager.load_redis_engine_from_env()
|
|
141
|
+
if redis_client:
|
|
142
|
+
logger.info("Redis client initialized successfully.")
|
|
143
|
+
else:
|
|
144
|
+
logger.error(
|
|
145
|
+
"Failed to initialize Redis client. Check REDIS_HOST etc. in environment variables."
|
|
146
|
+
)
|
|
147
|
+
except Exception as e:
|
|
148
|
+
logger.error(f"Failed to initialize Redis client: {e}", exc_info=True)
|
|
149
|
+
redis_client = None # Ensure redis_client exists even on failure
|
|
150
|
+
else:
|
|
151
|
+
redis_client = None
|
|
152
|
+
|
|
153
|
+
# Get default cube configuration
|
|
154
|
+
default_cube_config = APIConfig.get_default_cube_config()
|
|
155
|
+
|
|
156
|
+
# Get online bot setting
|
|
157
|
+
dingding_enabled = APIConfig.is_dingding_bot_enabled()
|
|
158
|
+
|
|
159
|
+
# Build component configurations
|
|
160
|
+
graph_db_config = build_graph_db_config()
|
|
161
|
+
llm_config = build_llm_config()
|
|
162
|
+
chat_llm_config = build_chat_llm_config()
|
|
163
|
+
embedder_config = build_embedder_config()
|
|
164
|
+
mem_reader_config = build_mem_reader_config()
|
|
165
|
+
reranker_config = build_reranker_config()
|
|
166
|
+
feedback_reranker_config = build_feedback_reranker_config()
|
|
167
|
+
internet_retriever_config = build_internet_retriever_config()
|
|
168
|
+
vector_db_config = build_vec_db_config()
|
|
169
|
+
pref_extractor_config = build_pref_extractor_config()
|
|
170
|
+
pref_adder_config = build_pref_adder_config()
|
|
171
|
+
pref_retriever_config = build_pref_retriever_config()
|
|
172
|
+
|
|
173
|
+
logger.debug("Component configurations built successfully")
|
|
174
|
+
|
|
175
|
+
# Create component instances
|
|
176
|
+
graph_db = GraphStoreFactory.from_config(graph_db_config)
|
|
177
|
+
vector_db = (
|
|
178
|
+
VecDBFactory.from_config(vector_db_config)
|
|
179
|
+
if os.getenv("ENABLE_PREFERENCE_MEMORY", "false") == "true"
|
|
180
|
+
else None
|
|
181
|
+
)
|
|
182
|
+
llm = LLMFactory.from_config(llm_config)
|
|
183
|
+
chat_llms = (
|
|
184
|
+
_init_chat_llms(chat_llm_config)
|
|
185
|
+
if os.getenv("ENABLE_CHAT_API", "false") == "true"
|
|
186
|
+
else None
|
|
187
|
+
)
|
|
188
|
+
embedder = EmbedderFactory.from_config(embedder_config)
|
|
189
|
+
# Pass graph_db to mem_reader for recall operations (deduplication, conflict detection)
|
|
190
|
+
mem_reader = MemReaderFactory.from_config(mem_reader_config, graph_db=graph_db)
|
|
191
|
+
reranker = RerankerFactory.from_config(reranker_config)
|
|
192
|
+
feedback_reranker = RerankerFactory.from_config(feedback_reranker_config)
|
|
193
|
+
internet_retriever = InternetRetrieverFactory.from_config(
|
|
194
|
+
internet_retriever_config, embedder=embedder
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
# Initialize chat llms
|
|
198
|
+
|
|
199
|
+
logger.debug("Core components instantiated")
|
|
200
|
+
|
|
201
|
+
# Initialize memory manager
|
|
202
|
+
memory_manager = MemoryManager(
|
|
203
|
+
graph_db,
|
|
204
|
+
embedder,
|
|
205
|
+
llm,
|
|
206
|
+
memory_size=_get_default_memory_size(default_cube_config),
|
|
207
|
+
is_reorganize=getattr(default_cube_config.text_mem.config, "reorganize", False),
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
logger.debug("Memory manager initialized")
|
|
211
|
+
tokenizer = FastTokenizer()
|
|
212
|
+
# Initialize text memory
|
|
213
|
+
text_mem = SimpleTreeTextMemory(
|
|
214
|
+
llm=llm,
|
|
215
|
+
embedder=embedder,
|
|
216
|
+
mem_reader=mem_reader,
|
|
217
|
+
graph_db=graph_db,
|
|
218
|
+
reranker=reranker,
|
|
219
|
+
memory_manager=memory_manager,
|
|
220
|
+
config=default_cube_config.text_mem.config,
|
|
221
|
+
internet_retriever=internet_retriever,
|
|
222
|
+
tokenizer=tokenizer,
|
|
223
|
+
include_embedding=bool(os.getenv("INCLUDE_EMBEDDING", "false") == "true"),
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
logger.debug("Text memory initialized")
|
|
227
|
+
|
|
228
|
+
# Initialize preference memory components
|
|
229
|
+
pref_extractor = (
|
|
230
|
+
ExtractorFactory.from_config(
|
|
231
|
+
config_factory=pref_extractor_config,
|
|
232
|
+
llm_provider=llm,
|
|
233
|
+
embedder=embedder,
|
|
234
|
+
vector_db=vector_db,
|
|
235
|
+
)
|
|
236
|
+
if os.getenv("ENABLE_PREFERENCE_MEMORY", "false") == "true"
|
|
237
|
+
else None
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
pref_adder = (
|
|
241
|
+
AdderFactory.from_config(
|
|
242
|
+
config_factory=pref_adder_config,
|
|
243
|
+
llm_provider=llm,
|
|
244
|
+
embedder=embedder,
|
|
245
|
+
vector_db=vector_db,
|
|
246
|
+
text_mem=text_mem,
|
|
247
|
+
)
|
|
248
|
+
if os.getenv("ENABLE_PREFERENCE_MEMORY", "false") == "true"
|
|
249
|
+
else None
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
pref_retriever = (
|
|
253
|
+
RetrieverFactory.from_config(
|
|
254
|
+
config_factory=pref_retriever_config,
|
|
255
|
+
llm_provider=llm,
|
|
256
|
+
embedder=embedder,
|
|
257
|
+
reranker=feedback_reranker,
|
|
258
|
+
vector_db=vector_db,
|
|
259
|
+
)
|
|
260
|
+
if os.getenv("ENABLE_PREFERENCE_MEMORY", "false") == "true"
|
|
261
|
+
else None
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
logger.debug("Preference memory components initialized")
|
|
265
|
+
|
|
266
|
+
# Initialize preference memory
|
|
267
|
+
pref_mem = (
|
|
268
|
+
SimplePreferenceTextMemory(
|
|
269
|
+
extractor_llm=llm,
|
|
270
|
+
vector_db=vector_db,
|
|
271
|
+
embedder=embedder,
|
|
272
|
+
reranker=feedback_reranker,
|
|
273
|
+
extractor=pref_extractor,
|
|
274
|
+
adder=pref_adder,
|
|
275
|
+
retriever=pref_retriever,
|
|
276
|
+
)
|
|
277
|
+
if os.getenv("ENABLE_PREFERENCE_MEMORY", "false") == "true"
|
|
278
|
+
else None
|
|
279
|
+
)
|
|
280
|
+
|
|
281
|
+
logger.debug("Preference memory initialized")
|
|
282
|
+
|
|
283
|
+
# Initialize MOS Server
|
|
284
|
+
mos_server = MOSServer(
|
|
285
|
+
mem_reader=mem_reader,
|
|
286
|
+
llm=llm,
|
|
287
|
+
online_bot=False,
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
logger.debug("MOS server initialized")
|
|
291
|
+
|
|
292
|
+
# Create MemCube with pre-initialized memory instances
|
|
293
|
+
naive_mem_cube = NaiveMemCube(
|
|
294
|
+
text_mem=text_mem,
|
|
295
|
+
pref_mem=pref_mem,
|
|
296
|
+
act_mem=None,
|
|
297
|
+
para_mem=None,
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
logger.debug("MemCube created")
|
|
301
|
+
|
|
302
|
+
tree_mem: TreeTextMemory = naive_mem_cube.text_mem
|
|
303
|
+
searcher: Searcher = tree_mem.get_searcher(
|
|
304
|
+
manual_close_internet=os.getenv("ENABLE_INTERNET", "true").lower() == "false",
|
|
305
|
+
moscube=False,
|
|
306
|
+
process_llm=mem_reader.llm,
|
|
307
|
+
)
|
|
308
|
+
logger.debug("Searcher created")
|
|
309
|
+
|
|
310
|
+
# Initialize feedback server
|
|
311
|
+
feedback_server = SimpleMemFeedback(
|
|
312
|
+
llm=llm,
|
|
313
|
+
embedder=embedder,
|
|
314
|
+
graph_store=graph_db,
|
|
315
|
+
memory_manager=memory_manager,
|
|
316
|
+
mem_reader=mem_reader,
|
|
317
|
+
searcher=searcher,
|
|
318
|
+
reranker=feedback_reranker,
|
|
319
|
+
pref_mem=pref_mem,
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
# Initialize Scheduler
|
|
323
|
+
scheduler_config_dict = APIConfig.get_scheduler_config()
|
|
324
|
+
scheduler_config = SchedulerConfigFactory(
|
|
325
|
+
backend="optimized_scheduler", config=scheduler_config_dict
|
|
326
|
+
)
|
|
327
|
+
mem_scheduler: OptimizedScheduler = SchedulerFactory.from_config(scheduler_config)
|
|
328
|
+
mem_scheduler.initialize_modules(
|
|
329
|
+
chat_llm=llm,
|
|
330
|
+
process_llm=mem_reader.llm,
|
|
331
|
+
db_engine=BaseDBManager.create_default_sqlite_engine(),
|
|
332
|
+
mem_reader=mem_reader,
|
|
333
|
+
redis_client=redis_client,
|
|
334
|
+
)
|
|
335
|
+
mem_scheduler.init_mem_cube(
|
|
336
|
+
mem_cube=naive_mem_cube, searcher=searcher, feedback_server=feedback_server
|
|
337
|
+
)
|
|
338
|
+
logger.debug("Scheduler initialized")
|
|
339
|
+
|
|
340
|
+
# Initialize SchedulerAPIModule
|
|
341
|
+
api_module = mem_scheduler.api_module
|
|
342
|
+
|
|
343
|
+
# Start scheduler if enabled
|
|
344
|
+
if os.getenv("API_SCHEDULER_ON", "true").lower() == "true":
|
|
345
|
+
mem_scheduler.start()
|
|
346
|
+
logger.info("Scheduler started")
|
|
347
|
+
|
|
348
|
+
logger.info("MemOS server components initialized successfully")
|
|
349
|
+
|
|
350
|
+
# Initialize online bot if enabled
|
|
351
|
+
online_bot = None
|
|
352
|
+
if dingding_enabled:
|
|
353
|
+
from memos.memos_tools.notification_service import get_online_bot_function
|
|
354
|
+
|
|
355
|
+
online_bot = get_online_bot_function() if dingding_enabled else None
|
|
356
|
+
logger.info("DingDing bot is enabled")
|
|
357
|
+
|
|
358
|
+
deepsearch_agent = DeepSearchMemAgent(
|
|
359
|
+
llm=llm,
|
|
360
|
+
memory_retriever=tree_mem,
|
|
361
|
+
)
|
|
362
|
+
# Return all components as a dictionary for easy access and extension
|
|
363
|
+
return {
|
|
364
|
+
"graph_db": graph_db,
|
|
365
|
+
"mem_reader": mem_reader,
|
|
366
|
+
"llm": llm,
|
|
367
|
+
"chat_llms": chat_llms,
|
|
368
|
+
"embedder": embedder,
|
|
369
|
+
"reranker": reranker,
|
|
370
|
+
"internet_retriever": internet_retriever,
|
|
371
|
+
"memory_manager": memory_manager,
|
|
372
|
+
"default_cube_config": default_cube_config,
|
|
373
|
+
"mos_server": mos_server,
|
|
374
|
+
"mem_scheduler": mem_scheduler,
|
|
375
|
+
"naive_mem_cube": naive_mem_cube,
|
|
376
|
+
"searcher": searcher,
|
|
377
|
+
"api_module": api_module,
|
|
378
|
+
"vector_db": vector_db,
|
|
379
|
+
"pref_extractor": pref_extractor,
|
|
380
|
+
"pref_adder": pref_adder,
|
|
381
|
+
"pref_retriever": pref_retriever,
|
|
382
|
+
"text_mem": text_mem,
|
|
383
|
+
"pref_mem": pref_mem,
|
|
384
|
+
"online_bot": online_bot,
|
|
385
|
+
"feedback_server": feedback_server,
|
|
386
|
+
"redis_client": redis_client,
|
|
387
|
+
"deepsearch_agent": deepsearch_agent,
|
|
388
|
+
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Configuration builders for server handlers.
|
|
3
|
+
|
|
4
|
+
This module contains factory functions that build configurations for various
|
|
5
|
+
components used by the MemOS server. Each function constructs and validates
|
|
6
|
+
a configuration dictionary using the appropriate ConfigFactory.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import os
|
|
11
|
+
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
from memos.api.config import APIConfig
|
|
15
|
+
from memos.configs.embedder import EmbedderConfigFactory
|
|
16
|
+
from memos.configs.graph_db import GraphDBConfigFactory
|
|
17
|
+
from memos.configs.internet_retriever import InternetRetrieverConfigFactory
|
|
18
|
+
from memos.configs.llm import LLMConfigFactory
|
|
19
|
+
from memos.configs.mem_reader import MemReaderConfigFactory
|
|
20
|
+
from memos.configs.reranker import RerankerConfigFactory
|
|
21
|
+
from memos.configs.vec_db import VectorDBConfigFactory
|
|
22
|
+
from memos.memories.textual.prefer_text_memory.config import (
|
|
23
|
+
AdderConfigFactory,
|
|
24
|
+
ExtractorConfigFactory,
|
|
25
|
+
RetrieverConfigFactory,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def build_graph_db_config(user_id: str = "default") -> dict[str, Any]:
|
|
30
|
+
"""
|
|
31
|
+
Build graph database configuration.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
user_id: User ID for configuration context (default: "default")
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
Validated graph database configuration dictionary
|
|
38
|
+
"""
|
|
39
|
+
graph_db_backend_map = {
|
|
40
|
+
"neo4j-community": APIConfig.get_neo4j_community_config(user_id=user_id),
|
|
41
|
+
"neo4j": APIConfig.get_neo4j_config(user_id=user_id),
|
|
42
|
+
"nebular": APIConfig.get_nebular_config(user_id=user_id),
|
|
43
|
+
"polardb": APIConfig.get_polardb_config(user_id=user_id),
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
graph_db_backend = os.getenv("NEO4J_BACKEND", "nebular").lower()
|
|
47
|
+
return GraphDBConfigFactory.model_validate(
|
|
48
|
+
{
|
|
49
|
+
"backend": graph_db_backend,
|
|
50
|
+
"config": graph_db_backend_map[graph_db_backend],
|
|
51
|
+
}
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def build_vec_db_config() -> dict[str, Any]:
|
|
56
|
+
"""
|
|
57
|
+
Build vector database configuration.
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
Validated vector database configuration dictionary
|
|
61
|
+
"""
|
|
62
|
+
return VectorDBConfigFactory.model_validate(
|
|
63
|
+
{
|
|
64
|
+
"backend": "milvus",
|
|
65
|
+
"config": APIConfig.get_milvus_config(),
|
|
66
|
+
}
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def build_llm_config() -> dict[str, Any]:
|
|
71
|
+
"""
|
|
72
|
+
Build LLM configuration.
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
Validated LLM configuration dictionary
|
|
76
|
+
"""
|
|
77
|
+
return LLMConfigFactory.model_validate(
|
|
78
|
+
{
|
|
79
|
+
"backend": "openai",
|
|
80
|
+
"config": APIConfig.get_openai_config(),
|
|
81
|
+
}
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def build_chat_llm_config() -> list[dict[str, Any]]:
|
|
86
|
+
"""
|
|
87
|
+
Build chat LLM configuration.
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
Validated chat LLM configuration dictionary
|
|
91
|
+
"""
|
|
92
|
+
configs = json.loads(os.getenv("CHAT_MODEL_LIST", "[]"))
|
|
93
|
+
return [
|
|
94
|
+
{
|
|
95
|
+
"config_class": LLMConfigFactory.model_validate(
|
|
96
|
+
{
|
|
97
|
+
"backend": cfg.get("backend", "openai"),
|
|
98
|
+
"config": (
|
|
99
|
+
{k: v for k, v in cfg.items() if k not in ["backend", "support_models"]}
|
|
100
|
+
)
|
|
101
|
+
if cfg
|
|
102
|
+
else APIConfig.get_openai_config(),
|
|
103
|
+
}
|
|
104
|
+
),
|
|
105
|
+
"support_models": cfg.get("support_models", None),
|
|
106
|
+
}
|
|
107
|
+
for cfg in configs
|
|
108
|
+
]
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def build_embedder_config() -> dict[str, Any]:
|
|
112
|
+
"""
|
|
113
|
+
Build embedder configuration.
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
Validated embedder configuration dictionary
|
|
117
|
+
"""
|
|
118
|
+
return EmbedderConfigFactory.model_validate(APIConfig.get_embedder_config())
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def build_mem_reader_config() -> dict[str, Any]:
|
|
122
|
+
"""
|
|
123
|
+
Build memory reader configuration.
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
Validated memory reader configuration dictionary
|
|
127
|
+
"""
|
|
128
|
+
return MemReaderConfigFactory.model_validate(
|
|
129
|
+
APIConfig.get_product_default_config()["mem_reader"]
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def build_reranker_config() -> dict[str, Any]:
|
|
134
|
+
"""
|
|
135
|
+
Build reranker configuration.
|
|
136
|
+
|
|
137
|
+
Returns:
|
|
138
|
+
Validated reranker configuration dictionary
|
|
139
|
+
"""
|
|
140
|
+
return RerankerConfigFactory.model_validate(APIConfig.get_reranker_config())
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def build_feedback_reranker_config() -> dict[str, Any]:
|
|
144
|
+
"""
|
|
145
|
+
Build reranker configuration.
|
|
146
|
+
|
|
147
|
+
Returns:
|
|
148
|
+
Validated reranker configuration dictionary
|
|
149
|
+
"""
|
|
150
|
+
return RerankerConfigFactory.model_validate(APIConfig.get_feedback_reranker_config())
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def build_internet_retriever_config() -> dict[str, Any]:
|
|
154
|
+
"""
|
|
155
|
+
Build internet retriever configuration.
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
Validated internet retriever configuration dictionary
|
|
159
|
+
"""
|
|
160
|
+
return InternetRetrieverConfigFactory.model_validate(APIConfig.get_internet_config())
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def build_pref_extractor_config() -> dict[str, Any]:
|
|
164
|
+
"""
|
|
165
|
+
Build preference memory extractor configuration.
|
|
166
|
+
|
|
167
|
+
Returns:
|
|
168
|
+
Validated extractor configuration dictionary
|
|
169
|
+
"""
|
|
170
|
+
return ExtractorConfigFactory.model_validate({"backend": "naive", "config": {}})
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def build_pref_adder_config() -> dict[str, Any]:
|
|
174
|
+
"""
|
|
175
|
+
Build preference memory adder configuration.
|
|
176
|
+
|
|
177
|
+
Returns:
|
|
178
|
+
Validated adder configuration dictionary
|
|
179
|
+
"""
|
|
180
|
+
return AdderConfigFactory.model_validate({"backend": "naive", "config": {}})
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def build_pref_retriever_config() -> dict[str, Any]:
|
|
184
|
+
"""
|
|
185
|
+
Build preference memory retriever configuration.
|
|
186
|
+
|
|
187
|
+
Returns:
|
|
188
|
+
Validated retriever configuration dictionary
|
|
189
|
+
"""
|
|
190
|
+
return RetrieverConfigFactory.model_validate({"backend": "naive", "config": {}})
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Feeback handler for memory add/update functionality.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from memos.api.handlers.base_handler import BaseHandler, HandlerDependencies
|
|
6
|
+
from memos.api.product_models import APIFeedbackRequest, MemoryResponse
|
|
7
|
+
from memos.log import get_logger
|
|
8
|
+
from memos.multi_mem_cube.composite_cube import CompositeCubeView
|
|
9
|
+
from memos.multi_mem_cube.single_cube import SingleCubeView
|
|
10
|
+
from memos.multi_mem_cube.views import MemCubeView
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
logger = get_logger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class FeedbackHandler(BaseHandler):
|
|
17
|
+
"""
|
|
18
|
+
Handler for memory feedback operations.
|
|
19
|
+
|
|
20
|
+
Provides fast, fine-grained, and mixture-based feedback modes.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
def __init__(self, dependencies: HandlerDependencies):
|
|
24
|
+
"""
|
|
25
|
+
Initialize feedback handler.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
dependencies: HandlerDependencies instance
|
|
29
|
+
"""
|
|
30
|
+
super().__init__(dependencies)
|
|
31
|
+
self._validate_dependencies("mem_reader", "mem_scheduler", "searcher", "reranker")
|
|
32
|
+
|
|
33
|
+
def handle_feedback_memories(self, feedback_req: APIFeedbackRequest) -> MemoryResponse:
|
|
34
|
+
"""
|
|
35
|
+
Main handler for feedback memories endpoint.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
feedback_req: feedback request containing content and parameters
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
MemoryResponse with formatted results
|
|
42
|
+
"""
|
|
43
|
+
cube_view = self._build_cube_view(feedback_req)
|
|
44
|
+
|
|
45
|
+
process_record = cube_view.feedback_memories(feedback_req)
|
|
46
|
+
|
|
47
|
+
self.logger.info(f"[FeedbackHandler] Final feedback results count={len(process_record)}")
|
|
48
|
+
|
|
49
|
+
return MemoryResponse(
|
|
50
|
+
message="Memory feedback successfully",
|
|
51
|
+
data=[process_record],
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
def _resolve_cube_ids(self, feedback_req: APIFeedbackRequest) -> list[str]:
|
|
55
|
+
"""
|
|
56
|
+
Normalize target cube ids from feedback_req.
|
|
57
|
+
"""
|
|
58
|
+
if feedback_req.writable_cube_ids:
|
|
59
|
+
return list(dict.fromkeys(feedback_req.writable_cube_ids))
|
|
60
|
+
|
|
61
|
+
return [feedback_req.user_id]
|
|
62
|
+
|
|
63
|
+
def _build_cube_view(self, feedback_req: APIFeedbackRequest) -> MemCubeView:
|
|
64
|
+
cube_ids = self._resolve_cube_ids(feedback_req)
|
|
65
|
+
|
|
66
|
+
if len(cube_ids) == 1:
|
|
67
|
+
cube_id = cube_ids[0]
|
|
68
|
+
return SingleCubeView(
|
|
69
|
+
cube_id=cube_id,
|
|
70
|
+
naive_mem_cube=None,
|
|
71
|
+
mem_reader=None,
|
|
72
|
+
mem_scheduler=self.mem_scheduler,
|
|
73
|
+
logger=self.logger,
|
|
74
|
+
searcher=None,
|
|
75
|
+
feedback_server=self.feedback_server,
|
|
76
|
+
)
|
|
77
|
+
else:
|
|
78
|
+
single_views = [
|
|
79
|
+
SingleCubeView(
|
|
80
|
+
cube_id=cube_id,
|
|
81
|
+
naive_mem_cube=None,
|
|
82
|
+
mem_reader=None,
|
|
83
|
+
mem_scheduler=self.mem_scheduler,
|
|
84
|
+
logger=self.logger,
|
|
85
|
+
searcher=None,
|
|
86
|
+
feedback_server=self.feedback_server,
|
|
87
|
+
)
|
|
88
|
+
for cube_id in cube_ids
|
|
89
|
+
]
|
|
90
|
+
return CompositeCubeView(
|
|
91
|
+
cube_views=single_views,
|
|
92
|
+
logger=self.logger,
|
|
93
|
+
)
|