MemoryOS 2.0.9__tar.gz → 2.0.10__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.9 → memoryos-2.0.10}/PKG-INFO +1 -1
- {memoryos-2.0.9 → memoryos-2.0.10}/pyproject.toml +20 -1
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/__init__.py +1 -1
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/config.py +35 -16
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/component_init.py +4 -3
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/llm.py +18 -6
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/mem_scheduler.py +4 -1
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/graph_dbs/neo4j_community.py +9 -2
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/graph_dbs/polardb.py +84 -79
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/ollama.py +1 -1
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/openai.py +60 -25
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_feedback/feedback.py +0 -1
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_os/core.py +1 -1
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/multi_modal_struct.py +114 -12
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_skill_memory/process_skill_memory.py +31 -3
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/general_modules/init_components_for_scheduler.py +1 -1
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/schemas/general_schemas.py +1 -1
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/organize/manager.py +0 -1
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/multi_mem_cube/single_cube.py +1 -1
- {memoryos-2.0.9 → memoryos-2.0.10}/LICENSE +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/README.md +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/README_api.md +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/client.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/context/dependencies.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/exceptions.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/add_handler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/base_handler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/chat_handler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/config_builders.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/feedback_handler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/formatters_handler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/memory_handler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/scheduler_handler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/search_handler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/handlers/suggestion_handler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/mcp_serve.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/middleware/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/middleware/auth.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/middleware/rate_limit.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/middleware/request_context.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/product_api.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/product_models.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/routers/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/routers/admin_router.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/routers/product_router.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/routers/server_router.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/server_api.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/server_api_ext.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/start_api.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/utils/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/api/utils/api_keys.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/chunkers/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/chunkers/base.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/chunkers/charactertext_chunker.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/chunkers/factory.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/chunkers/markdown_chunker.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/chunkers/sentence_chunker.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/chunkers/simple_chunker.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/cli.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/base.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/chunker.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/embedder.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/graph_db.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/internet_retriever.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/mem_agent.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/mem_chat.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/mem_cube.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/mem_os.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/mem_reader.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/mem_user.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/memory.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/parser.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/reranker.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/utils.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/configs/vec_db.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/context/context.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/dependency.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/deprecation.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/embedders/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/embedders/ark.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/embedders/base.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/embedders/factory.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/embedders/ollama.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/embedders/sentence_transformer.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/embedders/universal_api.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/exceptions.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/extras/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/extras/nli_model/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/extras/nli_model/client.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/extras/nli_model/server/README.md +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/extras/nli_model/server/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/extras/nli_model/server/config.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/extras/nli_model/server/handler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/extras/nli_model/server/serve.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/extras/nli_model/types.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/graph_dbs/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/graph_dbs/base.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/graph_dbs/factory.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/graph_dbs/item.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/graph_dbs/nebular.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/graph_dbs/neo4j.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/graph_dbs/postgres.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/hello_world.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/base.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/deepseek.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/factory.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/hf.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/hf_singleton.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/openai_new.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/qwen.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/utils.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/llms/vllm.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/log.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_agent/base.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_agent/deepsearch_agent.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_agent/factory.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_chat/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_chat/base.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_chat/factory.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_chat/simple.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_cube/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_cube/base.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_cube/general.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_cube/navie.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_cube/utils.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_feedback/base.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_feedback/simple_feedback.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_feedback/utils.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_os/client.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_os/main.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_os/product.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_os/product_server.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_os/utils/default_config.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_os/utils/format_utils.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_os/utils/reference_utils.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/base.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/factory.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/memory.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/assistant_parser.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/base.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/file_content_parser.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/image_parser.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/multi_modal_parser.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/string_parser.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/system_parser.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/text_content_parser.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/tool_parser.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/user_parser.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_multi_modal/utils.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/read_pref_memory/process_preference_memory.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/simple_struct.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/strategy_struct.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_reader/utils.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/analyzer/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/analyzer/api_analyzer.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/analyzer/eval_analyzer.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/analyzer/mos_for_test_scheduler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/analyzer/scheduler_for_eval.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/base_mixins/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/base_mixins/memory_ops.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/base_mixins/queue_ops.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/base_mixins/web_log_ops.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/base_scheduler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/general_modules/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/general_modules/api_misc.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/general_modules/base.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/general_modules/misc.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/general_modules/scheduler_logger.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/general_modules/task_threads.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/general_scheduler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/memory_manage_modules/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/memory_manage_modules/activation_memory_manager.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/memory_manage_modules/enhancement_pipeline.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/memory_manage_modules/filter_pipeline.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/memory_manage_modules/memory_filter.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/memory_manage_modules/post_processor.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/memory_manage_modules/rerank_pipeline.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/memory_manage_modules/retriever.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/memory_manage_modules/search_pipeline.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/memory_manage_modules/search_service.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/monitors/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/monitors/dispatcher_monitor.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/monitors/general_monitor.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/monitors/task_schedule_monitor.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/optimized_scheduler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/orm_modules/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/orm_modules/api_redis_model.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/orm_modules/base_model.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/orm_modules/monitor_models.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/orm_modules/redis_model.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/scheduler_factory.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/schemas/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/schemas/analyzer_schemas.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/schemas/api_schemas.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/schemas/message_schemas.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/schemas/monitor_schemas.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/schemas/task_schemas.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/base_handler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/context.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/dispatcher.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/handlers/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/handlers/add_handler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/handlers/answer_handler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/handlers/feedback_handler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/handlers/mem_read_handler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/handlers/mem_reorganize_handler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/handlers/memory_update_handler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/handlers/pref_add_handler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/handlers/query_handler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/local_queue.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/orchestrator.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/registry.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/task_schedule_modules/task_queue.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/utils/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/utils/api_utils.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/utils/config_utils.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/utils/db_utils.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/utils/filter_utils.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/utils/metrics.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/utils/misc_utils.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/utils/monitor_event_utils.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/utils/status_tracker.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/webservice_modules/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_scheduler/webservice_modules/redis_service.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_user/factory.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_user/mysql_persistent_user_manager.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_user/mysql_user_manager.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_user/persistent_factory.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_user/persistent_user_manager.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_user/redis_persistent_user_manager.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/mem_user/user_manager.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/activation/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/activation/base.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/activation/item.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/activation/kv.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/activation/vllmkv.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/base.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/factory.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/parametric/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/parametric/base.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/parametric/item.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/parametric/lora.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/base.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/general.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/item.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/naive.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/prefer_text_memory/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/prefer_text_memory/adder.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/prefer_text_memory/config.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/prefer_text_memory/extractor.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/prefer_text_memory/factory.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/prefer_text_memory/retrievers.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/prefer_text_memory/spliter.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/prefer_text_memory/utils.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/preference.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/simple_preference.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/simple_tree.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/organize/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/organize/handler.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/organize/history_manager.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/organize/relation_reason_detector.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/organize/reorganizer.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/advanced_searcher.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/bm25_util.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/bochasearch.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever_factory.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/pre_update.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/reasoner.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/recall.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/reranker.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/retrieval_mid_structs.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/retrieve_utils.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/task_goal_parser.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/utils.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memories/textual/tree_text_memory/retrieve/xinyusearch.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memos_tools/dinding_report_bot.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memos_tools/lockfree_dict.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memos_tools/notification_service.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memos_tools/notification_utils.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memos_tools/singleton.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memos_tools/thread_safe_dict.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/memos_tools/thread_safe_dict_segment.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/multi_mem_cube/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/multi_mem_cube/composite_cube.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/multi_mem_cube/views.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/parsers/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/parsers/base.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/parsers/factory.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/parsers/markitdown.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/base.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/concat.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/cosine_local.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/factory.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/http_bge.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/http_bge_strategy.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/noop.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/strategies/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/strategies/base.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/strategies/concat_background.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/strategies/concat_docsource.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/strategies/dialogue_common.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/strategies/factory.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/strategies/single_turn.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/reranker/strategies/singleturn_outmem.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/search/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/search/search_service.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/settings.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/advanced_search_prompts.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/cloud_service_prompt.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/instruction_completion.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/mem_agent_prompts.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/mem_feedback_prompts.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/mem_reader_prompts.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/mem_reader_strategy_prompts.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/mem_scheduler_prompts.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/mem_search_prompts.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/mos_prompts.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/prefer_complete_prompt.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/skill_mem_prompt.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/tool_mem_prompts.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/templates/tree_reorganize_prompts.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/general_types.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_assistant_message_param.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_image_param.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_input_audio_param.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_param.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_refusal_param.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_text_param.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_message_custom_tool_call_param.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_message_function_tool_call_param.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_message_param.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_message_tool_call_union_param.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_system_message_param.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_tool_message_param.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/types/openai_chat_completion_types/chat_completion_user_message_param.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/utils.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/vec_dbs/__init__.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/vec_dbs/base.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/vec_dbs/factory.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/vec_dbs/item.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/vec_dbs/milvus.py +0 -0
- {memoryos-2.0.9 → memoryos-2.0.10}/src/memos/vec_dbs/qdrant.py +0 -0
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
##############################################################################
|
|
5
5
|
|
|
6
6
|
name = "MemoryOS"
|
|
7
|
-
version = "2.0.
|
|
7
|
+
version = "2.0.10"
|
|
8
8
|
description = "Intelligence Begins with Memory"
|
|
9
9
|
license = {text = "Apache-2.0"}
|
|
10
10
|
readme = "README.md"
|
|
@@ -170,6 +170,8 @@ optional = true
|
|
|
170
170
|
[tool.poetry.group.test.dependencies]
|
|
171
171
|
pytest = "^8.3.5"
|
|
172
172
|
pytest-asyncio = "^0.23.5"
|
|
173
|
+
pytest-cov = "^6.1"
|
|
174
|
+
pytest-html = "^4.2"
|
|
173
175
|
ruff = "^0.11.8"
|
|
174
176
|
|
|
175
177
|
[tool.poetry.group.eval]
|
|
@@ -208,6 +210,23 @@ filterwarnings = [
|
|
|
208
210
|
]
|
|
209
211
|
|
|
210
212
|
|
|
213
|
+
[tool.coverage.run]
|
|
214
|
+
source = ["src/memos"]
|
|
215
|
+
branch = true
|
|
216
|
+
|
|
217
|
+
[tool.coverage.report]
|
|
218
|
+
show_missing = true
|
|
219
|
+
skip_empty = true
|
|
220
|
+
exclude_lines = [
|
|
221
|
+
"pragma: no cover",
|
|
222
|
+
"if TYPE_CHECKING:",
|
|
223
|
+
"if __name__ == .__main__.",
|
|
224
|
+
]
|
|
225
|
+
|
|
226
|
+
[tool.coverage.html]
|
|
227
|
+
directory = "cov-report"
|
|
228
|
+
|
|
229
|
+
|
|
211
230
|
[tool.ruff]
|
|
212
231
|
##############################################################################
|
|
213
232
|
# Ruff is a fast Python linter and formatter.
|
|
@@ -321,23 +321,40 @@ class APIConfig:
|
|
|
321
321
|
|
|
322
322
|
@staticmethod
|
|
323
323
|
def get_memreader_config() -> dict[str, Any]:
|
|
324
|
-
"""Get MemReader configuration for chat/doc extraction (fine-tuned 0.6B model).
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
324
|
+
"""Get MemReader configuration for chat/doc extraction (fine-tuned 0.6B model).
|
|
325
|
+
|
|
326
|
+
When MEMREADER_GENERAL_MODEL is configured (i.e. a separate stable LLM exists),
|
|
327
|
+
the backup client is automatically enabled so that primary failures (self-deployed
|
|
328
|
+
model) fall back to the general LLM.
|
|
329
|
+
"""
|
|
330
|
+
config = {
|
|
331
|
+
"model_name_or_path": os.getenv("MEMRADER_MODEL", "gpt-4o-mini"),
|
|
332
|
+
"temperature": 0.6,
|
|
333
|
+
"max_tokens": int(os.getenv("MEMRADER_MAX_TOKENS", "8000")),
|
|
334
|
+
"top_p": 0.95,
|
|
335
|
+
"top_k": 20,
|
|
336
|
+
"api_key": os.getenv("MEMRADER_API_KEY", "EMPTY"),
|
|
337
|
+
# Default to OpenAI base URL when env var is not provided to satisfy pydantic
|
|
338
|
+
# validation requirements during tests/import.
|
|
339
|
+
"api_base": os.getenv("MEMRADER_API_BASE", "https://api.openai.com/v1"),
|
|
340
|
+
"remove_think_prefix": True,
|
|
339
341
|
}
|
|
340
342
|
|
|
343
|
+
general_model = os.getenv("MEMREADER_GENERAL_MODEL")
|
|
344
|
+
enable_backup = os.getenv("MEMREADER_ENABLE_BACKUP", "false").lower() == "true"
|
|
345
|
+
if general_model and enable_backup:
|
|
346
|
+
config["backup_client"] = True
|
|
347
|
+
config["backup_model_name_or_path"] = general_model
|
|
348
|
+
config["backup_api_key"] = os.getenv(
|
|
349
|
+
"MEMREADER_GENERAL_API_KEY", os.getenv("OPENAI_API_KEY", "EMPTY")
|
|
350
|
+
)
|
|
351
|
+
config["backup_api_base"] = os.getenv(
|
|
352
|
+
"MEMREADER_GENERAL_API_BASE",
|
|
353
|
+
os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1"),
|
|
354
|
+
)
|
|
355
|
+
|
|
356
|
+
return {"backend": "openai", "config": config}
|
|
357
|
+
|
|
341
358
|
@staticmethod
|
|
342
359
|
def get_memreader_general_llm_config() -> dict[str, Any]:
|
|
343
360
|
"""Get general LLM configuration for non-chat/doc tasks.
|
|
@@ -837,7 +854,7 @@ class APIConfig:
|
|
|
837
854
|
),
|
|
838
855
|
"context_window_size": int(os.getenv("MOS_SCHEDULER_CONTEXT_WINDOW_SIZE", "5")),
|
|
839
856
|
"thread_pool_max_workers": int(
|
|
840
|
-
os.getenv("MOS_SCHEDULER_THREAD_POOL_MAX_WORKERS", "
|
|
857
|
+
os.getenv("MOS_SCHEDULER_THREAD_POOL_MAX_WORKERS", "200")
|
|
841
858
|
),
|
|
842
859
|
"consume_interval_seconds": float(
|
|
843
860
|
os.getenv("MOS_SCHEDULER_CONSUME_INTERVAL_SECONDS", "0.01")
|
|
@@ -850,6 +867,8 @@ class APIConfig:
|
|
|
850
867
|
"MOS_SCHEDULER_ENABLE_ACTIVATION_MEMORY", "false"
|
|
851
868
|
).lower()
|
|
852
869
|
== "true",
|
|
870
|
+
"use_redis_queue": os.getenv("MEMSCHEDULER_USE_REDIS_QUEUE", "False").lower()
|
|
871
|
+
== "true",
|
|
853
872
|
},
|
|
854
873
|
}
|
|
855
874
|
|
|
@@ -233,7 +233,7 @@ def init_server() -> dict[str, Any]:
|
|
|
233
233
|
searcher: Searcher = tree_mem.get_searcher(
|
|
234
234
|
manual_close_internet=os.getenv("ENABLE_INTERNET", "true").lower() == "false",
|
|
235
235
|
moscube=False,
|
|
236
|
-
process_llm=mem_reader.
|
|
236
|
+
process_llm=mem_reader.general_llm,
|
|
237
237
|
)
|
|
238
238
|
logger.debug("Searcher created")
|
|
239
239
|
|
|
@@ -255,12 +255,13 @@ def init_server() -> dict[str, Any]:
|
|
|
255
255
|
# Initialize Scheduler
|
|
256
256
|
scheduler_config_dict = APIConfig.get_scheduler_config()
|
|
257
257
|
scheduler_config = SchedulerConfigFactory(
|
|
258
|
-
backend="
|
|
258
|
+
backend=scheduler_config_dict["backend"],
|
|
259
|
+
config=scheduler_config_dict["config"],
|
|
259
260
|
)
|
|
260
261
|
mem_scheduler: OptimizedScheduler = SchedulerFactory.from_config(scheduler_config)
|
|
261
262
|
mem_scheduler.initialize_modules(
|
|
262
263
|
chat_llm=llm,
|
|
263
|
-
process_llm=mem_reader.
|
|
264
|
+
process_llm=mem_reader.general_llm,
|
|
264
265
|
db_engine=BaseDBManager.create_default_sqlite_engine(),
|
|
265
266
|
mem_reader=mem_reader,
|
|
266
267
|
redis_client=redis_client,
|
|
@@ -28,6 +28,22 @@ class OpenAILLMConfig(BaseLLMConfig):
|
|
|
28
28
|
default="https://api.openai.com/v1", description="Base URL for OpenAI API"
|
|
29
29
|
)
|
|
30
30
|
extra_body: Any = Field(default=None, description="extra body")
|
|
31
|
+
backup_client: bool = Field(
|
|
32
|
+
default=False,
|
|
33
|
+
description="Whether to enable backup client for fallback on primary failure",
|
|
34
|
+
)
|
|
35
|
+
backup_api_key: str | None = Field(
|
|
36
|
+
default=None, description="API key for backup OpenAI-compatible endpoint"
|
|
37
|
+
)
|
|
38
|
+
backup_api_base: str | None = Field(
|
|
39
|
+
default=None, description="Base URL for backup OpenAI-compatible endpoint"
|
|
40
|
+
)
|
|
41
|
+
backup_model_name_or_path: str | None = Field(
|
|
42
|
+
default=None, description="Model name for backup endpoint"
|
|
43
|
+
)
|
|
44
|
+
backup_headers: dict[str, Any] | None = Field(
|
|
45
|
+
default=None, description="Default headers for backup client requests"
|
|
46
|
+
)
|
|
31
47
|
|
|
32
48
|
|
|
33
49
|
class OpenAIResponsesLLMConfig(BaseLLMConfig):
|
|
@@ -42,22 +58,18 @@ class OpenAIResponsesLLMConfig(BaseLLMConfig):
|
|
|
42
58
|
)
|
|
43
59
|
|
|
44
60
|
|
|
45
|
-
class QwenLLMConfig(
|
|
46
|
-
api_key: str = Field(..., description="API key for DashScope (Qwen)")
|
|
61
|
+
class QwenLLMConfig(OpenAILLMConfig):
|
|
47
62
|
api_base: str = Field(
|
|
48
63
|
default="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
|
|
49
64
|
description="Base URL for Qwen OpenAI-compatible API",
|
|
50
65
|
)
|
|
51
|
-
extra_body: Any = Field(default=None, description="extra body")
|
|
52
66
|
|
|
53
67
|
|
|
54
|
-
class DeepSeekLLMConfig(
|
|
55
|
-
api_key: str = Field(..., description="API key for DeepSeek")
|
|
68
|
+
class DeepSeekLLMConfig(OpenAILLMConfig):
|
|
56
69
|
api_base: str = Field(
|
|
57
70
|
default="https://api.deepseek.com",
|
|
58
71
|
description="Base URL for DeepSeek OpenAI-compatible API",
|
|
59
72
|
)
|
|
60
|
-
extra_body: Any = Field(default=None, description="Extra options for API")
|
|
61
73
|
|
|
62
74
|
|
|
63
75
|
class AzureLLMConfig(BaseLLMConfig):
|
|
@@ -155,7 +155,10 @@ class SchedulerConfigFactory(BaseConfig):
|
|
|
155
155
|
@model_validator(mode="after")
|
|
156
156
|
def create_config(self) -> "SchedulerConfigFactory":
|
|
157
157
|
config_class = self.backend_to_class[self.backend]
|
|
158
|
-
|
|
158
|
+
raw = self.config
|
|
159
|
+
if isinstance(raw, dict) and "config" in raw and "use_redis_queue" not in raw:
|
|
160
|
+
raw = raw["config"]
|
|
161
|
+
self.config = config_class(**raw)
|
|
159
162
|
return self
|
|
160
163
|
|
|
161
164
|
|
|
@@ -721,6 +721,8 @@ class Neo4jCommunityGraphDB(Neo4jGraphDB):
|
|
|
721
721
|
user_name: str | None = None,
|
|
722
722
|
filter: dict | None = None,
|
|
723
723
|
knowledgebase_ids: list[str] | None = None,
|
|
724
|
+
user_name_flag: bool = True,
|
|
725
|
+
status: str | None = None,
|
|
724
726
|
) -> list[str]:
|
|
725
727
|
"""
|
|
726
728
|
Retrieve node IDs that match given metadata filters.
|
|
@@ -745,15 +747,20 @@ class Neo4jCommunityGraphDB(Neo4jGraphDB):
|
|
|
745
747
|
- Can be used for faceted recall or prefiltering before embedding rerank.
|
|
746
748
|
"""
|
|
747
749
|
logger.info(
|
|
748
|
-
f"[get_by_metadata] filters: {filters},user_name: {user_name},filter: {filter},knowledgebase_ids: {knowledgebase_ids}"
|
|
750
|
+
f"[get_by_metadata] filters: {filters},user_name: {user_name},filter: {filter},knowledgebase_ids: {knowledgebase_ids},status: {status}"
|
|
749
751
|
)
|
|
750
752
|
print(
|
|
751
|
-
f"[get_by_metadata] filters: {filters},user_name: {user_name},filter: {filter},knowledgebase_ids: {knowledgebase_ids}"
|
|
753
|
+
f"[get_by_metadata] filters: {filters},user_name: {user_name},filter: {filter},knowledgebase_ids: {knowledgebase_ids},status: {status}"
|
|
752
754
|
)
|
|
753
755
|
user_name = user_name if user_name else self.config.user_name
|
|
754
756
|
where_clauses = []
|
|
755
757
|
params = {}
|
|
756
758
|
|
|
759
|
+
# Add status filter if provided
|
|
760
|
+
if status:
|
|
761
|
+
where_clauses.append("n.status = $status")
|
|
762
|
+
params["status"] = status
|
|
763
|
+
|
|
757
764
|
for i, f in enumerate(filters):
|
|
758
765
|
field = f["field"]
|
|
759
766
|
op = f.get("op", "=")
|
|
@@ -432,14 +432,13 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
432
432
|
def remove_oldest_memory(
|
|
433
433
|
self, memory_type: str, keep_latest: int, user_name: str | None = None
|
|
434
434
|
) -> None:
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
"""
|
|
435
|
+
start_time = time.perf_counter()
|
|
436
|
+
logger.info(
|
|
437
|
+
"remove_oldest_memory by memory_type:%s,keep_latest: %s,user_name:%s",
|
|
438
|
+
memory_type,
|
|
439
|
+
keep_latest,
|
|
440
|
+
user_name,
|
|
441
|
+
)
|
|
443
442
|
user_name = user_name if user_name else self._get_config_value("user_name")
|
|
444
443
|
|
|
445
444
|
# Use actual OFFSET logic, consistent with nebular.py
|
|
@@ -456,6 +455,9 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
456
455
|
self.format_param_value(user_name),
|
|
457
456
|
keep_latest,
|
|
458
457
|
]
|
|
458
|
+
logger.info(
|
|
459
|
+
f"remove_oldest_memory by select_query:{select_query},select_params:{select_params}"
|
|
460
|
+
)
|
|
459
461
|
try:
|
|
460
462
|
with self._get_connection() as conn, conn.cursor() as cursor:
|
|
461
463
|
# Execute query to get IDs to delete
|
|
@@ -482,6 +484,8 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
482
484
|
f"keeping {keep_latest} latest for user {user_name}, "
|
|
483
485
|
f"removed ids: {ids_to_delete}"
|
|
484
486
|
)
|
|
487
|
+
elapsed = (time.perf_counter() - start_time) * 1000.0
|
|
488
|
+
logger.info("remove_oldest_memory internal took %.1f ms", elapsed)
|
|
485
489
|
except Exception as e:
|
|
486
490
|
logger.error(f"[remove_oldest_memory] Failed: {e}", exc_info=True)
|
|
487
491
|
raise
|
|
@@ -1840,9 +1844,8 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
1840
1844
|
**kwargs,
|
|
1841
1845
|
) -> list[dict]:
|
|
1842
1846
|
logger.info(
|
|
1843
|
-
"search_by_embedding user_name:%s,
|
|
1847
|
+
"search_by_embedding by user_name:%s,knowledgebase_ids: %s,scope:%s,status:%s,search_filter:%s,filter:%s,knowledgebase_ids:%s,return_fields:%s",
|
|
1844
1848
|
user_name,
|
|
1845
|
-
filter,
|
|
1846
1849
|
knowledgebase_ids,
|
|
1847
1850
|
scope,
|
|
1848
1851
|
status,
|
|
@@ -1895,20 +1898,21 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
1895
1898
|
where_clause = f"WHERE {' AND '.join(where_clauses)}" if where_clauses else ""
|
|
1896
1899
|
|
|
1897
1900
|
query = f"""
|
|
1901
|
+
set hnsw.ef_search = 100;set hnsw.iterative_scan = relaxed_order;
|
|
1898
1902
|
WITH t AS (
|
|
1899
1903
|
SELECT id,
|
|
1900
1904
|
properties,
|
|
1901
1905
|
timeline,
|
|
1902
1906
|
ag_catalog.agtype_access_operator(properties, '"id"'::agtype) AS old_id,
|
|
1903
|
-
(
|
|
1907
|
+
(embedding <=> %s::vector(1024)) AS scope_distance
|
|
1904
1908
|
FROM "{self.db_name}_graph"."Memory"
|
|
1905
1909
|
{where_clause}
|
|
1906
|
-
ORDER BY
|
|
1910
|
+
ORDER BY scope_distance ASC
|
|
1907
1911
|
LIMIT {top_k}
|
|
1908
1912
|
)
|
|
1909
|
-
SELECT
|
|
1913
|
+
SELECT *,(1 - scope_distance) AS scope
|
|
1910
1914
|
FROM t
|
|
1911
|
-
WHERE
|
|
1915
|
+
WHERE scope_distance < 0.9;
|
|
1912
1916
|
"""
|
|
1913
1917
|
vector_str = convert_to_vector(vector)
|
|
1914
1918
|
query = query.replace("%s::vector(1024)", f"'{vector_str}'::vector(1024)")
|
|
@@ -1953,7 +1957,7 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
1953
1957
|
output.append(item)
|
|
1954
1958
|
elapsed_time = (time.perf_counter() - start_time) * 1000.0
|
|
1955
1959
|
logger.info(
|
|
1956
|
-
"search_by_embedding query embedding completed time took %.1f ms", elapsed_time
|
|
1960
|
+
"search_by_embedding query by embedding completed time took %.1f ms", elapsed_time
|
|
1957
1961
|
)
|
|
1958
1962
|
return output[:top_k]
|
|
1959
1963
|
|
|
@@ -1966,30 +1970,13 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
1966
1970
|
knowledgebase_ids: list | None = None,
|
|
1967
1971
|
user_name_flag: bool = True,
|
|
1968
1972
|
) -> list[str]:
|
|
1969
|
-
|
|
1970
|
-
Retrieve node IDs that match given metadata filters.
|
|
1971
|
-
Supports exact match.
|
|
1972
|
-
|
|
1973
|
-
Args:
|
|
1974
|
-
filters: List of filter dicts like:
|
|
1975
|
-
[
|
|
1976
|
-
{"field": "key", "op": "in", "value": ["A", "B"]},
|
|
1977
|
-
{"field": "confidence", "op": ">=", "value": 80},
|
|
1978
|
-
{"field": "tags", "op": "contains", "value": "AI"},
|
|
1979
|
-
...
|
|
1980
|
-
]
|
|
1981
|
-
user_name (str, optional): User name for filtering in non-multi-db mode
|
|
1982
|
-
|
|
1983
|
-
Returns:
|
|
1984
|
-
list[str]: Node IDs whose metadata match the filter conditions. (AND logic).
|
|
1985
|
-
"""
|
|
1973
|
+
start_time = time.perf_counter()
|
|
1986
1974
|
logger.info(
|
|
1987
1975
|
f" get_by_metadata user_name:{user_name},filter: {filter}, knowledgebase_ids: {knowledgebase_ids},filters:{filters}"
|
|
1988
1976
|
)
|
|
1989
1977
|
|
|
1990
1978
|
user_name = user_name if user_name else self._get_config_value("user_name")
|
|
1991
1979
|
|
|
1992
|
-
# Build WHERE conditions for cypher query
|
|
1993
1980
|
where_conditions = []
|
|
1994
1981
|
|
|
1995
1982
|
for f in filters:
|
|
@@ -1997,18 +1984,13 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
1997
1984
|
op = f.get("op", "=")
|
|
1998
1985
|
value = f["value"]
|
|
1999
1986
|
|
|
2000
|
-
# Format value
|
|
2001
1987
|
if isinstance(value, str):
|
|
2002
|
-
# Escape single quotes using backslash when inside $$ dollar-quoted strings
|
|
2003
|
-
# In $$ delimiters, Cypher string literals can use \' to escape single quotes
|
|
2004
1988
|
escaped_str = value.replace("'", "\\'")
|
|
2005
1989
|
escaped_value = f"'{escaped_str}'"
|
|
2006
1990
|
elif isinstance(value, list):
|
|
2007
|
-
# Handle list values - use double quotes for Cypher arrays
|
|
2008
1991
|
list_items = []
|
|
2009
1992
|
for v in value:
|
|
2010
1993
|
if isinstance(v, str):
|
|
2011
|
-
# Escape double quotes in string values for Cypher
|
|
2012
1994
|
escaped_str = v.replace('"', '\\"')
|
|
2013
1995
|
list_items.append(f'"{escaped_str}"')
|
|
2014
1996
|
else:
|
|
@@ -2016,7 +1998,6 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
2016
1998
|
escaped_value = f"[{', '.join(list_items)}]"
|
|
2017
1999
|
else:
|
|
2018
2000
|
escaped_value = f"'{value}'" if isinstance(value, str) else str(value)
|
|
2019
|
-
# Build WHERE conditions
|
|
2020
2001
|
if op == "=":
|
|
2021
2002
|
where_conditions.append(f"n.{field} = {escaped_value}")
|
|
2022
2003
|
elif op == "in":
|
|
@@ -2045,22 +2026,19 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
2045
2026
|
knowledgebase_ids=knowledgebase_ids,
|
|
2046
2027
|
default_user_name=self._get_config_value("user_name"),
|
|
2047
2028
|
)
|
|
2048
|
-
logger.info(f"
|
|
2029
|
+
logger.info(f"get_by_metadata user_name_conditions: {user_name_conditions}")
|
|
2049
2030
|
|
|
2050
|
-
# Add user_name WHERE clause
|
|
2051
2031
|
if user_name_conditions:
|
|
2052
2032
|
if len(user_name_conditions) == 1:
|
|
2053
2033
|
where_conditions.append(user_name_conditions[0])
|
|
2054
2034
|
else:
|
|
2055
2035
|
where_conditions.append(f"({' OR '.join(user_name_conditions)})")
|
|
2056
2036
|
|
|
2057
|
-
# Build filter conditions using common method
|
|
2058
2037
|
filter_where_clause = self._build_filter_conditions_cypher(filter)
|
|
2059
|
-
logger.info(f"
|
|
2038
|
+
logger.info(f"get_by_metadata filter_where_clause: {filter_where_clause}")
|
|
2060
2039
|
|
|
2061
2040
|
where_str = " AND ".join(where_conditions) + filter_where_clause
|
|
2062
2041
|
|
|
2063
|
-
# Use cypher query
|
|
2064
2042
|
cypher_query = f"""
|
|
2065
2043
|
SELECT * FROM cypher('{self.db_name}_graph', $$
|
|
2066
2044
|
MATCH (n:Memory)
|
|
@@ -2070,7 +2048,7 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
2070
2048
|
"""
|
|
2071
2049
|
|
|
2072
2050
|
ids = []
|
|
2073
|
-
logger.info(f"
|
|
2051
|
+
logger.info(f"get_by_metadata cypher_query: {cypher_query}")
|
|
2074
2052
|
try:
|
|
2075
2053
|
with self._get_connection() as conn, conn.cursor() as cursor:
|
|
2076
2054
|
cursor.execute(cypher_query)
|
|
@@ -2078,7 +2056,8 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
2078
2056
|
ids = [str(item[0]).strip('"') for item in results]
|
|
2079
2057
|
except Exception as e:
|
|
2080
2058
|
logger.warning(f"Failed to get metadata: {e}, query is {cypher_query}")
|
|
2081
|
-
|
|
2059
|
+
elapsed = (time.perf_counter() - start_time) * 1000.0
|
|
2060
|
+
logger.info("get_by_metadata internal took %.1f ms", elapsed)
|
|
2082
2061
|
return ids
|
|
2083
2062
|
|
|
2084
2063
|
@timed
|
|
@@ -2165,25 +2144,19 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
2165
2144
|
params: dict[str, Any] | None = None,
|
|
2166
2145
|
user_name: str | None = None,
|
|
2167
2146
|
) -> list[dict[str, Any]]:
|
|
2168
|
-
|
|
2169
|
-
|
|
2170
|
-
|
|
2171
|
-
|
|
2172
|
-
|
|
2173
|
-
|
|
2174
|
-
|
|
2175
|
-
|
|
2176
|
-
user_name (str, optional): User name for filtering in non-multi-db mode
|
|
2177
|
-
|
|
2178
|
-
Returns:
|
|
2179
|
-
list[dict]: e.g., [{ 'memory_type': 'WorkingMemory', 'status': 'active', 'count': 10 }, ...]
|
|
2180
|
-
"""
|
|
2147
|
+
start_time = time.perf_counter()
|
|
2148
|
+
logger.info(
|
|
2149
|
+
"get_grouped_counts by group_fields:%s,where_clause: %s,params:%s,user_name:%s",
|
|
2150
|
+
group_fields,
|
|
2151
|
+
where_clause,
|
|
2152
|
+
params,
|
|
2153
|
+
user_name,
|
|
2154
|
+
)
|
|
2181
2155
|
if not group_fields:
|
|
2182
2156
|
raise ValueError("group_fields cannot be empty")
|
|
2183
2157
|
|
|
2184
2158
|
user_name = user_name if user_name else self._get_config_value("user_name")
|
|
2185
2159
|
|
|
2186
|
-
# Build user clause
|
|
2187
2160
|
user_clause = f"ag_catalog.agtype_access_operator(properties, '\"user_name\"'::agtype) = '\"{user_name}\"'::agtype"
|
|
2188
2161
|
if where_clause:
|
|
2189
2162
|
where_clause = where_clause.strip()
|
|
@@ -2194,44 +2167,43 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
2194
2167
|
else:
|
|
2195
2168
|
where_clause = f"WHERE {user_clause}"
|
|
2196
2169
|
|
|
2197
|
-
# Inline parameters if provided
|
|
2198
2170
|
if params and isinstance(params, dict):
|
|
2199
2171
|
for key, value in params.items():
|
|
2200
|
-
# Handle different value types appropriately
|
|
2201
2172
|
if isinstance(value, str):
|
|
2202
2173
|
value = f"'{value}'"
|
|
2203
2174
|
where_clause = where_clause.replace(f"${key}", str(value))
|
|
2204
2175
|
|
|
2205
|
-
# Handle user_name parameter in where_clause
|
|
2206
2176
|
if "user_name = %s" in where_clause:
|
|
2207
2177
|
where_clause = where_clause.replace(
|
|
2208
2178
|
"user_name = %s",
|
|
2209
2179
|
f"ag_catalog.agtype_access_operator(properties, '\"user_name\"'::agtype) = '\"{user_name}\"'::agtype",
|
|
2210
2180
|
)
|
|
2211
2181
|
|
|
2212
|
-
|
|
2213
|
-
|
|
2214
|
-
group_by_fields = []
|
|
2215
|
-
|
|
2182
|
+
cte_select_list = []
|
|
2183
|
+
aliases = []
|
|
2216
2184
|
for field in group_fields:
|
|
2217
2185
|
alias = field.replace(".", "_")
|
|
2218
|
-
|
|
2219
|
-
|
|
2220
|
-
|
|
2221
|
-
group_by_fields.append(
|
|
2222
|
-
f"ag_catalog.agtype_access_operator(properties, '\"{field}\"'::agtype)::text"
|
|
2186
|
+
aliases.append(alias)
|
|
2187
|
+
cte_select_list.append(
|
|
2188
|
+
f"ag_catalog.agtype_access_operator(properties, '\"{field}\"'::agtype) AS {alias}"
|
|
2223
2189
|
)
|
|
2224
|
-
|
|
2225
|
-
|
|
2190
|
+
outer_select = ", ".join(f"{a}::text" for a in aliases)
|
|
2191
|
+
outer_group_by = ", ".join(aliases)
|
|
2226
2192
|
query = f"""
|
|
2227
|
-
|
|
2228
|
-
|
|
2229
|
-
|
|
2230
|
-
|
|
2193
|
+
WITH t AS (
|
|
2194
|
+
SELECT {", ".join(cte_select_list)}
|
|
2195
|
+
FROM "{self.db_name}_graph"."Memory"
|
|
2196
|
+
{where_clause}
|
|
2197
|
+
LIMIT 1000
|
|
2198
|
+
)
|
|
2199
|
+
SELECT {outer_select}, count(*) AS count
|
|
2200
|
+
FROM t
|
|
2201
|
+
GROUP BY {outer_group_by}
|
|
2231
2202
|
"""
|
|
2203
|
+
logger.info(f"get_grouped_counts query:{query},params:{params}")
|
|
2204
|
+
|
|
2232
2205
|
try:
|
|
2233
2206
|
with self._get_connection() as conn, conn.cursor() as cursor:
|
|
2234
|
-
# Handle parameterized query
|
|
2235
2207
|
if params and isinstance(params, list):
|
|
2236
2208
|
cursor.execute(query, params)
|
|
2237
2209
|
else:
|
|
@@ -2250,6 +2222,8 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
2250
2222
|
count_value = row[-1] # Last column is count
|
|
2251
2223
|
output.append({**group_values, "count": int(count_value)})
|
|
2252
2224
|
|
|
2225
|
+
elapsed = (time.perf_counter() - start_time) * 1000.0
|
|
2226
|
+
logger.info("get_grouped_counts internal took %.1f ms", elapsed)
|
|
2253
2227
|
return output
|
|
2254
2228
|
|
|
2255
2229
|
except Exception as e:
|
|
@@ -4667,6 +4641,36 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
4667
4641
|
condition_parts.append(
|
|
4668
4642
|
f"ag_catalog.agtype_access_operator(properties, '\"{key}\"'::agtype)::text LIKE '%{op_value}%'"
|
|
4669
4643
|
)
|
|
4644
|
+
elif op == "nolike":
|
|
4645
|
+
if key.startswith("info."):
|
|
4646
|
+
info_field = key[5:]
|
|
4647
|
+
if isinstance(op_value, str):
|
|
4648
|
+
escaped_value = (
|
|
4649
|
+
escape_sql_string(op_value)
|
|
4650
|
+
.replace("%", "\\%")
|
|
4651
|
+
.replace("_", "\\_")
|
|
4652
|
+
)
|
|
4653
|
+
condition_parts.append(
|
|
4654
|
+
f"ag_catalog.agtype_access_operator(VARIADIC ARRAY[properties, '\"info\"'::ag_catalog.agtype, '\"{info_field}\"'::ag_catalog.agtype])::text NOT LIKE '%{escaped_value}%'"
|
|
4655
|
+
)
|
|
4656
|
+
else:
|
|
4657
|
+
condition_parts.append(
|
|
4658
|
+
f"ag_catalog.agtype_access_operator(VARIADIC ARRAY[properties, '\"info\"'::ag_catalog.agtype, '\"{info_field}\"'::ag_catalog.agtype])::text NOT LIKE '%{op_value}%'"
|
|
4659
|
+
)
|
|
4660
|
+
else:
|
|
4661
|
+
if isinstance(op_value, str):
|
|
4662
|
+
escaped_value = (
|
|
4663
|
+
escape_sql_string(op_value)
|
|
4664
|
+
.replace("%", "\\%")
|
|
4665
|
+
.replace("_", "\\_")
|
|
4666
|
+
)
|
|
4667
|
+
condition_parts.append(
|
|
4668
|
+
f"ag_catalog.agtype_access_operator(properties, '\"{key}\"'::agtype)::text NOT LIKE '%{escaped_value}%'"
|
|
4669
|
+
)
|
|
4670
|
+
else:
|
|
4671
|
+
condition_parts.append(
|
|
4672
|
+
f"ag_catalog.agtype_access_operator(properties, '\"{key}\"'::agtype)::text NOT LIKE '%{op_value}%'"
|
|
4673
|
+
)
|
|
4670
4674
|
# Check if key starts with "info." prefix (for simple equality)
|
|
4671
4675
|
elif key.startswith("info."):
|
|
4672
4676
|
# Extract the field name after "info."
|
|
@@ -4756,6 +4760,7 @@ class PolarDBGraphDB(BaseGraphDB):
|
|
|
4756
4760
|
"project_id",
|
|
4757
4761
|
"manager_user_id",
|
|
4758
4762
|
"delete_time",
|
|
4763
|
+
"related_id",
|
|
4759
4764
|
}
|
|
4760
4765
|
|
|
4761
4766
|
def process_condition(condition):
|