MemoryOS 2.0.2__tar.gz → 2.0.3__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.2 → memoryos-2.0.3}/PKG-INFO +1 -1
- {memoryos-2.0.2 → memoryos-2.0.3}/pyproject.toml +1 -1
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/__init__.py +1 -1
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/config.py +3 -1
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/component_init.py +16 -13
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/config_builders.py +1 -1
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/formatters_handler.py +2 -2
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/mcp_serve.py +61 -19
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/start_api.py +1 -1
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/cli.py +1 -1
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/graph_dbs/neo4j.py +10 -1
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/graph_dbs/neo4j_community.py +9 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/graph_dbs/polardb.py +37 -5
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/hf.py +1 -1
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_feedback/feedback.py +9 -5
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_feedback/simple_feedback.py +2 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/image_parser.py +15 -17
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/utils.py +1 -1
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/simple_struct.py +24 -7
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/utils.py +1 -1
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/base_scheduler.py +8 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/general_modules/init_components_for_scheduler.py +1 -1
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/optimized_scheduler.py +27 -5
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/orm_modules/api_redis_model.py +3 -2
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py +9 -26
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/factory.py +4 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/http_bge.py +8 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/http_bge_strategy.py +8 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/mem_reader_prompts.py +65 -9
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/utils.py +2 -1
- {memoryos-2.0.2 → memoryos-2.0.3}/LICENSE +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/README.md +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/client.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/context/dependencies.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/exceptions.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/add_handler.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/base_handler.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/chat_handler.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/feedback_handler.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/memory_handler.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/scheduler_handler.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/search_handler.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/handlers/suggestion_handler.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/middleware/request_context.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/product_api.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/product_models.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/routers/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/routers/product_router.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/routers/server_router.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/api/server_api.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/chunkers/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/chunkers/base.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/chunkers/charactertext_chunker.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/chunkers/factory.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/chunkers/markdown_chunker.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/chunkers/sentence_chunker.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/chunkers/simple_chunker.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/base.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/chunker.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/embedder.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/graph_db.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/internet_retriever.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/llm.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/mem_agent.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/mem_chat.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/mem_cube.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/mem_os.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/mem_reader.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/mem_scheduler.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/mem_user.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/memory.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/parser.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/reranker.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/utils.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/configs/vec_db.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/context/context.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/dependency.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/deprecation.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/embedders/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/embedders/ark.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/embedders/base.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/embedders/factory.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/embedders/ollama.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/embedders/sentence_transformer.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/embedders/universal_api.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/exceptions.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/graph_dbs/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/graph_dbs/base.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/graph_dbs/factory.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/graph_dbs/item.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/graph_dbs/nebular.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/hello_world.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/base.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/deepseek.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/factory.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/hf_singleton.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/ollama.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/openai.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/openai_new.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/qwen.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/utils.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/llms/vllm.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/log.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_agent/base.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_agent/deepsearch_agent.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_agent/factory.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_chat/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_chat/base.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_chat/factory.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_chat/simple.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_cube/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_cube/base.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_cube/general.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_cube/navie.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_cube/utils.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_feedback/base.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_feedback/utils.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_os/client.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_os/core.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_os/main.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_os/product.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_os/product_server.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_os/utils/default_config.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_os/utils/format_utils.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_os/utils/reference_utils.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/base.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/factory.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/memory.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/multi_modal_struct.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/assistant_parser.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/base.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/file_content_parser.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/multi_modal_parser.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/string_parser.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/system_parser.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/text_content_parser.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/tool_parser.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/read_multi_modal/user_parser.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_reader/strategy_struct.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/analyzer/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/analyzer/api_analyzer.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/analyzer/eval_analyzer.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/analyzer/mos_for_test_scheduler.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/analyzer/scheduler_for_eval.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/general_modules/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/general_modules/api_misc.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/general_modules/base.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/general_modules/misc.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/general_modules/scheduler_logger.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/general_modules/task_threads.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/general_scheduler.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/memory_manage_modules/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/memory_manage_modules/memory_filter.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/memory_manage_modules/retriever.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/monitors/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/monitors/dispatcher_monitor.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/monitors/general_monitor.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/monitors/task_schedule_monitor.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/orm_modules/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/orm_modules/base_model.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/orm_modules/monitor_models.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/orm_modules/redis_model.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/scheduler_factory.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/schemas/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/schemas/analyzer_schemas.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/schemas/api_schemas.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/schemas/general_schemas.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/schemas/message_schemas.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/schemas/monitor_schemas.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/schemas/task_schemas.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/task_schedule_modules/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/task_schedule_modules/dispatcher.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/task_schedule_modules/local_queue.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/task_schedule_modules/orchestrator.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/task_schedule_modules/task_queue.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/utils/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/utils/api_utils.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/utils/config_utils.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/utils/db_utils.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/utils/filter_utils.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/utils/metrics.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/utils/misc_utils.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/utils/monitor_event_utils.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/utils/status_tracker.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/webservice_modules/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_scheduler/webservice_modules/redis_service.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_user/factory.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_user/mysql_persistent_user_manager.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_user/mysql_user_manager.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_user/persistent_factory.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_user/persistent_user_manager.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_user/redis_persistent_user_manager.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/mem_user/user_manager.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/activation/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/activation/base.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/activation/item.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/activation/kv.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/activation/vllmkv.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/base.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/factory.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/parametric/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/parametric/base.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/parametric/item.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/parametric/lora.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/base.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/general.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/item.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/naive.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/prefer_text_memory/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/prefer_text_memory/adder.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/prefer_text_memory/config.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/prefer_text_memory/extractor.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/prefer_text_memory/factory.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/prefer_text_memory/retrievers.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/prefer_text_memory/spliter.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/prefer_text_memory/utils.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/preference.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/simple_preference.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/simple_tree.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/organize/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/organize/handler.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/organize/manager.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/organize/relation_reason_detector.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/organize/reorganizer.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/advanced_searcher.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/bm25_util.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/bochasearch.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever_factory.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/reasoner.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/recall.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/reranker.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/retrieval_mid_structs.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/retrieve_utils.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/task_goal_parser.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/utils.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memories/textual/tree_text_memory/retrieve/xinyusearch.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memos_tools/dinding_report_bot.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memos_tools/lockfree_dict.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memos_tools/notification_service.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memos_tools/notification_utils.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memos_tools/singleton.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memos_tools/thread_safe_dict.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/memos_tools/thread_safe_dict_segment.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/multi_mem_cube/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/multi_mem_cube/composite_cube.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/multi_mem_cube/single_cube.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/multi_mem_cube/views.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/parsers/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/parsers/base.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/parsers/factory.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/parsers/markitdown.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/base.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/concat.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/cosine_local.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/noop.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/strategies/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/strategies/base.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/strategies/concat_background.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/strategies/concat_docsource.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/strategies/dialogue_common.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/strategies/factory.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/strategies/single_turn.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/reranker/strategies/singleturn_outmem.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/settings.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/advanced_search_prompts.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/cloud_service_prompt.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/instruction_completion.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/mem_agent_prompts.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/mem_feedback_prompts.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/mem_reader_strategy_prompts.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/mem_scheduler_prompts.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/mem_search_prompts.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/mos_prompts.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/prefer_complete_prompt.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/tool_mem_prompts.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/templates/tree_reorganize_prompts.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/general_types.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_assistant_message_param.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_image_param.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_input_audio_param.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_param.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_refusal_param.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_text_param.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_message_custom_tool_call_param.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_message_function_tool_call_param.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_message_param.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_message_tool_call_union_param.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_system_message_param.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_tool_message_param.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/types/openai_chat_completion_types/chat_completion_user_message_param.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/vec_dbs/__init__.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/vec_dbs/base.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/vec_dbs/factory.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/vec_dbs/item.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/vec_dbs/milvus.py +0 -0
- {memoryos-2.0.2 → memoryos-2.0.3}/src/memos/vec_dbs/qdrant.py +0 -0
|
@@ -23,7 +23,7 @@ if TYPE_CHECKING:
|
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
# Load environment variables
|
|
26
|
-
load_dotenv()
|
|
26
|
+
load_dotenv(override=True)
|
|
27
27
|
|
|
28
28
|
logger = logging.getLogger(__name__)
|
|
29
29
|
|
|
@@ -410,6 +410,8 @@ class APIConfig:
|
|
|
410
410
|
"url": os.getenv("MOS_RERANKER_URL", "localhost:8000/v1/rerank"),
|
|
411
411
|
"model": os.getenv("MOS_FEEDBACK_RERANKER_MODEL", "bge-reranker-v2-m3"),
|
|
412
412
|
"timeout": 10,
|
|
413
|
+
"max_query_tokens": int(os.getenv("MOS_RERANKER_MAX_TOKENS", 8000)),
|
|
414
|
+
"concate_len": int(os.getenv("MOS_RERANKER_CONCAT_LEN", 1000)),
|
|
413
415
|
"headers_extra": json.loads(os.getenv("MOS_RERANKER_HEADERS_EXTRA", "{}")),
|
|
414
416
|
"rerank_source": os.getenv("MOS_RERANK_SOURCE"),
|
|
415
417
|
"reranker_strategy": os.getenv("MOS_RERANKER_STRATEGY", "single_turn"),
|
|
@@ -133,19 +133,22 @@ def init_server() -> dict[str, Any]:
|
|
|
133
133
|
logger.info("Initializing MemOS server components...")
|
|
134
134
|
|
|
135
135
|
# Initialize Redis client first as it is a core dependency for features like scheduler status tracking
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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
|
|
149
152
|
|
|
150
153
|
# Get default cube configuration
|
|
151
154
|
default_cube_config = APIConfig.get_default_cube_config()
|
|
@@ -89,7 +89,7 @@ def build_chat_llm_config() -> list[dict[str, Any]]:
|
|
|
89
89
|
Returns:
|
|
90
90
|
Validated chat LLM configuration dictionary
|
|
91
91
|
"""
|
|
92
|
-
configs = json.loads(os.getenv("CHAT_MODEL_LIST"))
|
|
92
|
+
configs = json.loads(os.getenv("CHAT_MODEL_LIST", "[]"))
|
|
93
93
|
return [
|
|
94
94
|
{
|
|
95
95
|
"config_class": LLMConfigFactory.model_validate(
|
|
@@ -144,7 +144,7 @@ def separate_knowledge_and_conversation_mem(memories: list[dict[str, Any]]):
|
|
|
144
144
|
knowledge_mem = []
|
|
145
145
|
conversation_mem = []
|
|
146
146
|
for item in memories:
|
|
147
|
-
sources = item
|
|
147
|
+
sources = item.get("metadata", {}).get("sources", [])
|
|
148
148
|
if (
|
|
149
149
|
len(sources) > 0
|
|
150
150
|
and "type" in sources[0]
|
|
@@ -199,7 +199,7 @@ def rerank_knowledge_mem(
|
|
|
199
199
|
item["metadata"]["sources"] = []
|
|
200
200
|
|
|
201
201
|
for item in conversation_mem:
|
|
202
|
-
item
|
|
202
|
+
item.setdefault("metadata", {})["sources"] = []
|
|
203
203
|
|
|
204
204
|
# deduplicate: remove items with duplicate memory content
|
|
205
205
|
original_count = len(reranked_knowledge_mem)
|
|
@@ -61,6 +61,19 @@ def load_default_config(user_id="default_user"):
|
|
|
61
61
|
"SCHEDULER_TOP_N": "scheduler_top_n",
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
+
# Fields that should always be kept as strings (not converted to numbers)
|
|
65
|
+
string_only_fields = {
|
|
66
|
+
"openai_api_key",
|
|
67
|
+
"openai_api_base",
|
|
68
|
+
"neo4j_uri",
|
|
69
|
+
"neo4j_user",
|
|
70
|
+
"neo4j_password",
|
|
71
|
+
"neo4j_db_name",
|
|
72
|
+
"text_mem_type",
|
|
73
|
+
"model_name",
|
|
74
|
+
"embedder_model",
|
|
75
|
+
}
|
|
76
|
+
|
|
64
77
|
kwargs = {"user_id": user_id}
|
|
65
78
|
for env_key, param_key in env_mapping.items():
|
|
66
79
|
val = os.getenv(env_key)
|
|
@@ -74,6 +87,9 @@ def load_default_config(user_id="default_user"):
|
|
|
74
87
|
# Handle boolean conversions
|
|
75
88
|
if val.lower() in ("true", "false"):
|
|
76
89
|
kwargs[param_key] = val.lower() == "true"
|
|
90
|
+
# Keep certain fields as strings
|
|
91
|
+
elif param_key in string_only_fields:
|
|
92
|
+
kwargs[param_key] = val
|
|
77
93
|
else:
|
|
78
94
|
# Try numeric conversions (int first, then float)
|
|
79
95
|
try:
|
|
@@ -93,6 +109,10 @@ def load_default_config(user_id="default_user"):
|
|
|
93
109
|
openai_api_base = kwargs.pop("openai_api_base", "https://api.openai.com/v1")
|
|
94
110
|
text_mem_type = kwargs.pop("text_mem_type", "tree_text")
|
|
95
111
|
|
|
112
|
+
# Ensure embedder_model has a default value if not set
|
|
113
|
+
if "embedder_model" not in kwargs:
|
|
114
|
+
kwargs["embedder_model"] = os.getenv("EMBEDDER_MODEL", "nomic-embed-text:latest")
|
|
115
|
+
|
|
96
116
|
config, cube = get_default(
|
|
97
117
|
openai_api_key=openai_api_key,
|
|
98
118
|
openai_api_base=openai_api_base,
|
|
@@ -110,6 +130,21 @@ class MOSMCPStdioServer:
|
|
|
110
130
|
self.mos_core.register_mem_cube(cube)
|
|
111
131
|
self._setup_tools()
|
|
112
132
|
|
|
133
|
+
|
|
134
|
+
class MOSMCPServer:
|
|
135
|
+
"""MCP Server that accepts an existing MOS instance."""
|
|
136
|
+
|
|
137
|
+
def __init__(self, mos_instance: MOS | None = None):
|
|
138
|
+
self.mcp = FastMCP("MOS Memory System")
|
|
139
|
+
if mos_instance is None:
|
|
140
|
+
# Fall back to creating from default config
|
|
141
|
+
config, cube = load_default_config()
|
|
142
|
+
self.mos_core = MOS(config=config)
|
|
143
|
+
self.mos_core.register_mem_cube(cube)
|
|
144
|
+
else:
|
|
145
|
+
self.mos_core = mos_instance
|
|
146
|
+
self._setup_tools()
|
|
147
|
+
|
|
113
148
|
def _setup_tools(self):
|
|
114
149
|
"""Setup MCP tools"""
|
|
115
150
|
|
|
@@ -133,7 +168,10 @@ class MOSMCPStdioServer:
|
|
|
133
168
|
response = self.mos_core.chat(query, user_id)
|
|
134
169
|
return response
|
|
135
170
|
except Exception as e:
|
|
136
|
-
|
|
171
|
+
import traceback
|
|
172
|
+
|
|
173
|
+
error_details = traceback.format_exc()
|
|
174
|
+
return f"Chat error: {e!s}\nTraceback:\n{error_details}"
|
|
137
175
|
|
|
138
176
|
@self.mcp.tool()
|
|
139
177
|
async def create_user(
|
|
@@ -261,7 +299,10 @@ class MOSMCPStdioServer:
|
|
|
261
299
|
result = self.mos_core.search(query, user_id, cube_ids)
|
|
262
300
|
return result
|
|
263
301
|
except Exception as e:
|
|
264
|
-
|
|
302
|
+
import traceback
|
|
303
|
+
|
|
304
|
+
error_details = traceback.format_exc()
|
|
305
|
+
return {"error": str(e), "traceback": error_details}
|
|
265
306
|
|
|
266
307
|
@self.mcp.tool()
|
|
267
308
|
async def add_memory(
|
|
@@ -527,23 +568,24 @@ class MOSMCPStdioServer:
|
|
|
527
568
|
except Exception as e:
|
|
528
569
|
return f"Error controlling memory scheduler: {e!s}"
|
|
529
570
|
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
571
|
+
|
|
572
|
+
def _run_mcp(self, transport: str = "stdio", **kwargs):
|
|
573
|
+
if transport == "stdio":
|
|
574
|
+
self.mcp.run(transport="stdio")
|
|
575
|
+
elif transport == "http":
|
|
576
|
+
host = kwargs.get("host", "localhost")
|
|
577
|
+
port = kwargs.get("port", 8000)
|
|
578
|
+
asyncio.run(self.mcp.run_http_async(host=host, port=port))
|
|
579
|
+
elif transport == "sse":
|
|
580
|
+
host = kwargs.get("host", "localhost")
|
|
581
|
+
port = kwargs.get("port", 8000)
|
|
582
|
+
self.mcp.run(transport="sse", host=host, port=port)
|
|
583
|
+
else:
|
|
584
|
+
raise ValueError(f"Unsupported transport: {transport}")
|
|
585
|
+
|
|
586
|
+
|
|
587
|
+
MOSMCPStdioServer.run = _run_mcp
|
|
588
|
+
MOSMCPServer.run = _run_mcp
|
|
547
589
|
|
|
548
590
|
|
|
549
591
|
# Usage example
|
|
@@ -13,7 +13,7 @@ from io import BytesIO
|
|
|
13
13
|
|
|
14
14
|
def export_openapi(output: str) -> bool:
|
|
15
15
|
"""Export OpenAPI schema to JSON file."""
|
|
16
|
-
from memos.api.
|
|
16
|
+
from memos.api.server_api import app
|
|
17
17
|
|
|
18
18
|
# Create directory if it doesn't exist
|
|
19
19
|
if os.path.dirname(output):
|
|
@@ -209,6 +209,10 @@ class Neo4jGraphDB(BaseGraphDB):
|
|
|
209
209
|
# Flatten info fields to top level (for Neo4j flat structure)
|
|
210
210
|
metadata = _flatten_info_fields(metadata)
|
|
211
211
|
|
|
212
|
+
# Initialize delete_time and delete_record_id fields
|
|
213
|
+
metadata.setdefault("delete_time", "")
|
|
214
|
+
metadata.setdefault("delete_record_id", "")
|
|
215
|
+
|
|
212
216
|
# Merge node and set metadata
|
|
213
217
|
created_at = metadata.pop("created_at")
|
|
214
218
|
updated_at = metadata.pop("updated_at")
|
|
@@ -251,6 +255,7 @@ class Neo4jGraphDB(BaseGraphDB):
|
|
|
251
255
|
- metadata: dict[str, Any] - Node metadata
|
|
252
256
|
user_name: Optional user name (will use config default if not provided)
|
|
253
257
|
"""
|
|
258
|
+
logger.info("neo4j [add_nodes_batch] staring")
|
|
254
259
|
if not nodes:
|
|
255
260
|
logger.warning("[add_nodes_batch] Empty nodes list, skipping")
|
|
256
261
|
return
|
|
@@ -280,6 +285,10 @@ class Neo4jGraphDB(BaseGraphDB):
|
|
|
280
285
|
# Flatten info fields to top level (for Neo4j flat structure)
|
|
281
286
|
metadata = _flatten_info_fields(metadata)
|
|
282
287
|
|
|
288
|
+
# Initialize delete_time and delete_record_id fields
|
|
289
|
+
metadata.setdefault("delete_time", "")
|
|
290
|
+
metadata.setdefault("delete_record_id", "")
|
|
291
|
+
|
|
283
292
|
# Merge node and set metadata
|
|
284
293
|
created_at = metadata.pop("created_at")
|
|
285
294
|
updated_at = metadata.pop("updated_at")
|
|
@@ -1705,7 +1714,7 @@ class Neo4jGraphDB(BaseGraphDB):
|
|
|
1705
1714
|
node.pop("user_name", None)
|
|
1706
1715
|
|
|
1707
1716
|
# serialization
|
|
1708
|
-
if node
|
|
1717
|
+
if node.get("sources"):
|
|
1709
1718
|
for idx in range(len(node["sources"])):
|
|
1710
1719
|
if not (
|
|
1711
1720
|
isinstance(node["sources"][idx], str)
|
|
@@ -56,6 +56,10 @@ class Neo4jCommunityGraphDB(Neo4jGraphDB):
|
|
|
56
56
|
# Safely process metadata
|
|
57
57
|
metadata = _prepare_node_metadata(metadata)
|
|
58
58
|
|
|
59
|
+
# Initialize delete_time and delete_record_id fields
|
|
60
|
+
metadata.setdefault("delete_time", "")
|
|
61
|
+
metadata.setdefault("delete_record_id", "")
|
|
62
|
+
|
|
59
63
|
# serialization
|
|
60
64
|
if metadata["sources"]:
|
|
61
65
|
for idx in range(len(metadata["sources"])):
|
|
@@ -105,6 +109,7 @@ class Neo4jCommunityGraphDB(Neo4jGraphDB):
|
|
|
105
109
|
)
|
|
106
110
|
|
|
107
111
|
def add_nodes_batch(self, nodes: list[dict[str, Any]], user_name: str | None = None) -> None:
|
|
112
|
+
print("neo4j_community add_nodes_batch:")
|
|
108
113
|
if not nodes:
|
|
109
114
|
logger.warning("[add_nodes_batch] Empty nodes list, skipping")
|
|
110
115
|
return
|
|
@@ -130,6 +135,10 @@ class Neo4jCommunityGraphDB(Neo4jGraphDB):
|
|
|
130
135
|
metadata = _prepare_node_metadata(metadata)
|
|
131
136
|
metadata = _flatten_info_fields(metadata)
|
|
132
137
|
|
|
138
|
+
# Initialize delete_time and delete_record_id fields
|
|
139
|
+
metadata.setdefault("delete_time", "")
|
|
140
|
+
metadata.setdefault("delete_record_id", "")
|
|
141
|
+
|
|
133
142
|
embedding = metadata.pop("embedding", None)
|
|
134
143
|
if embedding is None:
|
|
135
144
|
raise ValueError(f"Missing 'embedding' in metadata for node {node_id}")
|
|
@@ -835,6 +835,11 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
835
835
|
def add_edge(
|
|
836
836
|
self, source_id: str, target_id: str, type: str, user_name: str | None = None
|
|
837
837
|
) -> None:
|
|
838
|
+
logger.info(
|
|
839
|
+
f"polardb [add_edge] source_id: {source_id}, target_id: {target_id}, type: {type},user_name:{user_name}"
|
|
840
|
+
)
|
|
841
|
+
|
|
842
|
+
start_time = time.time()
|
|
838
843
|
if not source_id or not target_id:
|
|
839
844
|
logger.warning(f"Edge '{source_id}' and '{target_id}' are both None")
|
|
840
845
|
raise ValueError("[add_edge] source_id and target_id must be provided")
|
|
@@ -864,13 +869,16 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
864
869
|
AND end_id = ag_catalog._make_graph_id('{self.db_name}_graph'::name, 'Memory'::name, '{target_id}'::text::cstring)
|
|
865
870
|
);
|
|
866
871
|
"""
|
|
867
|
-
|
|
872
|
+
logger.info(f"polardb [add_edge] query: {query}, properties: {json.dumps(properties)}")
|
|
868
873
|
conn = None
|
|
869
874
|
try:
|
|
870
875
|
conn = self._get_connection()
|
|
871
876
|
with conn.cursor() as cursor:
|
|
872
877
|
cursor.execute(query, (source_id, target_id, type, json.dumps(properties)))
|
|
873
878
|
logger.info(f"Edge created: {source_id} -[{type}]-> {target_id}")
|
|
879
|
+
|
|
880
|
+
elapsed_time = time.time() - start_time
|
|
881
|
+
logger.info(f" polardb [add_edge] insert completed time in {elapsed_time:.2f}s")
|
|
874
882
|
except Exception as e:
|
|
875
883
|
logger.error(f"Failed to insert edge: {e}", exc_info=True)
|
|
876
884
|
raise
|
|
@@ -1033,7 +1041,10 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
1033
1041
|
Returns:
|
|
1034
1042
|
dict: Node properties as key-value pairs, or None if not found.
|
|
1035
1043
|
"""
|
|
1036
|
-
|
|
1044
|
+
logger.info(
|
|
1045
|
+
f"polardb [get_node] id: {id}, include_embedding: {include_embedding}, user_name: {user_name}"
|
|
1046
|
+
)
|
|
1047
|
+
start_time = time.time()
|
|
1037
1048
|
select_fields = "id, properties, embedding" if include_embedding else "id, properties"
|
|
1038
1049
|
|
|
1039
1050
|
query = f"""
|
|
@@ -1048,6 +1059,7 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
1048
1059
|
query += "\nAND ag_catalog.agtype_access_operator(properties, '\"user_name\"'::agtype) = %s::agtype"
|
|
1049
1060
|
params.append(self.format_param_value(user_name))
|
|
1050
1061
|
|
|
1062
|
+
logger.info(f"polardb [get_node] query: {query},params: {params}")
|
|
1051
1063
|
conn = None
|
|
1052
1064
|
try:
|
|
1053
1065
|
conn = self._get_connection()
|
|
@@ -1084,6 +1096,10 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
1084
1096
|
except (json.JSONDecodeError, TypeError):
|
|
1085
1097
|
logger.warning(f"Failed to parse embedding for node {id}")
|
|
1086
1098
|
|
|
1099
|
+
elapsed_time = time.time() - start_time
|
|
1100
|
+
logger.info(
|
|
1101
|
+
f" polardb [get_node] get_node completed time in {elapsed_time:.2f}s"
|
|
1102
|
+
)
|
|
1087
1103
|
return self._parse_node(
|
|
1088
1104
|
{
|
|
1089
1105
|
"id": id,
|
|
@@ -1879,7 +1895,7 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
1879
1895
|
filter: dict | None = None,
|
|
1880
1896
|
knowledgebase_ids: list[str] | None = None,
|
|
1881
1897
|
tsvector_field: str = "properties_tsvector_zh",
|
|
1882
|
-
tsquery_config: str = "
|
|
1898
|
+
tsquery_config: str = "jiebacfg",
|
|
1883
1899
|
**kwargs,
|
|
1884
1900
|
) -> list[dict]:
|
|
1885
1901
|
"""
|
|
@@ -1902,7 +1918,11 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
1902
1918
|
Returns:
|
|
1903
1919
|
list[dict]: result list containing id and score
|
|
1904
1920
|
"""
|
|
1921
|
+
logger.info(
|
|
1922
|
+
f"[search_by_fulltext] query_words: {query_words},top_k:{top_k},scope:{scope},status:{status},threshold:{threshold},search_filter:{search_filter},user_name:{user_name},knowledgebase_ids:{knowledgebase_ids},filter:{filter}"
|
|
1923
|
+
)
|
|
1905
1924
|
# Build WHERE clause dynamically, same as search_by_embedding
|
|
1925
|
+
start_time = time.time()
|
|
1906
1926
|
where_clauses = []
|
|
1907
1927
|
|
|
1908
1928
|
if scope:
|
|
@@ -1924,6 +1944,7 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
1924
1944
|
knowledgebase_ids=knowledgebase_ids,
|
|
1925
1945
|
default_user_name=self.config.user_name,
|
|
1926
1946
|
)
|
|
1947
|
+
logger.info(f"[search_by_fulltext] user_name_conditions: {user_name_conditions}")
|
|
1927
1948
|
|
|
1928
1949
|
# Add OR condition if we have any user_name conditions
|
|
1929
1950
|
if user_name_conditions:
|
|
@@ -1946,6 +1967,8 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
1946
1967
|
|
|
1947
1968
|
# Build filter conditions using common method
|
|
1948
1969
|
filter_conditions = self._build_filter_conditions_sql(filter)
|
|
1970
|
+
logger.info(f"[search_by_fulltext] filter_conditions: {filter_conditions}")
|
|
1971
|
+
|
|
1949
1972
|
where_clauses.extend(filter_conditions)
|
|
1950
1973
|
# Add fulltext search condition
|
|
1951
1974
|
# Convert query_text to OR query format: "word1 | word2 | word3"
|
|
@@ -1955,6 +1978,8 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
1955
1978
|
|
|
1956
1979
|
where_clause = f"WHERE {' AND '.join(where_clauses)}" if where_clauses else ""
|
|
1957
1980
|
|
|
1981
|
+
logger.info(f"[search_by_fulltext] where_clause: {where_clause}")
|
|
1982
|
+
|
|
1958
1983
|
# Build fulltext search query
|
|
1959
1984
|
query = f"""
|
|
1960
1985
|
SELECT
|
|
@@ -1986,7 +2011,10 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
1986
2011
|
# Apply threshold filter if specified
|
|
1987
2012
|
if threshold is None or score_val >= threshold:
|
|
1988
2013
|
output.append({"id": id_val, "score": score_val})
|
|
1989
|
-
|
|
2014
|
+
elapsed_time = time.time() - start_time
|
|
2015
|
+
logger.info(
|
|
2016
|
+
f" polardb [search_by_fulltext] query completed time in {elapsed_time:.2f}s"
|
|
2017
|
+
)
|
|
1990
2018
|
return output[:top_k]
|
|
1991
2019
|
finally:
|
|
1992
2020
|
self._return_connection(conn)
|
|
@@ -3394,6 +3422,8 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
3394
3422
|
"memory": memory,
|
|
3395
3423
|
"created_at": created_at,
|
|
3396
3424
|
"updated_at": updated_at,
|
|
3425
|
+
"delete_time": "",
|
|
3426
|
+
"delete_record_id": "",
|
|
3397
3427
|
**metadata,
|
|
3398
3428
|
}
|
|
3399
3429
|
|
|
@@ -3535,6 +3565,8 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
3535
3565
|
"memory": memory,
|
|
3536
3566
|
"created_at": created_at,
|
|
3537
3567
|
"updated_at": updated_at,
|
|
3568
|
+
"delete_time": "",
|
|
3569
|
+
"delete_record_id": "",
|
|
3538
3570
|
**metadata,
|
|
3539
3571
|
}
|
|
3540
3572
|
|
|
@@ -4281,7 +4313,7 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
4281
4313
|
user_name_conditions = []
|
|
4282
4314
|
effective_user_name = user_name if user_name else default_user_name
|
|
4283
4315
|
|
|
4284
|
-
if effective_user_name:
|
|
4316
|
+
if effective_user_name and default_user_name != "xxx":
|
|
4285
4317
|
user_name_conditions.append(
|
|
4286
4318
|
f"ag_catalog.agtype_access_operator(properties, '\"user_name\"'::agtype) = '\"{effective_user_name}\"'::agtype"
|
|
4287
4319
|
)
|
|
@@ -51,7 +51,7 @@ class HFLLM(BaseLLM):
|
|
|
51
51
|
self.config.model_name_or_path, torch_dtype="auto", device_map="auto"
|
|
52
52
|
)
|
|
53
53
|
self.tokenizer = AutoTokenizer.from_pretrained(
|
|
54
|
-
self.config.model_name_or_path, use_fast=True
|
|
54
|
+
self.config.model_name_or_path, use_fast=True, force_download=True
|
|
55
55
|
)
|
|
56
56
|
|
|
57
57
|
# Logits processors for sampling
|
|
@@ -96,6 +96,7 @@ class MemFeedback(BaseMemFeedback):
|
|
|
96
96
|
self.searcher: Searcher = None
|
|
97
97
|
self.reranker = None
|
|
98
98
|
self.pref_mem: SimplePreferenceTextMemory = None
|
|
99
|
+
self.pref_feedback: bool = False
|
|
99
100
|
self.DB_IDX_READY = False
|
|
100
101
|
|
|
101
102
|
@require_python_package(
|
|
@@ -630,11 +631,14 @@ class MemFeedback(BaseMemFeedback):
|
|
|
630
631
|
)
|
|
631
632
|
retrieved_mems = [item[0] for item in retrieved_mems if float(item[1]) > 0.01]
|
|
632
633
|
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
634
|
+
if self.pref_feedback:
|
|
635
|
+
pref_info = {}
|
|
636
|
+
if "user_id" in info:
|
|
637
|
+
pref_info = {"user_id": info["user_id"]}
|
|
638
|
+
retrieved_prefs = self.pref_mem.search(query, top_k, pref_info)
|
|
639
|
+
return retrieved_mems + retrieved_prefs
|
|
640
|
+
else:
|
|
641
|
+
return retrieved_mems
|
|
638
642
|
|
|
639
643
|
def _vec_query(self, new_memories_embedding: list[float], user_name=None):
|
|
640
644
|
"""Vector retrieval query"""
|
|
@@ -25,6 +25,7 @@ class SimpleMemFeedback(MemFeedback):
|
|
|
25
25
|
searcher: Searcher,
|
|
26
26
|
reranker: BaseReranker,
|
|
27
27
|
pref_mem: SimplePreferenceTextMemory,
|
|
28
|
+
pref_feedback: bool = False,
|
|
28
29
|
):
|
|
29
30
|
self.llm = llm
|
|
30
31
|
self.embedder = embedder
|
|
@@ -36,3 +37,4 @@ class SimpleMemFeedback(MemFeedback):
|
|
|
36
37
|
self.pref_mem = pref_mem
|
|
37
38
|
self.reranker = reranker
|
|
38
39
|
self.DB_IDX_READY = False
|
|
40
|
+
self.pref_feedback = pref_feedback
|
|
@@ -151,6 +151,17 @@ class ImageParser(BaseMessageParser):
|
|
|
151
151
|
IMAGE_ANALYSIS_PROMPT_ZH if lang == "zh" else IMAGE_ANALYSIS_PROMPT_EN
|
|
152
152
|
)
|
|
153
153
|
|
|
154
|
+
# Add context if available
|
|
155
|
+
context_text = ""
|
|
156
|
+
if context_items:
|
|
157
|
+
for item in context_items:
|
|
158
|
+
if hasattr(item, "memory") and item.memory:
|
|
159
|
+
context_text += f"{item.memory}\n"
|
|
160
|
+
context_text = context_text.strip()
|
|
161
|
+
|
|
162
|
+
# Inject context into prompt when possible
|
|
163
|
+
image_analysis_prompt = image_analysis_prompt.replace("{context}", context_text)
|
|
164
|
+
|
|
154
165
|
# Build messages with image content
|
|
155
166
|
messages = [
|
|
156
167
|
{
|
|
@@ -168,21 +179,6 @@ class ImageParser(BaseMessageParser):
|
|
|
168
179
|
}
|
|
169
180
|
]
|
|
170
181
|
|
|
171
|
-
# Add context if available
|
|
172
|
-
if context_items:
|
|
173
|
-
context_text = ""
|
|
174
|
-
for item in context_items:
|
|
175
|
-
if hasattr(item, "memory") and item.memory:
|
|
176
|
-
context_text += f"{item.memory}\n"
|
|
177
|
-
if context_text:
|
|
178
|
-
messages.insert(
|
|
179
|
-
0,
|
|
180
|
-
{
|
|
181
|
-
"role": "system",
|
|
182
|
-
"content": f"Context from previous conversation:\n{context_text}",
|
|
183
|
-
},
|
|
184
|
-
)
|
|
185
|
-
|
|
186
182
|
try:
|
|
187
183
|
# Call LLM with vision model
|
|
188
184
|
response_text = self.llm.generate(messages)
|
|
@@ -192,6 +188,9 @@ class ImageParser(BaseMessageParser):
|
|
|
192
188
|
|
|
193
189
|
# Parse JSON response
|
|
194
190
|
response_json = self._parse_json_result(response_text)
|
|
191
|
+
if not response_json:
|
|
192
|
+
logger.warning(f"[ImageParser] Fail to parse response from LLM: {response_text}")
|
|
193
|
+
return []
|
|
195
194
|
|
|
196
195
|
# Extract memory items from response
|
|
197
196
|
memory_items = []
|
|
@@ -323,8 +322,7 @@ class ImageParser(BaseMessageParser):
|
|
|
323
322
|
return json.loads(s)
|
|
324
323
|
except json.JSONDecodeError:
|
|
325
324
|
pass
|
|
326
|
-
logger.
|
|
327
|
-
return {}
|
|
325
|
+
logger.warning(f"[ImageParser] Failed to parse JSON: {e}\nResponse: {response_text}")
|
|
328
326
|
|
|
329
327
|
def _create_memory_item(
|
|
330
328
|
self,
|
|
@@ -97,7 +97,7 @@ def parse_json_result(response_text: str) -> dict:
|
|
|
97
97
|
return json.loads(s)
|
|
98
98
|
except json.JSONDecodeError:
|
|
99
99
|
pass
|
|
100
|
-
logger.
|
|
100
|
+
logger.warning(f"[JSONParse] Failed to decode JSON: {e}\nRaw: {response_text}")
|
|
101
101
|
return {}
|
|
102
102
|
|
|
103
103
|
|
|
@@ -224,6 +224,22 @@ class SimpleStructMemReader(BaseMemReader, ABC):
|
|
|
224
224
|
),
|
|
225
225
|
)
|
|
226
226
|
|
|
227
|
+
def _safe_generate(self, messages: list[dict]) -> str | None:
|
|
228
|
+
try:
|
|
229
|
+
return self.llm.generate(messages)
|
|
230
|
+
except Exception:
|
|
231
|
+
logger.exception("[LLM] Generation failed")
|
|
232
|
+
return None
|
|
233
|
+
|
|
234
|
+
def _safe_parse(self, text: str | None) -> dict | None:
|
|
235
|
+
if not text:
|
|
236
|
+
return None
|
|
237
|
+
try:
|
|
238
|
+
return parse_json_result(text)
|
|
239
|
+
except Exception:
|
|
240
|
+
logger.warning("[LLM] JSON parse failed")
|
|
241
|
+
return None
|
|
242
|
+
|
|
227
243
|
def _get_llm_response(self, mem_str: str, custom_tags: list[str] | None) -> dict:
|
|
228
244
|
lang = detect_lang(mem_str)
|
|
229
245
|
template = PROMPT_DICT["chat"][lang]
|
|
@@ -240,13 +256,13 @@ class SimpleStructMemReader(BaseMemReader, ABC):
|
|
|
240
256
|
if self.config.remove_prompt_example:
|
|
241
257
|
prompt = prompt.replace(examples, "")
|
|
242
258
|
messages = [{"role": "user", "content": prompt}]
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
"
|
|
259
|
+
|
|
260
|
+
response_text = self._safe_generate(messages)
|
|
261
|
+
response_json = self._safe_parse(response_text)
|
|
262
|
+
|
|
263
|
+
if not response_json:
|
|
264
|
+
return {
|
|
265
|
+
"memory_list": [
|
|
250
266
|
{
|
|
251
267
|
"key": mem_str[:10],
|
|
252
268
|
"memory_type": "UserMemory",
|
|
@@ -256,6 +272,7 @@ class SimpleStructMemReader(BaseMemReader, ABC):
|
|
|
256
272
|
],
|
|
257
273
|
"summary": mem_str,
|
|
258
274
|
}
|
|
275
|
+
|
|
259
276
|
return response_json
|
|
260
277
|
|
|
261
278
|
def _iter_chat_windows(self, scene_data_info, max_tokens=None, overlap=200):
|
|
@@ -70,7 +70,7 @@ def parse_json_result(response_text: str) -> dict:
|
|
|
70
70
|
if "Invalid \\escape" in str(e):
|
|
71
71
|
s = s.replace("\\", "\\\\")
|
|
72
72
|
return json.loads(s)
|
|
73
|
-
logger.
|
|
73
|
+
logger.warning(
|
|
74
74
|
f"[JSONParse] Failed to decode JSON: {e}\nTail: Raw {response_text} \
|
|
75
75
|
json: {s}"
|
|
76
76
|
)
|