MemoryOS 2.0.1__tar.gz → 2.0.2__tar.gz
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.1 → memoryos-2.0.2}/PKG-INFO +2 -1
- {memoryos-2.0.1 → memoryos-2.0.2}/README.md +1 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/pyproject.toml +1 -1
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/__init__.py +1 -1
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/handlers/component_init.py +2 -1
- memoryos-2.0.2/src/memos/api/handlers/formatters_handler.py +237 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/handlers/memory_handler.py +47 -30
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/handlers/search_handler.py +15 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/product_models.py +3 -1
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/graph_dbs/base.py +14 -5
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/graph_dbs/neo4j.py +23 -5
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/graph_dbs/neo4j_community.py +103 -1
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/graph_dbs/polardb.py +10 -1
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/openai.py +12 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/vllm.py +6 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_feedback/feedback.py +2 -1
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/base.py +22 -1
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/factory.py +29 -3
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/multi_modal_struct.py +255 -33
- memoryos-2.0.2/src/memos/mem_reader/read_multi_modal/system_parser.py +327 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/simple_struct.py +31 -10
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/base_scheduler.py +6 -3
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/general_modules/init_components_for_scheduler.py +2 -1
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/general_scheduler.py +33 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/task_schedule_modules/dispatcher.py +0 -31
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py +228 -48
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py +28 -14
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/prefer_text_memory/extractor.py +4 -4
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree.py +2 -1
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/recall.py +12 -5
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py +3 -45
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/multi_mem_cube/single_cube.py +31 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/concat.py +10 -2
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/http_bge.py +10 -6
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/mem_reader_prompts.py +207 -37
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/prefer_complete_prompt.py +44 -2
- memoryos-2.0.2/src/memos/templates/tool_mem_prompts.py +139 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/utils.py +0 -1
- memoryos-2.0.1/src/memos/api/handlers/formatters_handler.py +0 -127
- memoryos-2.0.1/src/memos/mem_reader/read_multi_modal/system_parser.py +0 -172
- memoryos-2.0.1/src/memos/templates/tool_mem_prompts.py +0 -84
- {memoryos-2.0.1 → memoryos-2.0.2}/LICENSE +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/client.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/config.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/context/dependencies.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/exceptions.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/handlers/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/handlers/add_handler.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/handlers/base_handler.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/handlers/chat_handler.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/handlers/config_builders.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/handlers/feedback_handler.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/handlers/scheduler_handler.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/handlers/suggestion_handler.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/mcp_serve.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/middleware/request_context.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/product_api.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/routers/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/routers/product_router.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/routers/server_router.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/server_api.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/api/start_api.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/chunkers/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/chunkers/base.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/chunkers/charactertext_chunker.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/chunkers/factory.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/chunkers/markdown_chunker.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/chunkers/sentence_chunker.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/chunkers/simple_chunker.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/cli.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/base.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/chunker.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/embedder.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/graph_db.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/internet_retriever.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/llm.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/mem_agent.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/mem_chat.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/mem_cube.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/mem_os.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/mem_reader.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/mem_scheduler.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/mem_user.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/memory.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/parser.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/reranker.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/utils.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/configs/vec_db.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/context/context.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/dependency.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/deprecation.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/embedders/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/embedders/ark.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/embedders/base.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/embedders/factory.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/embedders/ollama.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/embedders/sentence_transformer.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/embedders/universal_api.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/exceptions.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/graph_dbs/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/graph_dbs/factory.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/graph_dbs/item.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/graph_dbs/nebular.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/hello_world.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/base.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/deepseek.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/factory.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/hf.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/hf_singleton.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/ollama.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/openai_new.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/qwen.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/llms/utils.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/log.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_agent/base.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_agent/deepsearch_agent.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_agent/factory.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_chat/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_chat/base.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_chat/factory.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_chat/simple.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_cube/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_cube/base.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_cube/general.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_cube/navie.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_cube/utils.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_feedback/base.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_feedback/simple_feedback.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_feedback/utils.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_os/client.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_os/core.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_os/main.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_os/product.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_os/product_server.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_os/utils/default_config.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_os/utils/format_utils.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_os/utils/reference_utils.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/memory.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/read_multi_modal/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/read_multi_modal/assistant_parser.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/read_multi_modal/base.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/read_multi_modal/file_content_parser.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/read_multi_modal/image_parser.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/read_multi_modal/multi_modal_parser.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/read_multi_modal/string_parser.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/read_multi_modal/text_content_parser.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/read_multi_modal/tool_parser.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/read_multi_modal/user_parser.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/read_multi_modal/utils.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/strategy_struct.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_reader/utils.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/analyzer/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/analyzer/api_analyzer.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/analyzer/eval_analyzer.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/analyzer/mos_for_test_scheduler.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/analyzer/scheduler_for_eval.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/general_modules/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/general_modules/api_misc.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/general_modules/base.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/general_modules/misc.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/general_modules/scheduler_logger.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/general_modules/task_threads.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/memory_manage_modules/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/memory_manage_modules/memory_filter.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/memory_manage_modules/retriever.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/monitors/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/monitors/dispatcher_monitor.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/monitors/general_monitor.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/monitors/task_schedule_monitor.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/optimized_scheduler.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/orm_modules/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/orm_modules/api_redis_model.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/orm_modules/base_model.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/orm_modules/monitor_models.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/orm_modules/redis_model.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/scheduler_factory.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/schemas/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/schemas/analyzer_schemas.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/schemas/api_schemas.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/schemas/general_schemas.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/schemas/message_schemas.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/schemas/monitor_schemas.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/schemas/task_schemas.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/task_schedule_modules/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/task_schedule_modules/local_queue.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/task_schedule_modules/orchestrator.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/task_schedule_modules/task_queue.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/utils/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/utils/api_utils.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/utils/config_utils.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/utils/db_utils.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/utils/filter_utils.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/utils/metrics.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/utils/misc_utils.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/utils/monitor_event_utils.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/utils/status_tracker.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/webservice_modules/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_scheduler/webservice_modules/redis_service.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_user/factory.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_user/mysql_persistent_user_manager.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_user/mysql_user_manager.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_user/persistent_factory.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_user/persistent_user_manager.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_user/redis_persistent_user_manager.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/mem_user/user_manager.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/activation/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/activation/base.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/activation/item.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/activation/kv.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/activation/vllmkv.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/base.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/factory.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/parametric/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/parametric/base.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/parametric/item.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/parametric/lora.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/base.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/general.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/item.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/naive.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/prefer_text_memory/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/prefer_text_memory/adder.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/prefer_text_memory/config.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/prefer_text_memory/factory.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/prefer_text_memory/retrievers.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/prefer_text_memory/spliter.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/prefer_text_memory/utils.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/preference.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/simple_preference.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/simple_tree.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/organize/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/organize/handler.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/organize/manager.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/organize/relation_reason_detector.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/organize/reorganizer.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/advanced_searcher.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/bm25_util.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/bochasearch.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever_factory.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/reasoner.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/reranker.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/retrieval_mid_structs.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/retrieve_utils.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/task_goal_parser.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/utils.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memories/textual/tree_text_memory/retrieve/xinyusearch.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memos_tools/dinding_report_bot.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memos_tools/lockfree_dict.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memos_tools/notification_service.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memos_tools/notification_utils.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memos_tools/singleton.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memos_tools/thread_safe_dict.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/memos_tools/thread_safe_dict_segment.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/multi_mem_cube/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/multi_mem_cube/composite_cube.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/multi_mem_cube/views.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/parsers/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/parsers/base.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/parsers/factory.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/parsers/markitdown.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/base.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/cosine_local.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/factory.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/http_bge_strategy.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/noop.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/strategies/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/strategies/base.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/strategies/concat_background.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/strategies/concat_docsource.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/strategies/dialogue_common.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/strategies/factory.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/strategies/single_turn.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/reranker/strategies/singleturn_outmem.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/settings.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/advanced_search_prompts.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/cloud_service_prompt.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/instruction_completion.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/mem_agent_prompts.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/mem_feedback_prompts.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/mem_reader_strategy_prompts.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/mem_scheduler_prompts.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/mem_search_prompts.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/mos_prompts.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/templates/tree_reorganize_prompts.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/general_types.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_assistant_message_param.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_image_param.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_input_audio_param.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_param.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_refusal_param.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_text_param.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_message_custom_tool_call_param.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_message_function_tool_call_param.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_message_param.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_message_tool_call_union_param.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_system_message_param.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_tool_message_param.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/types/openai_chat_completion_types/chat_completion_user_message_param.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/vec_dbs/__init__.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/vec_dbs/base.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/vec_dbs/factory.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/vec_dbs/item.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/vec_dbs/milvus.py +0 -0
- {memoryos-2.0.1 → memoryos-2.0.2}/src/memos/vec_dbs/qdrant.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: MemoryOS
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.2
|
|
4
4
|
Summary: Intelligence Begins with Memory
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
License-File: LICENSE
|
|
@@ -289,6 +289,7 @@ Get Free API: [Try API](https://memos-dashboard.openmem.net/quickstart/?source=g
|
|
|
289
289
|
- Launch via the uvicorn command line interface (CLI)
|
|
290
290
|
###### Tips: Please ensure that Neo4j and Qdrant are running before executing the following command.
|
|
291
291
|
```bash
|
|
292
|
+
cd src
|
|
292
293
|
uvicorn memos.api.server_api:app --host 0.0.0.0 --port 8001 --workers 1
|
|
293
294
|
```
|
|
294
295
|
##### For detailed integration steps, see the [`CLI Reference`](https://docs.openmem.net/open_source/getting_started/rest_api_server/#method-3client-install-with-CLI).
|
|
@@ -211,6 +211,7 @@ Get Free API: [Try API](https://memos-dashboard.openmem.net/quickstart/?source=g
|
|
|
211
211
|
- Launch via the uvicorn command line interface (CLI)
|
|
212
212
|
###### Tips: Please ensure that Neo4j and Qdrant are running before executing the following command.
|
|
213
213
|
```bash
|
|
214
|
+
cd src
|
|
214
215
|
uvicorn memos.api.server_api:app --host 0.0.0.0 --port 8001 --workers 1
|
|
215
216
|
```
|
|
216
217
|
##### For detailed integration steps, see the [`CLI Reference`](https://docs.openmem.net/open_source/getting_started/rest_api_server/#method-3client-install-with-CLI).
|
|
@@ -183,7 +183,8 @@ def init_server() -> dict[str, Any]:
|
|
|
183
183
|
else None
|
|
184
184
|
)
|
|
185
185
|
embedder = EmbedderFactory.from_config(embedder_config)
|
|
186
|
-
mem_reader
|
|
186
|
+
# Pass graph_db to mem_reader for recall operations (deduplication, conflict detection)
|
|
187
|
+
mem_reader = MemReaderFactory.from_config(mem_reader_config, graph_db=graph_db)
|
|
187
188
|
reranker = RerankerFactory.from_config(reranker_config)
|
|
188
189
|
feedback_reranker = RerankerFactory.from_config(feedback_reranker_config)
|
|
189
190
|
internet_retriever = InternetRetrieverFactory.from_config(
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Data formatting utilities for server handlers.
|
|
3
|
+
|
|
4
|
+
This module provides utility functions for formatting and transforming data
|
|
5
|
+
structures for API responses, including memory items and preferences.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from memos.log import get_logger
|
|
11
|
+
from memos.templates.instruction_completion import instruct_completion
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
logger = get_logger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def to_iter(running: Any) -> list[Any]:
|
|
18
|
+
"""
|
|
19
|
+
Normalize running tasks to a list of task objects.
|
|
20
|
+
|
|
21
|
+
Handles different input types and converts them to a consistent list format.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
running: Running tasks, can be None, dict, or iterable
|
|
25
|
+
|
|
26
|
+
Returns:
|
|
27
|
+
List of task objects
|
|
28
|
+
"""
|
|
29
|
+
if running is None:
|
|
30
|
+
return []
|
|
31
|
+
if isinstance(running, dict):
|
|
32
|
+
return list(running.values())
|
|
33
|
+
return list(running) if running else []
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def format_memory_item(
|
|
37
|
+
memory_data: Any, include_embedding: bool = False, save_sources: bool = True
|
|
38
|
+
) -> dict[str, Any]:
|
|
39
|
+
"""
|
|
40
|
+
Format a single memory item for API response.
|
|
41
|
+
|
|
42
|
+
Transforms a memory object into a dictionary with metadata properly
|
|
43
|
+
structured for API consumption.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
memory_data: Memory object to format
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
Formatted memory dictionary with ref_id and metadata
|
|
50
|
+
"""
|
|
51
|
+
memory = memory_data.model_dump()
|
|
52
|
+
memory_id = memory["id"]
|
|
53
|
+
ref_id = f"[{memory_id.split('-')[0]}]"
|
|
54
|
+
|
|
55
|
+
memory["ref_id"] = ref_id
|
|
56
|
+
if not include_embedding:
|
|
57
|
+
memory["metadata"]["embedding"] = []
|
|
58
|
+
if not save_sources:
|
|
59
|
+
memory["metadata"]["sources"] = []
|
|
60
|
+
memory["metadata"]["usage"] = []
|
|
61
|
+
memory["metadata"]["ref_id"] = ref_id
|
|
62
|
+
memory["metadata"]["id"] = memory_id
|
|
63
|
+
memory["metadata"]["memory"] = memory["memory"]
|
|
64
|
+
|
|
65
|
+
return memory
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def post_process_pref_mem(
|
|
69
|
+
memories_result: dict[str, Any],
|
|
70
|
+
pref_formatted_mem: list[dict[str, Any]],
|
|
71
|
+
mem_cube_id: str,
|
|
72
|
+
include_preference: bool,
|
|
73
|
+
) -> dict[str, Any]:
|
|
74
|
+
"""
|
|
75
|
+
Post-process preference memory results.
|
|
76
|
+
|
|
77
|
+
Adds formatted preference memories to the result dictionary and generates
|
|
78
|
+
instruction completion strings if preferences are included.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
memories_result: Result dictionary to update
|
|
82
|
+
pref_formatted_mem: List of formatted preference memories
|
|
83
|
+
mem_cube_id: Memory cube ID
|
|
84
|
+
include_preference: Whether to include preferences in result
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
Updated memories_result dictionary
|
|
88
|
+
"""
|
|
89
|
+
if include_preference:
|
|
90
|
+
memories_result["pref_mem"].append(
|
|
91
|
+
{
|
|
92
|
+
"cube_id": mem_cube_id,
|
|
93
|
+
"memories": pref_formatted_mem,
|
|
94
|
+
"total_nodes": len(pref_formatted_mem),
|
|
95
|
+
}
|
|
96
|
+
)
|
|
97
|
+
pref_instruction, pref_note = instruct_completion(pref_formatted_mem)
|
|
98
|
+
memories_result["pref_string"] = pref_instruction
|
|
99
|
+
memories_result["pref_note"] = pref_note
|
|
100
|
+
|
|
101
|
+
return memories_result
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def post_process_textual_mem(
|
|
105
|
+
memories_result: dict[str, Any],
|
|
106
|
+
text_formatted_mem: list[dict[str, Any]],
|
|
107
|
+
mem_cube_id: str,
|
|
108
|
+
) -> dict[str, Any]:
|
|
109
|
+
"""
|
|
110
|
+
Post-process text and tool memory results.
|
|
111
|
+
"""
|
|
112
|
+
fact_mem = [
|
|
113
|
+
mem
|
|
114
|
+
for mem in text_formatted_mem
|
|
115
|
+
if mem["metadata"]["memory_type"] not in ["ToolSchemaMemory", "ToolTrajectoryMemory"]
|
|
116
|
+
]
|
|
117
|
+
tool_mem = [
|
|
118
|
+
mem
|
|
119
|
+
for mem in text_formatted_mem
|
|
120
|
+
if mem["metadata"]["memory_type"] in ["ToolSchemaMemory", "ToolTrajectoryMemory"]
|
|
121
|
+
]
|
|
122
|
+
|
|
123
|
+
memories_result["text_mem"].append(
|
|
124
|
+
{
|
|
125
|
+
"cube_id": mem_cube_id,
|
|
126
|
+
"memories": fact_mem,
|
|
127
|
+
"total_nodes": len(fact_mem),
|
|
128
|
+
}
|
|
129
|
+
)
|
|
130
|
+
memories_result["tool_mem"].append(
|
|
131
|
+
{
|
|
132
|
+
"cube_id": mem_cube_id,
|
|
133
|
+
"memories": tool_mem,
|
|
134
|
+
"total_nodes": len(tool_mem),
|
|
135
|
+
}
|
|
136
|
+
)
|
|
137
|
+
return memories_result
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def separate_knowledge_and_conversation_mem(memories: list[dict[str, Any]]):
|
|
141
|
+
"""
|
|
142
|
+
Separate knowledge and conversation memories from retrieval results.
|
|
143
|
+
"""
|
|
144
|
+
knowledge_mem = []
|
|
145
|
+
conversation_mem = []
|
|
146
|
+
for item in memories:
|
|
147
|
+
sources = item["metadata"]["sources"]
|
|
148
|
+
if (
|
|
149
|
+
len(sources) > 0
|
|
150
|
+
and "type" in sources[0]
|
|
151
|
+
and sources[0]["type"] == "file"
|
|
152
|
+
and "content" in sources[0]
|
|
153
|
+
and sources[0]["content"] != ""
|
|
154
|
+
): # TODO change to memory_type
|
|
155
|
+
knowledge_mem.append(item)
|
|
156
|
+
else:
|
|
157
|
+
conversation_mem.append(item)
|
|
158
|
+
|
|
159
|
+
logger.info(
|
|
160
|
+
f"Retrieval results number of knowledge_mem: {len(knowledge_mem)}, conversation_mem: {len(conversation_mem)}"
|
|
161
|
+
)
|
|
162
|
+
return knowledge_mem, conversation_mem
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def rerank_knowledge_mem(
|
|
166
|
+
reranker: Any,
|
|
167
|
+
query: str,
|
|
168
|
+
text_mem: list[dict[str, Any]],
|
|
169
|
+
top_k: int,
|
|
170
|
+
file_mem_proportion: float = 0.5,
|
|
171
|
+
) -> list[dict[str, Any]]:
|
|
172
|
+
"""
|
|
173
|
+
Rerank knowledge memories and keep conversation memories.
|
|
174
|
+
"""
|
|
175
|
+
memid2cubeid = {}
|
|
176
|
+
memories_list = []
|
|
177
|
+
for memory_group in text_mem:
|
|
178
|
+
cube_id = memory_group["cube_id"]
|
|
179
|
+
memories = memory_group["memories"]
|
|
180
|
+
memories_list.extend(memories)
|
|
181
|
+
for memory in memories:
|
|
182
|
+
memid2cubeid[memory["id"]] = cube_id
|
|
183
|
+
|
|
184
|
+
knowledge_mem, conversation_mem = separate_knowledge_and_conversation_mem(memories_list)
|
|
185
|
+
knowledge_mem_top_k = max(int(top_k * file_mem_proportion), int(top_k - len(conversation_mem)))
|
|
186
|
+
# rerank set unuse
|
|
187
|
+
reranked_knowledge_mem = knowledge_mem
|
|
188
|
+
|
|
189
|
+
# Sort by relativity in descending order
|
|
190
|
+
reranked_knowledge_mem = sorted(
|
|
191
|
+
reranked_knowledge_mem,
|
|
192
|
+
key=lambda item: item.get("metadata", {}).get("relativity", 0.0),
|
|
193
|
+
reverse=True,
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
# TODO revoke sources replace memory value
|
|
197
|
+
for item in reranked_knowledge_mem:
|
|
198
|
+
item["memory"] = item["metadata"]["sources"][0]["content"]
|
|
199
|
+
item["metadata"]["sources"] = []
|
|
200
|
+
|
|
201
|
+
for item in conversation_mem:
|
|
202
|
+
item["metadata"]["sources"] = []
|
|
203
|
+
|
|
204
|
+
# deduplicate: remove items with duplicate memory content
|
|
205
|
+
original_count = len(reranked_knowledge_mem)
|
|
206
|
+
seen_memories = set[Any]()
|
|
207
|
+
deduplicated_knowledge_mem = []
|
|
208
|
+
for item in reranked_knowledge_mem:
|
|
209
|
+
memory_content = item.get("memory", "")
|
|
210
|
+
if memory_content and memory_content not in seen_memories:
|
|
211
|
+
seen_memories.add(memory_content)
|
|
212
|
+
deduplicated_knowledge_mem.append(item)
|
|
213
|
+
deduplicated_count = len(deduplicated_knowledge_mem)
|
|
214
|
+
logger.info(
|
|
215
|
+
f"After filtering duplicate knowledge base text from sources, count changed from {original_count} to {deduplicated_count}"
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
reranked_knowledge_mem = deduplicated_knowledge_mem[:knowledge_mem_top_k]
|
|
219
|
+
conversation_mem_top_k = top_k - len(reranked_knowledge_mem)
|
|
220
|
+
cubeid2memories = {}
|
|
221
|
+
text_mem_res = []
|
|
222
|
+
|
|
223
|
+
for memory in reranked_knowledge_mem + conversation_mem[:conversation_mem_top_k]:
|
|
224
|
+
cube_id = memid2cubeid[memory["id"]]
|
|
225
|
+
if cube_id not in cubeid2memories:
|
|
226
|
+
cubeid2memories[cube_id] = []
|
|
227
|
+
cubeid2memories[cube_id].append(memory)
|
|
228
|
+
|
|
229
|
+
for cube_id, memories in cubeid2memories.items():
|
|
230
|
+
text_mem_res.append(
|
|
231
|
+
{
|
|
232
|
+
"cube_id": cube_id,
|
|
233
|
+
"memories": memories,
|
|
234
|
+
}
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
return text_mem_res
|
|
@@ -6,7 +6,11 @@ This module handles retrieving all memories or specific subgraphs based on queri
|
|
|
6
6
|
|
|
7
7
|
from typing import TYPE_CHECKING, Any, Literal
|
|
8
8
|
|
|
9
|
-
from memos.api.handlers.formatters_handler import
|
|
9
|
+
from memos.api.handlers.formatters_handler import (
|
|
10
|
+
format_memory_item,
|
|
11
|
+
post_process_pref_mem,
|
|
12
|
+
post_process_textual_mem,
|
|
13
|
+
)
|
|
10
14
|
from memos.api.product_models import (
|
|
11
15
|
DeleteMemoryRequest,
|
|
12
16
|
DeleteMemoryResponse,
|
|
@@ -209,54 +213,67 @@ def handle_get_memory(memory_id: str, naive_mem_cube: NaiveMemCube) -> GetMemory
|
|
|
209
213
|
def handle_get_memories(
|
|
210
214
|
get_mem_req: GetMemoryRequest, naive_mem_cube: NaiveMemCube
|
|
211
215
|
) -> GetMemoryResponse:
|
|
212
|
-
|
|
216
|
+
results: dict[str, Any] = {"text_mem": [], "pref_mem": [], "tool_mem": []}
|
|
213
217
|
memories = naive_mem_cube.text_mem.get_all(
|
|
214
218
|
user_name=get_mem_req.mem_cube_id,
|
|
215
219
|
user_id=get_mem_req.user_id,
|
|
216
220
|
page=get_mem_req.page,
|
|
217
221
|
page_size=get_mem_req.page_size,
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
222
|
+
filter=get_mem_req.filter,
|
|
223
|
+
)["nodes"]
|
|
224
|
+
|
|
225
|
+
results = post_process_textual_mem(results, memories, get_mem_req.mem_cube_id)
|
|
226
|
+
|
|
227
|
+
if not get_mem_req.include_tool_memory:
|
|
228
|
+
results["tool_mem"] = []
|
|
223
229
|
|
|
224
230
|
preferences: list[TextualMemoryItem] = []
|
|
225
|
-
total_pref = 0
|
|
226
231
|
|
|
232
|
+
format_preferences = []
|
|
227
233
|
if get_mem_req.include_preference and naive_mem_cube.pref_mem is not None:
|
|
228
234
|
filter_params: dict[str, Any] = {}
|
|
229
235
|
if get_mem_req.user_id is not None:
|
|
230
236
|
filter_params["user_id"] = get_mem_req.user_id
|
|
231
237
|
if get_mem_req.mem_cube_id is not None:
|
|
232
238
|
filter_params["mem_cube_id"] = get_mem_req.mem_cube_id
|
|
233
|
-
|
|
234
|
-
|
|
239
|
+
if get_mem_req.filter is not None:
|
|
240
|
+
# Check and remove user_id/mem_cube_id from filter if present
|
|
241
|
+
filter_copy = get_mem_req.filter.copy()
|
|
242
|
+
removed_fields = []
|
|
243
|
+
|
|
244
|
+
if "user_id" in filter_copy:
|
|
245
|
+
filter_copy.pop("user_id")
|
|
246
|
+
removed_fields.append("user_id")
|
|
247
|
+
if "mem_cube_id" in filter_copy:
|
|
248
|
+
filter_copy.pop("mem_cube_id")
|
|
249
|
+
removed_fields.append("mem_cube_id")
|
|
250
|
+
|
|
251
|
+
if removed_fields:
|
|
252
|
+
logger.warning(
|
|
253
|
+
f"Fields {removed_fields} found in filter will be ignored. "
|
|
254
|
+
f"Use request-level user_id/mem_cube_id parameters instead."
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
filter_params.update(filter_copy)
|
|
258
|
+
|
|
259
|
+
preferences, _ = naive_mem_cube.pref_mem.get_memory_by_filter(
|
|
235
260
|
filter_params, page=get_mem_req.page, page_size=get_mem_req.page_size
|
|
236
261
|
)
|
|
237
|
-
format_preferences = [format_memory_item(item) for item in preferences]
|
|
262
|
+
format_preferences = [format_memory_item(item, save_sources=False) for item in preferences]
|
|
238
263
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
data={
|
|
242
|
-
"text_mem": [
|
|
243
|
-
{
|
|
244
|
-
"cube_id": get_mem_req.mem_cube_id,
|
|
245
|
-
"memories": memories,
|
|
246
|
-
"total_nodes": total_nodes,
|
|
247
|
-
"total_edges": total_edges,
|
|
248
|
-
}
|
|
249
|
-
],
|
|
250
|
-
"pref_mem": [
|
|
251
|
-
{
|
|
252
|
-
"cube_id": get_mem_req.mem_cube_id,
|
|
253
|
-
"memories": format_preferences,
|
|
254
|
-
"total_nodes": total_pref,
|
|
255
|
-
}
|
|
256
|
-
],
|
|
257
|
-
},
|
|
264
|
+
results = post_process_pref_mem(
|
|
265
|
+
results, format_preferences, get_mem_req.mem_cube_id, get_mem_req.include_preference
|
|
258
266
|
)
|
|
259
267
|
|
|
268
|
+
# Filter to only keep text_mem, pref_mem, tool_mem
|
|
269
|
+
filtered_results = {
|
|
270
|
+
"text_mem": results.get("text_mem", []),
|
|
271
|
+
"pref_mem": results.get("pref_mem", []),
|
|
272
|
+
"tool_mem": results.get("tool_mem", []),
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
return GetMemoryResponse(message="Memories retrieved successfully", data=filtered_results)
|
|
276
|
+
|
|
260
277
|
|
|
261
278
|
def handle_delete_memories(delete_mem_req: DeleteMemoryRequest, naive_mem_cube: NaiveMemCube):
|
|
262
279
|
logger.info(
|
|
@@ -5,9 +5,12 @@ This module provides a class-based implementation of search handlers,
|
|
|
5
5
|
using dependency injection for better modularity and testability.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
+
import time
|
|
9
|
+
|
|
8
10
|
from typing import Any
|
|
9
11
|
|
|
10
12
|
from memos.api.handlers.base_handler import BaseHandler, HandlerDependencies
|
|
13
|
+
from memos.api.handlers.formatters_handler import rerank_knowledge_mem
|
|
11
14
|
from memos.api.product_models import APISearchRequest, SearchResponse
|
|
12
15
|
from memos.log import get_logger
|
|
13
16
|
from memos.memories.textual.tree_text_memory.retrieve.retrieve_utils import (
|
|
@@ -69,6 +72,18 @@ class SearchHandler(BaseHandler):
|
|
|
69
72
|
# Restore original top_k for downstream logic or response metadata
|
|
70
73
|
search_req.top_k = original_top_k
|
|
71
74
|
|
|
75
|
+
start_time = time.time()
|
|
76
|
+
text_mem = results["text_mem"]
|
|
77
|
+
results["text_mem"] = rerank_knowledge_mem(
|
|
78
|
+
self.reranker,
|
|
79
|
+
query=search_req.query,
|
|
80
|
+
text_mem=text_mem,
|
|
81
|
+
top_k=original_top_k,
|
|
82
|
+
file_mem_proportion=0.5,
|
|
83
|
+
)
|
|
84
|
+
rerank_time = time.time() - start_time
|
|
85
|
+
|
|
86
|
+
self.logger.info(f"[Knowledge_replace_memory_time] Rerank time: {rerank_time} seconds")
|
|
72
87
|
self.logger.info(
|
|
73
88
|
f"[SearchHandler] Final search results: count={len(results)} results={results}"
|
|
74
89
|
)
|
|
@@ -771,7 +771,9 @@ class GetMemoryRequest(BaseRequest):
|
|
|
771
771
|
|
|
772
772
|
mem_cube_id: str = Field(..., description="Cube ID")
|
|
773
773
|
user_id: str | None = Field(None, description="User ID")
|
|
774
|
-
include_preference: bool = Field(True, description="Whether to
|
|
774
|
+
include_preference: bool = Field(True, description="Whether to return preference memory")
|
|
775
|
+
include_tool_memory: bool = Field(False, description="Whether to return tool memory")
|
|
776
|
+
filter: dict[str, Any] | None = Field(None, description="Filter for the memory")
|
|
775
777
|
page: int | None = Field(
|
|
776
778
|
None,
|
|
777
779
|
description="Page number (starts from 1). If None, exports all data without pagination.",
|
|
@@ -19,12 +19,13 @@ class BaseGraphDB(ABC):
|
|
|
19
19
|
"""
|
|
20
20
|
|
|
21
21
|
@abstractmethod
|
|
22
|
-
def update_node(self, id: str, fields: dict[str, Any]) -> None:
|
|
22
|
+
def update_node(self, id: str, fields: dict[str, Any], user_name: str | None = None) -> None:
|
|
23
23
|
"""
|
|
24
24
|
Update attributes of an existing node.
|
|
25
25
|
Args:
|
|
26
26
|
id: Node identifier to be updated.
|
|
27
27
|
fields: Dictionary of fields to update.
|
|
28
|
+
user_name: given user_name
|
|
28
29
|
"""
|
|
29
30
|
|
|
30
31
|
@abstractmethod
|
|
@@ -70,7 +71,7 @@ class BaseGraphDB(ABC):
|
|
|
70
71
|
|
|
71
72
|
# Graph Query & Reasoning
|
|
72
73
|
@abstractmethod
|
|
73
|
-
def get_node(self, id: str, include_embedding: bool = False) -> dict[str, Any] | None:
|
|
74
|
+
def get_node(self, id: str, include_embedding: bool = False, **kwargs) -> dict[str, Any] | None:
|
|
74
75
|
"""
|
|
75
76
|
Retrieve the metadata and content of a node.
|
|
76
77
|
Args:
|
|
@@ -82,7 +83,7 @@ class BaseGraphDB(ABC):
|
|
|
82
83
|
|
|
83
84
|
@abstractmethod
|
|
84
85
|
def get_nodes(
|
|
85
|
-
self,
|
|
86
|
+
self, ids: list, include_embedding: bool = False, **kwargs
|
|
86
87
|
) -> dict[str, Any] | None:
|
|
87
88
|
"""
|
|
88
89
|
Retrieve the metadata and memory of a list of nodes.
|
|
@@ -160,13 +161,17 @@ class BaseGraphDB(ABC):
|
|
|
160
161
|
"""
|
|
161
162
|
|
|
162
163
|
@abstractmethod
|
|
163
|
-
def get_by_metadata(
|
|
164
|
+
def get_by_metadata(
|
|
165
|
+
self, filters: list[dict[str, Any]], status: str | None = None
|
|
166
|
+
) -> list[str]:
|
|
164
167
|
"""
|
|
165
168
|
Retrieve node IDs that match given metadata filters.
|
|
166
169
|
|
|
167
170
|
Args:
|
|
168
171
|
filters (dict[str, Any]): A dictionary of attribute-value filters.
|
|
169
172
|
Example: {"topic": "psychology", "importance": 2}
|
|
173
|
+
status (str, optional): Filter by status (e.g., 'activated', 'archived').
|
|
174
|
+
If None, no status filter is applied.
|
|
170
175
|
|
|
171
176
|
Returns:
|
|
172
177
|
list[str]: Node IDs whose metadata match the filter conditions.
|
|
@@ -239,13 +244,17 @@ class BaseGraphDB(ABC):
|
|
|
239
244
|
"""
|
|
240
245
|
|
|
241
246
|
@abstractmethod
|
|
242
|
-
def get_all_memory_items(
|
|
247
|
+
def get_all_memory_items(
|
|
248
|
+
self, scope: str, include_embedding: bool = False, status: str | None = None
|
|
249
|
+
) -> list[dict]:
|
|
243
250
|
"""
|
|
244
251
|
Retrieve all memory items of a specific memory_type.
|
|
245
252
|
|
|
246
253
|
Args:
|
|
247
254
|
scope (str): Must be one of 'WorkingMemory', 'LongTermMemory', or 'UserMemory'.
|
|
248
255
|
include_embedding: with/without embedding
|
|
256
|
+
status (str, optional): Filter by status (e.g., 'activated', 'archived').
|
|
257
|
+
If None, no status filter is applied.
|
|
249
258
|
|
|
250
259
|
Returns:
|
|
251
260
|
list[dict]: Full list of memory items under this scope.
|
|
@@ -916,6 +916,7 @@ class Neo4jGraphDB(BaseGraphDB):
|
|
|
916
916
|
filter: dict | None = None,
|
|
917
917
|
knowledgebase_ids: list[str] | None = None,
|
|
918
918
|
user_name_flag: bool = True,
|
|
919
|
+
status: str | None = None,
|
|
919
920
|
) -> list[str]:
|
|
920
921
|
"""
|
|
921
922
|
TODO:
|
|
@@ -933,6 +934,8 @@ class Neo4jGraphDB(BaseGraphDB):
|
|
|
933
934
|
{"field": "tags", "op": "contains", "value": "AI"},
|
|
934
935
|
...
|
|
935
936
|
]
|
|
937
|
+
status (str, optional): Filter by status (e.g., 'activated', 'archived').
|
|
938
|
+
If None, no status filter is applied.
|
|
936
939
|
|
|
937
940
|
Returns:
|
|
938
941
|
list[str]: Node IDs whose metadata match the filter conditions. (AND logic).
|
|
@@ -942,15 +945,20 @@ class Neo4jGraphDB(BaseGraphDB):
|
|
|
942
945
|
- Can be used for faceted recall or prefiltering before embedding rerank.
|
|
943
946
|
"""
|
|
944
947
|
logger.info(
|
|
945
|
-
f"[get_by_metadata] filters: {filters},user_name: {user_name},filter: {filter},knowledgebase_ids: {knowledgebase_ids}"
|
|
948
|
+
f"[get_by_metadata] filters: {filters},user_name: {user_name},filter: {filter},knowledgebase_ids: {knowledgebase_ids},status: {status}"
|
|
946
949
|
)
|
|
947
950
|
print(
|
|
948
|
-
f"[get_by_metadata] filters: {filters},user_name: {user_name},filter: {filter},knowledgebase_ids: {knowledgebase_ids}"
|
|
951
|
+
f"[get_by_metadata] filters: {filters},user_name: {user_name},filter: {filter},knowledgebase_ids: {knowledgebase_ids},status: {status}"
|
|
949
952
|
)
|
|
950
953
|
user_name = user_name if user_name else self.config.user_name
|
|
951
954
|
where_clauses = []
|
|
952
955
|
params = {}
|
|
953
956
|
|
|
957
|
+
# Add status filter if provided
|
|
958
|
+
if status:
|
|
959
|
+
where_clauses.append("n.status = $status")
|
|
960
|
+
params["status"] = status
|
|
961
|
+
|
|
954
962
|
for i, f in enumerate(filters):
|
|
955
963
|
field = f["field"]
|
|
956
964
|
op = f.get("op", "=")
|
|
@@ -1272,8 +1280,10 @@ class Neo4jGraphDB(BaseGraphDB):
|
|
|
1272
1280
|
def get_all_memory_items(
|
|
1273
1281
|
self,
|
|
1274
1282
|
scope: str,
|
|
1283
|
+
include_embedding: bool = False,
|
|
1275
1284
|
filter: dict | None = None,
|
|
1276
1285
|
knowledgebase_ids: list[str] | None = None,
|
|
1286
|
+
status: str | None = None,
|
|
1277
1287
|
**kwargs,
|
|
1278
1288
|
) -> list[dict]:
|
|
1279
1289
|
"""
|
|
@@ -1281,18 +1291,21 @@ class Neo4jGraphDB(BaseGraphDB):
|
|
|
1281
1291
|
|
|
1282
1292
|
Args:
|
|
1283
1293
|
scope (str): Must be one of 'WorkingMemory', 'LongTermMemory', or 'UserMemory'.
|
|
1294
|
+
include_embedding (bool): Whether to include embedding in results.
|
|
1284
1295
|
filter (dict, optional): Filter conditions with 'and' or 'or' logic for search results.
|
|
1285
1296
|
Example: {"and": [{"id": "xxx"}, {"A": "yyy"}]} or {"or": [{"id": "xxx"}, {"A": "yyy"}]}
|
|
1286
|
-
|
|
1297
|
+
knowledgebase_ids (list[str], optional): List of knowledgebase IDs to filter by.
|
|
1298
|
+
status (str, optional): Filter by status (e.g., 'activated', 'archived').
|
|
1299
|
+
If None, no status filter is applied.
|
|
1287
1300
|
|
|
1288
1301
|
Returns:
|
|
1289
1302
|
list[dict]: Full list of memory items under this scope.
|
|
1290
1303
|
"""
|
|
1291
1304
|
logger.info(
|
|
1292
|
-
f"[get_all_memory_items] scope: {scope},filter: {filter},knowledgebase_ids: {knowledgebase_ids}"
|
|
1305
|
+
f"[get_all_memory_items] scope: {scope},filter: {filter},knowledgebase_ids: {knowledgebase_ids},status: {status}"
|
|
1293
1306
|
)
|
|
1294
1307
|
print(
|
|
1295
|
-
f"[get_all_memory_items] scope: {scope},filter: {filter},knowledgebase_ids: {knowledgebase_ids}"
|
|
1308
|
+
f"[get_all_memory_items] scope: {scope},filter: {filter},knowledgebase_ids: {knowledgebase_ids},status: {status}"
|
|
1296
1309
|
)
|
|
1297
1310
|
|
|
1298
1311
|
user_name = kwargs.get("user_name") if kwargs.get("user_name") else self.config.user_name
|
|
@@ -1302,6 +1315,11 @@ class Neo4jGraphDB(BaseGraphDB):
|
|
|
1302
1315
|
where_clauses = ["n.memory_type = $scope"]
|
|
1303
1316
|
params = {"scope": scope}
|
|
1304
1317
|
|
|
1318
|
+
# Add status filter if provided
|
|
1319
|
+
if status:
|
|
1320
|
+
where_clauses.append("n.status = $status")
|
|
1321
|
+
params["status"] = status
|
|
1322
|
+
|
|
1305
1323
|
# Build user_name filter with knowledgebase_ids support (OR relationship) using common method
|
|
1306
1324
|
user_name_conditions, user_name_params = self._build_user_name_and_kb_ids_conditions_cypher(
|
|
1307
1325
|
user_name=user_name,
|