MemoryOS 2.0.24__tar.gz → 2.0.25__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.24 → memoryos-2.0.25}/PKG-INFO +1 -1
- {memoryos-2.0.24 → memoryos-2.0.25}/pyproject.toml +1 -1
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/__init__.py +1 -1
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/client.py +13 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/config.py +95 -84
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/__init__.py +2 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/component_init.py +4 -1
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/config_builders.py +10 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/search_handler.py +96 -3
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/mem_reader.py +6 -1
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/mem_scheduler.py +18 -4
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/parser.py +21 -6
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/embedders/ark.py +2 -1
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/embedders/base.py +55 -0
- memoryos-2.0.25/src/memos/embedders/cache.py +229 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/embedders/factory.py +6 -1
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/embedders/ollama.py +2 -1
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/embedders/sentence_transformer.py +2 -1
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/embedders/universal_api.py +4 -20
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/graph_dbs/polardb.py +64 -7
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/hello_world.py +1 -1
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/log.py +72 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_feedback/feedback.py +21 -7
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/multi_modal_struct.py +10 -2
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/file_content_parser.py +47 -3
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/multi_modal_parser.py +5 -2
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/analyzer/eval_analyzer.py +3 -3
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/general_modules/init_components_for_scheduler.py +13 -1
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/recall.py +95 -5
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py +2 -8
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/multi_mem_cube/single_cube.py +3 -4
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/cosine_local.py +9 -1
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/mem_feedback_prompts.py +10 -12
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/mem_reader_prompts.py +34 -12
- {memoryos-2.0.24 → memoryos-2.0.25}/LICENSE +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/README.md +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/context/dependencies.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/exceptions.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/add_handler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/base_handler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/chat_handler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/cube_handler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/feedback_handler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/formatters_handler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/memory_handler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/scheduler_handler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/handlers/suggestion_handler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/lifecycle.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/mcp_serve.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/middleware/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/middleware/auth.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/middleware/rate_limit.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/middleware/request_context.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/product_models.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/routers/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/routers/admin_router.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/routers/server_router.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/server_api.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/server_api_ext.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/utils/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/api/utils/api_keys.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/chunkers/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/chunkers/base.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/chunkers/charactertext_chunker.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/chunkers/factory.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/chunkers/markdown_chunker.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/chunkers/sentence_chunker.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/chunkers/simple_chunker.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/cli.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/base.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/chunker.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/embedder.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/graph_db.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/internet_retriever.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/llm.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/mem_agent.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/mem_chat.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/mem_cube.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/mem_os.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/mem_user.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/memory.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/reranker.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/utils.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/configs/vec_db.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/context/context.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dependency.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/deprecation.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/README.md +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/contextualization.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/enrichment.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/hook_defs.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/hooks.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/maintenance.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/pipeline/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/pipeline/base.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/pipeline/diary.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/pipeline/motive.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/pipeline/persistence.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/pipeline/reasoning.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/pipeline/recall.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/plugin.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/prompts/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/prompts/context_binding_prompt.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/prompts/context_summary_prompt.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/prompts/motive_prompt.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/prompts/reasoning_prompt.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/routers/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/routers/diary_router.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/routers/trigger_router.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/routes.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/search.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/signal_store.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/dream/types.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/embedders/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/exceptions.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/extras/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/graph_dbs/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/graph_dbs/base.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/graph_dbs/factory.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/graph_dbs/item.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/graph_dbs/neo4j.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/graph_dbs/neo4j_community.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/graph_dbs/postgres.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/base.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/deepseek.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/factory.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/hf.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/hf_singleton.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/minimax.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/ollama.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/openai.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/openai_new.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/qwen.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/utils.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/llms/vllm.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_agent/base.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_agent/deepsearch_agent.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_agent/factory.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_chat/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_chat/base.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_chat/factory.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_chat/simple.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_cube/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_cube/base.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_cube/general.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_cube/navie.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_cube/utils.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_feedback/base.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_feedback/simple_feedback.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_feedback/utils.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_os/core.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_os/main.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_os/utils/default_config.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_os/utils/format_utils.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_os/utils/reference_utils.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/base.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/factory.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/memory.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/assistant_parser.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/base.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/image_parser.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/string_parser.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/system_parser.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/text_content_parser.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/tool_parser.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/user_parser.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_multi_modal/utils.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_pref_memory/process_preference_memory.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_skill_memory/process_skill_memory.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/read_skill_memory/upload_skill_memory.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/simple_struct.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/strategy_struct.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_reader/utils.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/analyzer/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/analyzer/api_analyzer.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/analyzer/mos_for_test_scheduler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/analyzer/scheduler_for_eval.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/base_mixins/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/base_mixins/memory_ops.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/base_mixins/queue_ops.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/base_mixins/web_log_ops.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/base_scheduler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/general_modules/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/general_modules/api_misc.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/general_modules/base.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/general_modules/misc.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/general_modules/scheduler_logger.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/general_modules/task_threads.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/general_scheduler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/memory_manage_modules/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/memory_manage_modules/activation_memory_manager.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/memory_manage_modules/enhancement_pipeline.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/memory_manage_modules/filter_pipeline.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/memory_manage_modules/memory_filter.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/memory_manage_modules/post_processor.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/memory_manage_modules/rerank_pipeline.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/memory_manage_modules/retriever.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/memory_manage_modules/search_pipeline.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/memory_manage_modules/search_service.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/monitors/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/monitors/dispatcher_monitor.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/monitors/general_monitor.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/monitors/task_schedule_monitor.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/optimized_scheduler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/orm_modules/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/orm_modules/api_redis_model.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/orm_modules/base_model.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/orm_modules/monitor_models.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/orm_modules/redis_model.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/scheduler_factory.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/schemas/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/schemas/analyzer_schemas.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/schemas/api_schemas.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/schemas/general_schemas.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/schemas/message_schemas.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/schemas/monitor_schemas.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/schemas/task_schemas.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/base_handler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/context.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/dispatcher.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/handlers/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/handlers/add_handler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/handlers/answer_handler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/handlers/feedback_handler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/handlers/mem_dream_handler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/handlers/mem_read_handler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/handlers/mem_reorganize_handler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/handlers/memory_update_handler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/handlers/pref_add_handler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/handlers/query_handler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/local_queue.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/orchestrator.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/registry.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/task_schedule_modules/task_queue.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/utils/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/utils/api_utils.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/utils/config_utils.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/utils/db_utils.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/utils/filter_utils.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/utils/metrics.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/utils/misc_utils.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/utils/monitor_event_utils.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/utils/status_tracker.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/webservice_modules/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_scheduler/webservice_modules/redis_service.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_user/factory.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_user/mysql_persistent_user_manager.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_user/mysql_user_manager.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_user/persistent_factory.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_user/persistent_user_manager.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_user/redis_persistent_user_manager.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/mem_user/user_manager.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/activation/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/activation/base.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/activation/item.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/activation/kv.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/activation/vllmkv.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/base.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/factory.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/parametric/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/parametric/base.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/parametric/item.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/parametric/lora.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/base.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/general.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/item.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/naive.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/prefer_text_memory/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/prefer_text_memory/adder.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/prefer_text_memory/config.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/prefer_text_memory/extractor.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/prefer_text_memory/factory.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/prefer_text_memory/retrievers.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/prefer_text_memory/spliter.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/prefer_text_memory/utils.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/preference.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/simple_preference.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/simple_tree.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/organize/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/organize/handler.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/organize/manager.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/organize/relation_reason_detector.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/organize/reorganizer.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/advanced_searcher.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/bm25_util.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/bochasearch.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever_factory.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/reasoner.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/reranker.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/retrieval_mid_structs.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/retrieve_utils.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/task_goal_parser.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/tavilysearch.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/utils.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memories/textual/tree_text_memory/retrieve/xinyusearch.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memos_tools/dinding_report_bot.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memos_tools/lockfree_dict.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memos_tools/notification_service.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memos_tools/notification_utils.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memos_tools/singleton.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memos_tools/thread_safe_dict.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/memos_tools/thread_safe_dict_segment.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/multi_mem_cube/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/multi_mem_cube/composite_cube.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/multi_mem_cube/views.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/parsers/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/parsers/base.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/parsers/factory.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/parsers/markitdown.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/plugins/README.md +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/plugins/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/plugins/base.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/plugins/component_bootstrap.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/plugins/hook_defs.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/plugins/hooks.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/plugins/manager.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/base.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/concat.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/factory.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/http_bge.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/http_bge_strategy.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/noop.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/strategies/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/strategies/base.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/strategies/concat_background.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/strategies/concat_docsource.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/strategies/dialogue_common.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/strategies/factory.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/strategies/single_turn.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/reranker/strategies/singleturn_outmem.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/search/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/search/search_service.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/settings.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/advanced_search_prompts.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/cloud_service_prompt.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/instruction_completion.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/mem_agent_prompts.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/mem_reader_strategy_prompts.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/mem_scheduler_prompts.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/mem_search_prompts.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/mos_prompts.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/prefer_complete_prompt.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/skill_mem_prompt.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/tool_mem_prompts.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/templates/tree_reorganize_prompts.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/general_types.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_assistant_message_param.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_image_param.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_input_audio_param.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_param.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_refusal_param.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_text_param.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_message_custom_tool_call_param.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_message_function_tool_call_param.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_message_param.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_message_tool_call_union_param.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_system_message_param.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_tool_message_param.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/types/openai_chat_completion_types/chat_completion_user_message_param.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/utils.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/vec_dbs/__init__.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/vec_dbs/base.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/vec_dbs/factory.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/vec_dbs/item.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/vec_dbs/milvus.py +0 -0
- {memoryos-2.0.24 → memoryos-2.0.25}/src/memos/vec_dbs/qdrant.py +0 -0
|
@@ -71,6 +71,18 @@ class MemOSClient:
|
|
|
71
71
|
if bool(user_id) == bool(agent_id):
|
|
72
72
|
raise ValueError("exactly one of user_id or agent_id is required")
|
|
73
73
|
|
|
74
|
+
@staticmethod
|
|
75
|
+
def _normalize_task_status_response(
|
|
76
|
+
response_data: dict[str, Any], task_id: str
|
|
77
|
+
) -> dict[str, Any]:
|
|
78
|
+
data = response_data.get("data")
|
|
79
|
+
if not (isinstance(data, list) and len(data) == 1 and isinstance(data[0], dict)):
|
|
80
|
+
return response_data
|
|
81
|
+
|
|
82
|
+
normalized_data = data[0].copy()
|
|
83
|
+
normalized_data.setdefault("task_id", task_id)
|
|
84
|
+
return {**response_data, "data": normalized_data}
|
|
85
|
+
|
|
74
86
|
def _post_json_dict(
|
|
75
87
|
self, endpoint: str, payload: dict[str, Any], operation: str
|
|
76
88
|
) -> dict[str, Any] | None:
|
|
@@ -549,6 +561,7 @@ class MemOSClient:
|
|
|
549
561
|
)
|
|
550
562
|
response.raise_for_status()
|
|
551
563
|
response_data = response.json()
|
|
564
|
+
response_data = self._normalize_task_status_response(response_data, task_id)
|
|
552
565
|
|
|
553
566
|
return MemOSGetTaskStatusResponse(**response_data)
|
|
554
567
|
except Exception as e:
|
|
@@ -260,13 +260,56 @@ NacosConfigManager.start_watch_if_enabled()
|
|
|
260
260
|
class APIConfig:
|
|
261
261
|
"""Centralized configuration management for MemOS APIs."""
|
|
262
262
|
|
|
263
|
+
_OPENAI_API_BASE = "https://api.openai.com/v1"
|
|
264
|
+
_QWEN_API_BASE = "https://dashscope.aliyuncs.com/compatible-mode/v1"
|
|
265
|
+
|
|
266
|
+
@staticmethod
|
|
267
|
+
def _is_qwen_model(model_name: str) -> bool:
|
|
268
|
+
normalized_model = model_name.strip().lower()
|
|
269
|
+
return normalized_model.startswith("qwen") or "/qwen" in normalized_model
|
|
270
|
+
|
|
263
271
|
@staticmethod
|
|
264
|
-
def
|
|
272
|
+
def _qwen_flash_extra_body(model_name: str) -> dict[str, Any] | None:
|
|
265
273
|
normalized_model = model_name.strip().lower()
|
|
266
274
|
if normalized_model.startswith(("qwen3.5", "qwen3.6")):
|
|
267
275
|
return {"enable_thinking": False}
|
|
268
276
|
return None
|
|
269
277
|
|
|
278
|
+
@staticmethod
|
|
279
|
+
def _build_provider_llm_config(
|
|
280
|
+
model_name: str,
|
|
281
|
+
*,
|
|
282
|
+
temperature: float = 0.6,
|
|
283
|
+
max_tokens: int = 8000,
|
|
284
|
+
top_p: float = 0.95,
|
|
285
|
+
top_k: int = 20,
|
|
286
|
+
remove_think_prefix: bool = True,
|
|
287
|
+
) -> dict[str, Any]:
|
|
288
|
+
"""Build task LLM config from model name plus shared provider credentials.
|
|
289
|
+
|
|
290
|
+
MEMRADER_MODEL remains a dedicated fine-tuned extractor. Other task-specific
|
|
291
|
+
model knobs choose only the model; endpoint credentials come from either
|
|
292
|
+
QWEN_* or OPENAI_* according to the model family.
|
|
293
|
+
"""
|
|
294
|
+
is_qwen = APIConfig._is_qwen_model(model_name)
|
|
295
|
+
config = {
|
|
296
|
+
"model_name_or_path": model_name,
|
|
297
|
+
"temperature": temperature,
|
|
298
|
+
"max_tokens": max_tokens,
|
|
299
|
+
"top_p": top_p,
|
|
300
|
+
"top_k": top_k,
|
|
301
|
+
"remove_think_prefix": remove_think_prefix,
|
|
302
|
+
"api_key": os.getenv("QWEN_API_KEY" if is_qwen else "OPENAI_API_KEY", "EMPTY"),
|
|
303
|
+
"api_base": os.getenv(
|
|
304
|
+
"QWEN_API_BASE" if is_qwen else "OPENAI_API_BASE",
|
|
305
|
+
APIConfig._QWEN_API_BASE if is_qwen else APIConfig._OPENAI_API_BASE,
|
|
306
|
+
),
|
|
307
|
+
}
|
|
308
|
+
extra_body = APIConfig._qwen_flash_extra_body(model_name) if is_qwen else None
|
|
309
|
+
if extra_body is not None:
|
|
310
|
+
config["extra_body"] = extra_body
|
|
311
|
+
return {"backend": "qwen" if is_qwen else "openai", "config": config}
|
|
312
|
+
|
|
270
313
|
@staticmethod
|
|
271
314
|
def get_profile_memory_reserved_top_k() -> int:
|
|
272
315
|
"""Get profile-memory MMR reserve count.
|
|
@@ -293,7 +336,7 @@ class APIConfig:
|
|
|
293
336
|
"top_k": int(os.getenv("MOS_TOP_K", "50")),
|
|
294
337
|
"remove_think_prefix": True,
|
|
295
338
|
"api_key": os.getenv("OPENAI_API_KEY", "your-api-key-here"),
|
|
296
|
-
"api_base": os.getenv("OPENAI_API_BASE",
|
|
339
|
+
"api_base": os.getenv("OPENAI_API_BASE", APIConfig._OPENAI_API_BASE),
|
|
297
340
|
}
|
|
298
341
|
|
|
299
342
|
@staticmethod
|
|
@@ -357,7 +400,7 @@ class APIConfig:
|
|
|
357
400
|
|
|
358
401
|
@staticmethod
|
|
359
402
|
def get_memreader_config() -> dict[str, Any]:
|
|
360
|
-
"""Get MemReader configuration for chat
|
|
403
|
+
"""Get the main MemReader configuration for text/chat extraction.
|
|
361
404
|
|
|
362
405
|
When MEMREADER_GENERAL_MODEL is configured (i.e. a separate stable LLM exists),
|
|
363
406
|
the backup client is automatically enabled so that primary failures (self-deployed
|
|
@@ -379,15 +422,11 @@ class APIConfig:
|
|
|
379
422
|
general_model = os.getenv("MEMREADER_GENERAL_MODEL")
|
|
380
423
|
enable_backup = os.getenv("MEMREADER_ENABLE_BACKUP", "false").lower() == "true"
|
|
381
424
|
if general_model and enable_backup:
|
|
425
|
+
backup_config = APIConfig._build_provider_llm_config(general_model)["config"]
|
|
382
426
|
config["backup_client"] = True
|
|
383
427
|
config["backup_model_name_or_path"] = general_model
|
|
384
|
-
config["backup_api_key"] =
|
|
385
|
-
|
|
386
|
-
)
|
|
387
|
-
config["backup_api_base"] = os.getenv(
|
|
388
|
-
"MEMREADER_GENERAL_API_BASE",
|
|
389
|
-
os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1"),
|
|
390
|
-
)
|
|
428
|
+
config["backup_api_key"] = backup_config["api_key"]
|
|
429
|
+
config["backup_api_base"] = backup_config["api_base"]
|
|
391
430
|
|
|
392
431
|
return {"backend": "openai", "config": config}
|
|
393
432
|
|
|
@@ -395,25 +434,17 @@ class APIConfig:
|
|
|
395
434
|
def get_qwen_llm_config() -> dict[str, Any] | None:
|
|
396
435
|
if not os.getenv("QWEN_API_KEY"):
|
|
397
436
|
return None
|
|
398
|
-
return
|
|
399
|
-
"
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
"top_k": int(os.getenv("QWEN_TOP_K", "50")),
|
|
406
|
-
"remove_think_prefix": os.getenv("QWEN_REMOVE_THINK_PREFIX", "true").lower()
|
|
407
|
-
== "true",
|
|
408
|
-
"api_key": os.getenv("QWEN_API_KEY", ""),
|
|
409
|
-
"api_base": os.getenv("QWEN_API_BASE", ""),
|
|
410
|
-
"model_schema": os.getenv("QWEN_MODEL_SCHEMA", "memos.configs.llm.QwenLLMConfig"),
|
|
411
|
-
},
|
|
412
|
-
}
|
|
437
|
+
return APIConfig._build_provider_llm_config(
|
|
438
|
+
os.getenv("QWEN_MODEL", "qwen-flash"),
|
|
439
|
+
temperature=0.8,
|
|
440
|
+
max_tokens=8000,
|
|
441
|
+
top_p=0.9,
|
|
442
|
+
top_k=50,
|
|
443
|
+
)
|
|
413
444
|
|
|
414
445
|
@staticmethod
|
|
415
446
|
def get_memreader_general_llm_config() -> dict[str, Any]:
|
|
416
|
-
"""Get general LLM configuration for non-
|
|
447
|
+
"""Get general LLM configuration for non-primary extraction tasks.
|
|
417
448
|
|
|
418
449
|
Used for: hallucination filter, memory rewrite, memory merge,
|
|
419
450
|
tool trajectory extraction, skill memory extraction.
|
|
@@ -428,24 +459,7 @@ class APIConfig:
|
|
|
428
459
|
# Check if specific general model is configured
|
|
429
460
|
general_model = os.getenv("MEMREADER_GENERAL_MODEL")
|
|
430
461
|
if general_model:
|
|
431
|
-
return
|
|
432
|
-
"backend": os.getenv("MEMREADER_GENERAL_BACKEND", "openai"),
|
|
433
|
-
"config": {
|
|
434
|
-
"model_name_or_path": general_model,
|
|
435
|
-
"temperature": 0.6,
|
|
436
|
-
"max_tokens": int(os.getenv("MEMREADER_GENERAL_MAX_TOKENS", "8000")),
|
|
437
|
-
"top_p": 0.95,
|
|
438
|
-
"top_k": 20,
|
|
439
|
-
"api_key": os.getenv(
|
|
440
|
-
"MEMREADER_GENERAL_API_KEY", os.getenv("OPENAI_API_KEY", "EMPTY")
|
|
441
|
-
),
|
|
442
|
-
"api_base": os.getenv(
|
|
443
|
-
"MEMREADER_GENERAL_API_BASE",
|
|
444
|
-
os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1"),
|
|
445
|
-
),
|
|
446
|
-
"remove_think_prefix": True,
|
|
447
|
-
},
|
|
448
|
-
}
|
|
462
|
+
return APIConfig._build_provider_llm_config(general_model)
|
|
449
463
|
# Fallback to memreader config (same behavior as before for users who don't customize)
|
|
450
464
|
return APIConfig.get_memreader_config()
|
|
451
465
|
|
|
@@ -460,27 +474,28 @@ class APIConfig:
|
|
|
460
474
|
"""
|
|
461
475
|
image_model = os.getenv("IMAGE_PARSER_MODEL")
|
|
462
476
|
if image_model:
|
|
463
|
-
return
|
|
464
|
-
"backend": os.getenv("IMAGE_PARSER_BACKEND", "openai"),
|
|
465
|
-
"config": {
|
|
466
|
-
"model_name_or_path": image_model,
|
|
467
|
-
"temperature": 0.6,
|
|
468
|
-
"max_tokens": int(os.getenv("IMAGE_PARSER_MAX_TOKENS", "4096")),
|
|
469
|
-
"top_p": 0.95,
|
|
470
|
-
"top_k": 20,
|
|
471
|
-
"api_key": os.getenv(
|
|
472
|
-
"IMAGE_PARSER_API_KEY", os.getenv("OPENAI_API_KEY", "EMPTY")
|
|
473
|
-
),
|
|
474
|
-
"api_base": os.getenv(
|
|
475
|
-
"IMAGE_PARSER_API_BASE",
|
|
476
|
-
os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1"),
|
|
477
|
-
),
|
|
478
|
-
"remove_think_prefix": True,
|
|
479
|
-
},
|
|
480
|
-
}
|
|
477
|
+
return APIConfig._build_provider_llm_config(image_model, max_tokens=4096)
|
|
481
478
|
# Fallback to general_llm config (which itself falls back to OpenAI)
|
|
482
479
|
return APIConfig.get_memreader_general_llm_config()
|
|
483
480
|
|
|
481
|
+
@staticmethod
|
|
482
|
+
def get_document_parser_llm_config() -> dict[str, Any] | None:
|
|
483
|
+
"""Get the dedicated LLM configuration for document extraction.
|
|
484
|
+
|
|
485
|
+
The provider endpoint and credentials are selected from QWEN_* or
|
|
486
|
+
OPENAI_* according to DOCUMENT_PARSER_MODEL.
|
|
487
|
+
|
|
488
|
+
Fallback chain: DOCUMENT_PARSER_MODEL -> MEMREADER_GENERAL_MODEL.
|
|
489
|
+
Returns None when neither model is configured.
|
|
490
|
+
"""
|
|
491
|
+
document_model = os.getenv("DOCUMENT_PARSER_MODEL") or os.getenv("MEMREADER_GENERAL_MODEL")
|
|
492
|
+
if not document_model:
|
|
493
|
+
return None
|
|
494
|
+
return APIConfig._build_provider_llm_config(
|
|
495
|
+
document_model,
|
|
496
|
+
temperature=0.8,
|
|
497
|
+
)
|
|
498
|
+
|
|
484
499
|
@staticmethod
|
|
485
500
|
def get_preference_extractor_llm_config() -> dict[str, Any]:
|
|
486
501
|
"""Get LLM configuration for preference extraction.
|
|
@@ -491,31 +506,23 @@ class APIConfig:
|
|
|
491
506
|
"""
|
|
492
507
|
pref_model = os.getenv("PREFERENCE_EXTRACTOR_MODEL")
|
|
493
508
|
if pref_model:
|
|
494
|
-
|
|
495
|
-
config = {
|
|
496
|
-
"model_name_or_path": pref_model,
|
|
497
|
-
"temperature": 0.6,
|
|
498
|
-
"max_tokens": int(os.getenv("PREFERENCE_EXTRACTOR_MAX_TOKENS", "8000")),
|
|
499
|
-
"top_p": 0.95,
|
|
500
|
-
"top_k": 20,
|
|
501
|
-
"api_key": os.getenv(
|
|
502
|
-
"PREFERENCE_EXTRACTOR_API_KEY", os.getenv("OPENAI_API_KEY", "EMPTY")
|
|
503
|
-
),
|
|
504
|
-
"api_base": os.getenv(
|
|
505
|
-
"PREFERENCE_EXTRACTOR_API_BASE",
|
|
506
|
-
os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1"),
|
|
507
|
-
),
|
|
508
|
-
"remove_think_prefix": True,
|
|
509
|
-
}
|
|
510
|
-
if extra_body is not None:
|
|
511
|
-
config["extra_body"] = extra_body
|
|
512
|
-
return {
|
|
513
|
-
"backend": os.getenv("PREFERENCE_EXTRACTOR_BACKEND", "openai"),
|
|
514
|
-
"config": config,
|
|
515
|
-
}
|
|
509
|
+
return APIConfig._build_provider_llm_config(pref_model)
|
|
516
510
|
# Fallback to general_llm config (which itself falls back to OpenAI)
|
|
517
511
|
return APIConfig.get_memreader_general_llm_config()
|
|
518
512
|
|
|
513
|
+
@staticmethod
|
|
514
|
+
def get_feedback_llm_config() -> dict[str, Any]:
|
|
515
|
+
"""Get LLM configuration for feedback processing.
|
|
516
|
+
|
|
517
|
+
Used for: feedback judgement, semantic add/update decisions, and update safety review.
|
|
518
|
+
|
|
519
|
+
Fallback chain: FEEDBACK_MODEL -> general_llm -> memreader config.
|
|
520
|
+
"""
|
|
521
|
+
feedback_model = os.getenv("FEEDBACK_MODEL")
|
|
522
|
+
if feedback_model:
|
|
523
|
+
return APIConfig._build_provider_llm_config(feedback_model, temperature=0.8)
|
|
524
|
+
return APIConfig.get_memreader_general_llm_config()
|
|
525
|
+
|
|
519
526
|
@staticmethod
|
|
520
527
|
def get_activation_vllm_config() -> dict[str, Any]:
|
|
521
528
|
"""Get Ollama configuration."""
|
|
@@ -1005,6 +1012,8 @@ class APIConfig:
|
|
|
1005
1012
|
"general_llm": APIConfig.get_memreader_general_llm_config(),
|
|
1006
1013
|
# Image parser LLM (requires vision model)
|
|
1007
1014
|
"image_parser_llm": APIConfig.get_image_parser_llm_config(),
|
|
1015
|
+
# Dedicated LLM for document chunk extraction
|
|
1016
|
+
"document_parser_llm": APIConfig.get_document_parser_llm_config(),
|
|
1008
1017
|
# Preference extractor LLM. Reader falls back to general_llm when unset.
|
|
1009
1018
|
"preference_extractor_llm": APIConfig.get_preference_extractor_llm_config()
|
|
1010
1019
|
if os.getenv("PREFERENCE_EXTRACTOR_MODEL")
|
|
@@ -1138,6 +1147,8 @@ class APIConfig:
|
|
|
1138
1147
|
"general_llm": APIConfig.get_memreader_general_llm_config(),
|
|
1139
1148
|
# Image parser LLM (requires vision model)
|
|
1140
1149
|
"image_parser_llm": APIConfig.get_image_parser_llm_config(),
|
|
1150
|
+
# Dedicated LLM for document chunk extraction
|
|
1151
|
+
"document_parser_llm": APIConfig.get_document_parser_llm_config(),
|
|
1141
1152
|
# Preference extractor LLM. Reader falls back to general_llm when unset.
|
|
1142
1153
|
"preference_extractor_llm": APIConfig.get_preference_extractor_llm_config()
|
|
1143
1154
|
if os.getenv("PREFERENCE_EXTRACTOR_MODEL")
|
|
@@ -20,6 +20,7 @@ from memos.api.handlers import (
|
|
|
20
20
|
from memos.api.handlers.component_init import init_server
|
|
21
21
|
from memos.api.handlers.config_builders import (
|
|
22
22
|
build_embedder_config,
|
|
23
|
+
build_feedback_llm_config,
|
|
23
24
|
build_graph_db_config,
|
|
24
25
|
build_internet_retriever_config,
|
|
25
26
|
build_llm_config,
|
|
@@ -39,6 +40,7 @@ from memos.api.handlers.formatters_handler import (
|
|
|
39
40
|
__all__ = [
|
|
40
41
|
"add_handler",
|
|
41
42
|
"build_embedder_config",
|
|
43
|
+
"build_feedback_llm_config",
|
|
42
44
|
"build_graph_db_config",
|
|
43
45
|
"build_internet_retriever_config",
|
|
44
46
|
"build_llm_config",
|
|
@@ -13,6 +13,7 @@ from memos.api.config import APIConfig
|
|
|
13
13
|
from memos.api.handlers.config_builders import (
|
|
14
14
|
build_chat_llm_config,
|
|
15
15
|
build_embedder_config,
|
|
16
|
+
build_feedback_llm_config,
|
|
16
17
|
build_feedback_reranker_config,
|
|
17
18
|
build_graph_db_config,
|
|
18
19
|
build_internet_retriever_config,
|
|
@@ -156,6 +157,7 @@ def init_server() -> dict[str, Any]:
|
|
|
156
157
|
# Build component configurations
|
|
157
158
|
graph_db_config = build_graph_db_config()
|
|
158
159
|
llm_config = build_llm_config()
|
|
160
|
+
feedback_llm_config = build_feedback_llm_config()
|
|
159
161
|
chat_llm_config = build_chat_llm_config()
|
|
160
162
|
playground_chat_llm_config = build_chat_llm_config("PLAYGROUND_CHAT_MODEL_LIST")
|
|
161
163
|
embedder_config = build_embedder_config()
|
|
@@ -170,6 +172,7 @@ def init_server() -> dict[str, Any]:
|
|
|
170
172
|
# Create component instances
|
|
171
173
|
graph_db = GraphStoreFactory.from_config(graph_db_config)
|
|
172
174
|
llm = LLMFactory.from_config(llm_config)
|
|
175
|
+
feedback_llm = LLMFactory.from_config(feedback_llm_config)
|
|
173
176
|
chat_llms = (
|
|
174
177
|
_init_chat_llms(chat_llm_config)
|
|
175
178
|
if os.getenv("ENABLE_CHAT_API", "false") == "true"
|
|
@@ -260,7 +263,7 @@ def init_server() -> dict[str, Any]:
|
|
|
260
263
|
|
|
261
264
|
# Initialize feedback server
|
|
262
265
|
feedback_server = SimpleMemFeedback(
|
|
263
|
-
llm=
|
|
266
|
+
llm=feedback_llm,
|
|
264
267
|
embedder=embedder,
|
|
265
268
|
graph_store=graph_db,
|
|
266
269
|
memory_manager=memory_manager,
|
|
@@ -157,6 +157,16 @@ def build_feedback_reranker_config() -> dict[str, Any]:
|
|
|
157
157
|
return RerankerConfigFactory.model_validate(APIConfig.get_feedback_reranker_config())
|
|
158
158
|
|
|
159
159
|
|
|
160
|
+
def build_feedback_llm_config() -> dict[str, Any]:
|
|
161
|
+
"""
|
|
162
|
+
Build feedback LLM configuration.
|
|
163
|
+
|
|
164
|
+
Returns:
|
|
165
|
+
Validated feedback LLM configuration dictionary
|
|
166
|
+
"""
|
|
167
|
+
return LLMConfigFactory.model_validate(APIConfig.get_feedback_llm_config())
|
|
168
|
+
|
|
169
|
+
|
|
160
170
|
def build_internet_retriever_config() -> dict[str, Any]:
|
|
161
171
|
"""
|
|
162
172
|
Build internet retriever configuration.
|
|
@@ -16,7 +16,7 @@ from memos.api.handlers.base_handler import BaseHandler, HandlerDependencies
|
|
|
16
16
|
from memos.api.handlers.formatters_handler import rerank_knowledge_mem
|
|
17
17
|
from memos.api.product_models import APISearchRequest, SearchResponse
|
|
18
18
|
from memos.dream.contextualization import CONTEXT_MEMORY_TYPE
|
|
19
|
-
from memos.log import get_logger
|
|
19
|
+
from memos.log import get_logger, summarize_search_request, summarize_search_results
|
|
20
20
|
from memos.memories.textual.tree_text_memory.retrieve.retrieve_utils import (
|
|
21
21
|
cosine_similarity_matrix,
|
|
22
22
|
)
|
|
@@ -32,6 +32,8 @@ logger = get_logger(__name__)
|
|
|
32
32
|
_ENV_CONTEXT_RECALL = "MEMOS_DREAM_CONTEXT_RECALL"
|
|
33
33
|
_ENV_CONTEXT_RECALL_TOP_K = "MEMOS_DREAM_CONTEXT_RECALL_TOP_K"
|
|
34
34
|
_DEFAULT_CONTEXT_RECALL_TOP_K = 2
|
|
35
|
+
_ENV_MMR_CANDIDATE_PRUNING = "MEMOS_MMR_CANDIDATE_PRUNING_ENABLED"
|
|
36
|
+
_MMR_CANDIDATE_MULTIPLIER = 2
|
|
35
37
|
|
|
36
38
|
|
|
37
39
|
def _env_enabled(name: str, default: str = "off") -> bool:
|
|
@@ -77,7 +79,10 @@ class SearchHandler(BaseHandler):
|
|
|
77
79
|
Returns:
|
|
78
80
|
SearchResponse with formatted results
|
|
79
81
|
"""
|
|
80
|
-
self.logger.info(
|
|
82
|
+
self.logger.info(
|
|
83
|
+
"[SearchHandler] Search request summary: %s",
|
|
84
|
+
summarize_search_request(search_req),
|
|
85
|
+
)
|
|
81
86
|
|
|
82
87
|
# Use deepcopy to avoid modifying the original request object
|
|
83
88
|
search_req_local = copy.deepcopy(search_req)
|
|
@@ -137,7 +142,8 @@ class SearchHandler(BaseHandler):
|
|
|
137
142
|
results = hooked_results
|
|
138
143
|
|
|
139
144
|
self.logger.info(
|
|
140
|
-
|
|
145
|
+
"[SearchHandler] Final search result summary: %s",
|
|
146
|
+
summarize_search_results(results),
|
|
141
147
|
)
|
|
142
148
|
|
|
143
149
|
return SearchResponse(
|
|
@@ -348,6 +354,12 @@ class SearchHandler(BaseHandler):
|
|
|
348
354
|
if not text_buckets and not pref_buckets:
|
|
349
355
|
return results
|
|
350
356
|
|
|
357
|
+
self._prune_mmr_candidates_by_bucket(
|
|
358
|
+
results,
|
|
359
|
+
text_top_k=text_top_k,
|
|
360
|
+
pref_top_k=pref_top_k,
|
|
361
|
+
)
|
|
362
|
+
|
|
351
363
|
# Flatten all memories with their type and scores
|
|
352
364
|
# flat structure: (memory_type, bucket_idx, mem, score)
|
|
353
365
|
flat: list[tuple[str, int, dict[str, Any], float]] = []
|
|
@@ -552,6 +564,87 @@ class SearchHandler(BaseHandler):
|
|
|
552
564
|
|
|
553
565
|
return results
|
|
554
566
|
|
|
567
|
+
def _prune_mmr_candidates_by_bucket(
|
|
568
|
+
self,
|
|
569
|
+
results: dict[str, Any],
|
|
570
|
+
*,
|
|
571
|
+
text_top_k: int,
|
|
572
|
+
pref_top_k: int,
|
|
573
|
+
) -> dict[str, Any]:
|
|
574
|
+
"""Keep at most twice the final quota for each memory type in each bucket."""
|
|
575
|
+
if not _env_enabled(_ENV_MMR_CANDIDATE_PRUNING, "off"):
|
|
576
|
+
return results
|
|
577
|
+
|
|
578
|
+
total_before = 0
|
|
579
|
+
total_after = 0
|
|
580
|
+
bucket_counts: list[tuple[int, int]] = []
|
|
581
|
+
|
|
582
|
+
for result_key, target_top_k in (
|
|
583
|
+
("text_mem", text_top_k),
|
|
584
|
+
("pref_mem", pref_top_k),
|
|
585
|
+
):
|
|
586
|
+
buckets = results.get(result_key)
|
|
587
|
+
if not isinstance(buckets, list):
|
|
588
|
+
continue
|
|
589
|
+
|
|
590
|
+
candidate_limit = max(0, int(target_top_k)) * _MMR_CANDIDATE_MULTIPLIER
|
|
591
|
+
for bucket in buckets:
|
|
592
|
+
memories = bucket.get("memories") if isinstance(bucket, dict) else None
|
|
593
|
+
if not isinstance(memories, list):
|
|
594
|
+
continue
|
|
595
|
+
|
|
596
|
+
before_count = len(memories)
|
|
597
|
+
total_before += before_count
|
|
598
|
+
memories_by_type: dict[str, list[dict[str, Any]]] = {}
|
|
599
|
+
for memory in memories:
|
|
600
|
+
if not isinstance(memory, dict):
|
|
601
|
+
continue
|
|
602
|
+
metadata = memory.get("metadata")
|
|
603
|
+
memory_type = (
|
|
604
|
+
metadata.get("memory_type") if isinstance(metadata, dict) else None
|
|
605
|
+
)
|
|
606
|
+
memories_by_type.setdefault(str(memory_type or result_key), []).append(memory)
|
|
607
|
+
|
|
608
|
+
selected: list[dict[str, Any]] = []
|
|
609
|
+
if candidate_limit > 0:
|
|
610
|
+
for typed_memories in memories_by_type.values():
|
|
611
|
+
selected.extend(
|
|
612
|
+
sorted(
|
|
613
|
+
typed_memories,
|
|
614
|
+
key=self._mmr_candidate_score,
|
|
615
|
+
reverse=True,
|
|
616
|
+
)[:candidate_limit]
|
|
617
|
+
)
|
|
618
|
+
selected.sort(key=self._mmr_candidate_score, reverse=True)
|
|
619
|
+
|
|
620
|
+
bucket["memories"] = selected
|
|
621
|
+
if "total_nodes" in bucket:
|
|
622
|
+
bucket["total_nodes"] = len(selected)
|
|
623
|
+
total_after += len(selected)
|
|
624
|
+
bucket_counts.append((before_count, len(selected)))
|
|
625
|
+
|
|
626
|
+
self.logger.info(
|
|
627
|
+
"[SearchHandler] MMR candidate pruning: multiplier=%s before=%s after=%s "
|
|
628
|
+
"dropped=%s bucket_counts=%s",
|
|
629
|
+
_MMR_CANDIDATE_MULTIPLIER,
|
|
630
|
+
total_before,
|
|
631
|
+
total_after,
|
|
632
|
+
total_before - total_after,
|
|
633
|
+
bucket_counts,
|
|
634
|
+
)
|
|
635
|
+
return results
|
|
636
|
+
|
|
637
|
+
@staticmethod
|
|
638
|
+
def _mmr_candidate_score(memory: dict[str, Any]) -> float:
|
|
639
|
+
metadata = memory.get("metadata")
|
|
640
|
+
if not isinstance(metadata, dict):
|
|
641
|
+
return 0.0
|
|
642
|
+
score = metadata.get("score", metadata.get("relativity", 0.0))
|
|
643
|
+
try:
|
|
644
|
+
return float(score or 0.0)
|
|
645
|
+
except (TypeError, ValueError):
|
|
646
|
+
return 0.0
|
|
647
|
+
|
|
555
648
|
@staticmethod
|
|
556
649
|
def _is_unrelated(
|
|
557
650
|
index: int,
|
|
@@ -25,7 +25,8 @@ class BaseMemReaderConfig(BaseConfig):
|
|
|
25
25
|
return value
|
|
26
26
|
|
|
27
27
|
llm: LLMConfigFactory = Field(
|
|
28
|
-
...,
|
|
28
|
+
...,
|
|
29
|
+
description="Main LLM configuration for standard text/chat memory extraction",
|
|
29
30
|
)
|
|
30
31
|
general_llm: LLMConfigFactory | None = Field(
|
|
31
32
|
default=None,
|
|
@@ -36,6 +37,10 @@ class BaseMemReaderConfig(BaseConfig):
|
|
|
36
37
|
default=None,
|
|
37
38
|
description="Vision LLM for image parsing. Falls back to general_llm if not set.",
|
|
38
39
|
)
|
|
40
|
+
document_parser_llm: LLMConfigFactory | None = Field(
|
|
41
|
+
default=None,
|
|
42
|
+
description="Dedicated LLM for document content extraction",
|
|
43
|
+
)
|
|
39
44
|
preference_extractor_llm: LLMConfigFactory | None = Field(
|
|
40
45
|
default=None,
|
|
41
46
|
description="LLM for preference extraction. Falls back to general_llm if not set.",
|
|
@@ -212,6 +212,14 @@ class OpenAIConfig(BaseConfig, DictConversionMixin, EnvConfigMixin):
|
|
|
212
212
|
base_url: str = Field(default="", description="Base URL for API endpoint")
|
|
213
213
|
default_model: str = Field(default="", description="Default model to use")
|
|
214
214
|
|
|
215
|
+
@classmethod
|
|
216
|
+
def from_env(cls) -> "OpenAIConfig":
|
|
217
|
+
return cls(
|
|
218
|
+
api_key=os.getenv("OPENAI_API_KEY", ""),
|
|
219
|
+
base_url=os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1"),
|
|
220
|
+
default_model=os.getenv("MEMSCHEDULER_OPENAI_DEFAULT_MODEL", "gpt-4o-mini"),
|
|
221
|
+
)
|
|
222
|
+
|
|
215
223
|
|
|
216
224
|
class AuthConfig(BaseConfig, DictConversionMixin):
|
|
217
225
|
rabbitmq: RabbitMQConfig | None = None
|
|
@@ -339,10 +347,16 @@ class AuthConfig(BaseConfig, DictConversionMixin):
|
|
|
339
347
|
except (ValueError, Exception) as e:
|
|
340
348
|
logger.warning(f"Failed to initialize RabbitMQ config from environment: {e}")
|
|
341
349
|
|
|
342
|
-
# Try to initialize OpenAI config -
|
|
350
|
+
# Try to initialize OpenAI config - shared credentials plus scheduler model override.
|
|
343
351
|
try:
|
|
344
|
-
|
|
345
|
-
|
|
352
|
+
has_openai_env = any(
|
|
353
|
+
key in os.environ
|
|
354
|
+
for key in [
|
|
355
|
+
"OPENAI_API_KEY",
|
|
356
|
+
"OPENAI_API_BASE",
|
|
357
|
+
"MEMSCHEDULER_OPENAI_DEFAULT_MODEL",
|
|
358
|
+
]
|
|
359
|
+
)
|
|
346
360
|
if has_openai_env:
|
|
347
361
|
openai_config = OpenAIConfig.from_env()
|
|
348
362
|
logger.info("Successfully initialized OpenAI configuration")
|
|
@@ -375,7 +389,7 @@ class AuthConfig(BaseConfig, DictConversionMixin):
|
|
|
375
389
|
# Set environment variables only if openai config is available
|
|
376
390
|
if self.openai is not None:
|
|
377
391
|
os.environ["OPENAI_API_KEY"] = self.openai.api_key
|
|
378
|
-
os.environ["
|
|
392
|
+
os.environ["OPENAI_API_BASE"] = self.openai.base_url
|
|
379
393
|
os.environ["MODEL"] = self.openai.default_model
|
|
380
394
|
else:
|
|
381
395
|
logger = logging.getLogger(__name__)
|
|
@@ -17,7 +17,7 @@ class ParserConfigFactory(BaseConfig):
|
|
|
17
17
|
"""Factory class for creating Parser configurations."""
|
|
18
18
|
|
|
19
19
|
backend: str = Field(..., description="Backend for parser")
|
|
20
|
-
config:
|
|
20
|
+
config: BaseParserConfig = Field(..., description="Configuration for the parser backend")
|
|
21
21
|
|
|
22
22
|
backend_to_class: ClassVar[dict[str, Any]] = {
|
|
23
23
|
"markitdown": MarkItDownParserConfig,
|
|
@@ -31,8 +31,23 @@ class ParserConfigFactory(BaseConfig):
|
|
|
31
31
|
raise ValueError(f"Invalid backend: {backend}")
|
|
32
32
|
return backend
|
|
33
33
|
|
|
34
|
-
@model_validator(mode="
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
@model_validator(mode="before")
|
|
35
|
+
@classmethod
|
|
36
|
+
def create_config(cls, data: Any) -> Any:
|
|
37
|
+
if not isinstance(data, dict):
|
|
38
|
+
return data
|
|
39
|
+
|
|
40
|
+
if "backend" not in data or "config" not in data:
|
|
41
|
+
return data
|
|
42
|
+
|
|
43
|
+
config_class = cls.backend_to_class.get(data["backend"])
|
|
44
|
+
if config_class is None:
|
|
45
|
+
return data
|
|
46
|
+
|
|
47
|
+
config = data.get("config")
|
|
48
|
+
if isinstance(config, config_class):
|
|
49
|
+
return data
|
|
50
|
+
|
|
51
|
+
data = data.copy()
|
|
52
|
+
data["config"] = config_class.model_validate(config)
|
|
53
|
+
return data
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from memos.configs.embedder import ArkEmbedderConfig
|
|
2
2
|
from memos.dependency import require_python_package
|
|
3
|
-
from memos.embedders.base import BaseEmbedder
|
|
3
|
+
from memos.embedders.base import BaseEmbedder, log_embedding_call
|
|
4
4
|
from memos.log import get_logger
|
|
5
5
|
|
|
6
6
|
|
|
@@ -35,6 +35,7 @@ class ArkEmbedder(BaseEmbedder):
|
|
|
35
35
|
# Initialize ark client
|
|
36
36
|
self.client = Ark(api_key=self.config.api_key, base_url=self.config.api_base)
|
|
37
37
|
|
|
38
|
+
@log_embedding_call
|
|
38
39
|
def embed(self, texts: list[str]) -> list[list[float]]:
|
|
39
40
|
"""
|
|
40
41
|
Generate embeddings for the given texts.
|