MemoryOS 2.0.15__tar.gz → 2.0.16__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.15 → memoryos-2.0.16}/PKG-INFO +2 -2
- {memoryos-2.0.15 → memoryos-2.0.16}/README.md +1 -1
- {memoryos-2.0.15 → memoryos-2.0.16}/pyproject.toml +1 -1
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/__init__.py +1 -1
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/search_handler.py +2 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/product_models.py +19 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/multi_modal_struct.py +25 -3
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_skill_memory/process_skill_memory.py +17 -38
- memoryos-2.0.16/src/memos/mem_reader/read_skill_memory/upload_skill_memory.py +312 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/handlers/mem_read_handler.py +4 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/item.py +8 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/retrieve_utils.py +129 -2
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py +107 -12
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/multi_mem_cube/single_cube.py +8 -2
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/plugins/hook_defs.py +8 -0
- memoryos-2.0.15/src/memos/api/README_api.md +0 -13
- memoryos-2.0.15/src/memos/dream/README.md +0 -246
- memoryos-2.0.15/src/memos/dream/README_ZH.md +0 -243
- {memoryos-2.0.15 → memoryos-2.0.16}/LICENSE +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/client.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/config.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/context/dependencies.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/exceptions.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/add_handler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/base_handler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/chat_handler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/component_init.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/config_builders.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/feedback_handler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/formatters_handler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/memory_handler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/scheduler_handler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/handlers/suggestion_handler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/mcp_serve.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/middleware/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/middleware/auth.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/middleware/rate_limit.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/middleware/request_context.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/routers/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/routers/admin_router.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/routers/server_router.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/server_api.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/server_api_ext.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/utils/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/api/utils/api_keys.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/chunkers/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/chunkers/base.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/chunkers/charactertext_chunker.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/chunkers/factory.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/chunkers/markdown_chunker.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/chunkers/sentence_chunker.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/chunkers/simple_chunker.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/cli.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/base.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/chunker.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/embedder.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/graph_db.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/internet_retriever.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/llm.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/mem_agent.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/mem_chat.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/mem_cube.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/mem_os.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/mem_reader.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/mem_scheduler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/mem_user.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/memory.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/parser.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/reranker.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/utils.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/configs/vec_db.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/context/context.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dependency.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/deprecation.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/hook_defs.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/hooks.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/maintenance.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/pipeline/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/pipeline/base.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/pipeline/diary.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/pipeline/motive.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/pipeline/persistence.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/pipeline/reasoning.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/pipeline/recall.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/plugin.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/prompts/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/prompts/motive_prompt.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/prompts/reasoning_prompt.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/routers/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/routers/diary_router.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/routers/trigger_router.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/routes.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/signal_store.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/dream/types.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/embedders/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/embedders/ark.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/embedders/base.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/embedders/factory.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/embedders/ollama.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/embedders/sentence_transformer.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/embedders/universal_api.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/exceptions.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/extras/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/graph_dbs/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/graph_dbs/base.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/graph_dbs/factory.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/graph_dbs/item.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/graph_dbs/neo4j.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/graph_dbs/neo4j_community.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/graph_dbs/polardb.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/graph_dbs/postgres.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/hello_world.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/base.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/deepseek.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/factory.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/hf.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/hf_singleton.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/minimax.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/ollama.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/openai.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/openai_new.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/qwen.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/utils.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/llms/vllm.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/log.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_agent/base.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_agent/deepsearch_agent.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_agent/factory.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_chat/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_chat/base.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_chat/factory.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_chat/simple.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_cube/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_cube/base.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_cube/general.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_cube/navie.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_cube/utils.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_feedback/base.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_feedback/feedback.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_feedback/simple_feedback.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_feedback/utils.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_os/core.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_os/main.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_os/utils/default_config.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_os/utils/format_utils.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_os/utils/reference_utils.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/base.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/factory.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/memory.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/assistant_parser.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/base.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/file_content_parser.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/image_parser.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/multi_modal_parser.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/string_parser.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/system_parser.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/text_content_parser.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/tool_parser.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/user_parser.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_multi_modal/utils.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_pref_memory/process_preference_memory.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/simple_struct.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/strategy_struct.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/utils.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/analyzer/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/analyzer/api_analyzer.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/analyzer/eval_analyzer.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/analyzer/mos_for_test_scheduler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/analyzer/scheduler_for_eval.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/base_mixins/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/base_mixins/memory_ops.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/base_mixins/queue_ops.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/base_mixins/web_log_ops.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/base_scheduler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/general_modules/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/general_modules/api_misc.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/general_modules/base.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/general_modules/init_components_for_scheduler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/general_modules/misc.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/general_modules/scheduler_logger.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/general_modules/task_threads.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/general_scheduler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/memory_manage_modules/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/memory_manage_modules/activation_memory_manager.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/memory_manage_modules/enhancement_pipeline.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/memory_manage_modules/filter_pipeline.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/memory_manage_modules/memory_filter.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/memory_manage_modules/post_processor.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/memory_manage_modules/rerank_pipeline.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/memory_manage_modules/retriever.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/memory_manage_modules/search_pipeline.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/memory_manage_modules/search_service.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/monitors/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/monitors/dispatcher_monitor.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/monitors/general_monitor.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/monitors/task_schedule_monitor.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/optimized_scheduler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/orm_modules/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/orm_modules/api_redis_model.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/orm_modules/base_model.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/orm_modules/monitor_models.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/orm_modules/redis_model.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/scheduler_factory.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/schemas/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/schemas/analyzer_schemas.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/schemas/api_schemas.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/schemas/general_schemas.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/schemas/message_schemas.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/schemas/monitor_schemas.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/schemas/task_schemas.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/base_handler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/context.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/dispatcher.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/handlers/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/handlers/add_handler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/handlers/answer_handler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/handlers/feedback_handler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/handlers/mem_dream_handler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/handlers/mem_reorganize_handler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/handlers/memory_update_handler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/handlers/pref_add_handler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/handlers/query_handler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/local_queue.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/orchestrator.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/registry.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/task_schedule_modules/task_queue.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/utils/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/utils/api_utils.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/utils/config_utils.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/utils/db_utils.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/utils/filter_utils.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/utils/metrics.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/utils/misc_utils.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/utils/monitor_event_utils.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/utils/status_tracker.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/webservice_modules/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_scheduler/webservice_modules/redis_service.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_user/factory.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_user/mysql_persistent_user_manager.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_user/mysql_user_manager.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_user/persistent_factory.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_user/persistent_user_manager.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_user/redis_persistent_user_manager.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_user/user_manager.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/activation/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/activation/base.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/activation/item.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/activation/kv.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/activation/vllmkv.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/base.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/factory.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/parametric/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/parametric/base.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/parametric/item.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/parametric/lora.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/base.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/general.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/naive.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/prefer_text_memory/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/prefer_text_memory/adder.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/prefer_text_memory/config.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/prefer_text_memory/extractor.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/prefer_text_memory/factory.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/prefer_text_memory/retrievers.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/prefer_text_memory/spliter.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/prefer_text_memory/utils.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/preference.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/simple_preference.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/simple_tree.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/organize/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/organize/handler.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/organize/manager.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/organize/relation_reason_detector.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/organize/reorganizer.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/advanced_searcher.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/bm25_util.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/bochasearch.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever_factory.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/reasoner.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/recall.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/reranker.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/retrieval_mid_structs.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/task_goal_parser.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/tavilysearch.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/utils.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memories/textual/tree_text_memory/retrieve/xinyusearch.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memos_tools/dinding_report_bot.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memos_tools/lockfree_dict.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memos_tools/notification_service.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memos_tools/notification_utils.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memos_tools/singleton.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memos_tools/thread_safe_dict.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/memos_tools/thread_safe_dict_segment.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/multi_mem_cube/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/multi_mem_cube/composite_cube.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/multi_mem_cube/views.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/parsers/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/parsers/base.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/parsers/factory.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/parsers/markitdown.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/plugins/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/plugins/base.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/plugins/component_bootstrap.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/plugins/hooks.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/plugins/manager.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/base.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/concat.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/cosine_local.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/factory.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/http_bge.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/http_bge_strategy.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/noop.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/strategies/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/strategies/base.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/strategies/concat_background.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/strategies/concat_docsource.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/strategies/dialogue_common.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/strategies/factory.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/strategies/single_turn.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/reranker/strategies/singleturn_outmem.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/search/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/search/search_service.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/settings.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/advanced_search_prompts.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/cloud_service_prompt.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/instruction_completion.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/mem_agent_prompts.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/mem_feedback_prompts.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/mem_reader_prompts.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/mem_reader_strategy_prompts.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/mem_scheduler_prompts.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/mem_search_prompts.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/mos_prompts.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/prefer_complete_prompt.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/skill_mem_prompt.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/tool_mem_prompts.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/templates/tree_reorganize_prompts.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/general_types.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_assistant_message_param.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_image_param.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_input_audio_param.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_param.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_refusal_param.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_text_param.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_message_custom_tool_call_param.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_message_function_tool_call_param.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_message_param.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_message_tool_call_union_param.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_system_message_param.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_tool_message_param.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/types/openai_chat_completion_types/chat_completion_user_message_param.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/utils.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/vec_dbs/__init__.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/vec_dbs/base.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/vec_dbs/factory.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/vec_dbs/item.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/vec_dbs/milvus.py +0 -0
- {memoryos-2.0.15 → memoryos-2.0.16}/src/memos/vec_dbs/qdrant.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: MemoryOS
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.16
|
|
4
4
|
Summary: Intelligence Begins with Memory
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
License-File: LICENSE
|
|
@@ -131,7 +131,7 @@ Your lobsters and Hermes Agents now have **the best** memory system — choose *
|
|
|
131
131
|
|
|
132
132
|
| 🔌 Plugin | <div align="center"> 💡 Core Features </div> | 🧩 Resources |
|
|
133
133
|
| :----: | :--- | :---: |
|
|
134
|
-
| 🧠 [**memos-local-plugin 2.0**](https://github.com/hijzy/MemOS/tree/main/apps/memos-local-plugin) | <ul><li>One local-first memory core for **Hermes Agent** and **OpenClaw**.</li><li>Self-evolving memory: L1 trace, L2 policy, L3 world model,<br>and crystallized Skills driven by feedback.</li></ul> | 🐙 [GitHub](https://github.com/hijzy/MemOS/tree/main/apps/memos-local-plugin) · 📦 [NPM](https://www.npmjs.com/package/@memtensor/memos-local-plugin) |
|
|
134
|
+
| 🧠 [**memos-local-plugin 2.0**](https://github.com/hijzy/MemOS/tree/main/apps/memos-local-plugin) | <ul><li>One local-first memory core for **Hermes Agent** and **OpenClaw**.</li><li>Self-evolving memory: L1 trace, L2 policy, L3 world model,<br>and crystallized Skills driven by feedback.</li></ul> | 🌐 [Website](https://memos-claw.openmem.net/) · 📖 [Docs](https://memos-docs.openmem.net/cn/openclaw/local_plugin) · 🐙 [GitHub](https://github.com/hijzy/MemOS/tree/main/apps/memos-local-plugin) · 📦 [NPM](https://www.npmjs.com/package/@memtensor/memos-local-plugin) |
|
|
135
135
|
| ☁️ [**OpenClaw Cloud Plugin**](https://x.com/MemOS_dev/status/2019254160919769171?s=20) | <ul><li>[Reduces token usage by 72%.](https://x.com/MemOS_dev/status/2020854044583924111)</li><li>[Multi-agent memory sharing by `user_id`.](https://x.com/MemOS_dev/status/2020538135487062094)</li></ul> | 🖥️ [MemOS Dashboard](https://memos-dashboard.openmem.net/login/) · 📖 [Full Tutorial](https://memos-docs.openmem.net/openclaw/guide#_4-update-plugin) |
|
|
136
136
|
|
|
137
137
|
</div>
|
|
@@ -47,7 +47,7 @@ Your lobsters and Hermes Agents now have **the best** memory system — choose *
|
|
|
47
47
|
|
|
48
48
|
| 🔌 Plugin | <div align="center"> 💡 Core Features </div> | 🧩 Resources |
|
|
49
49
|
| :----: | :--- | :---: |
|
|
50
|
-
| 🧠 [**memos-local-plugin 2.0**](https://github.com/hijzy/MemOS/tree/main/apps/memos-local-plugin) | <ul><li>One local-first memory core for **Hermes Agent** and **OpenClaw**.</li><li>Self-evolving memory: L1 trace, L2 policy, L3 world model,<br>and crystallized Skills driven by feedback.</li></ul> | 🐙 [GitHub](https://github.com/hijzy/MemOS/tree/main/apps/memos-local-plugin) · 📦 [NPM](https://www.npmjs.com/package/@memtensor/memos-local-plugin) |
|
|
50
|
+
| 🧠 [**memos-local-plugin 2.0**](https://github.com/hijzy/MemOS/tree/main/apps/memos-local-plugin) | <ul><li>One local-first memory core for **Hermes Agent** and **OpenClaw**.</li><li>Self-evolving memory: L1 trace, L2 policy, L3 world model,<br>and crystallized Skills driven by feedback.</li></ul> | 🌐 [Website](https://memos-claw.openmem.net/) · 📖 [Docs](https://memos-docs.openmem.net/cn/openclaw/local_plugin) · 🐙 [GitHub](https://github.com/hijzy/MemOS/tree/main/apps/memos-local-plugin) · 📦 [NPM](https://www.npmjs.com/package/@memtensor/memos-local-plugin) |
|
|
51
51
|
| ☁️ [**OpenClaw Cloud Plugin**](https://x.com/MemOS_dev/status/2019254160919769171?s=20) | <ul><li>[Reduces token usage by 72%.](https://x.com/MemOS_dev/status/2020854044583924111)</li><li>[Multi-agent memory sharing by `user_id`.](https://x.com/MemOS_dev/status/2020538135487062094)</li></ul> | 🖥️ [MemOS Dashboard](https://memos-dashboard.openmem.net/login/) · 📖 [Full Tutorial](https://memos-docs.openmem.net/openclaw/guide#_4-update-plugin) |
|
|
52
52
|
|
|
53
53
|
</div>
|
|
@@ -20,6 +20,7 @@ from memos.memories.textual.tree_text_memory.retrieve.retrieve_utils import (
|
|
|
20
20
|
from memos.multi_mem_cube.composite_cube import CompositeCubeView
|
|
21
21
|
from memos.multi_mem_cube.single_cube import SingleCubeView
|
|
22
22
|
from memos.multi_mem_cube.views import MemCubeView
|
|
23
|
+
from memos.plugins.hooks import hookable
|
|
23
24
|
|
|
24
25
|
|
|
25
26
|
logger = get_logger(__name__)
|
|
@@ -44,6 +45,7 @@ class SearchHandler(BaseHandler):
|
|
|
44
45
|
"naive_mem_cube", "mem_scheduler", "searcher", "deepsearch_agent"
|
|
45
46
|
)
|
|
46
47
|
|
|
48
|
+
@hookable("search")
|
|
47
49
|
def handle_search_memories(self, search_req: APISearchRequest) -> SearchResponse:
|
|
48
50
|
"""
|
|
49
51
|
Main handler for search memories endpoint.
|
|
@@ -438,6 +438,14 @@ class APISearchRequest(BaseRequest):
|
|
|
438
438
|
)
|
|
439
439
|
|
|
440
440
|
# ==== Context ====
|
|
441
|
+
reference_time: str | None = Field(
|
|
442
|
+
None,
|
|
443
|
+
description=(
|
|
444
|
+
"Optional reference time for time-sensitive search parsing. "
|
|
445
|
+
"If omitted, search uses the current server time."
|
|
446
|
+
),
|
|
447
|
+
)
|
|
448
|
+
|
|
441
449
|
chat_history: MessageList | None = Field(
|
|
442
450
|
None,
|
|
443
451
|
description=(
|
|
@@ -608,6 +616,17 @@ class APIADDRequest(BaseRequest):
|
|
|
608
616
|
description=("Whether this request represents user feedback. Default: False."),
|
|
609
617
|
)
|
|
610
618
|
|
|
619
|
+
# ==== Upload skill flag ====
|
|
620
|
+
is_upload_skill: bool = Field(
|
|
621
|
+
False,
|
|
622
|
+
description=(
|
|
623
|
+
"Whether this request is an upload skill request. "
|
|
624
|
+
"When True, the messages field should contain file items "
|
|
625
|
+
"with zip file download URLs for pre-built skill packages. "
|
|
626
|
+
"Default: False."
|
|
627
|
+
),
|
|
628
|
+
)
|
|
629
|
+
|
|
611
630
|
# ==== Backward compatibility fields (will delete later) ====
|
|
612
631
|
mem_cube_id: str | None = Field(
|
|
613
632
|
None,
|
|
@@ -17,7 +17,7 @@ from memos.mem_reader.simple_struct import PROMPT_DICT, SimpleStructMemReader
|
|
|
17
17
|
from memos.mem_reader.utils import parse_json_result
|
|
18
18
|
from memos.memories.textual.item import TextualMemoryItem, TreeNodeTextualMemoryMetadata
|
|
19
19
|
from memos.plugins.hook_defs import H
|
|
20
|
-
from memos.plugins.hooks import trigger_single_hook
|
|
20
|
+
from memos.plugins.hooks import trigger_hook, trigger_single_hook
|
|
21
21
|
from memos.templates.mem_reader_prompts import MEMORY_MERGE_PROMPT_EN, MEMORY_MERGE_PROMPT_ZH
|
|
22
22
|
from memos.templates.tool_mem_prompts import TOOL_TRAJECTORY_PROMPT_EN, TOOL_TRAJECTORY_PROMPT_ZH
|
|
23
23
|
from memos.types import MessagesType
|
|
@@ -785,6 +785,14 @@ class MultiModalStructMemReader(SimpleStructMemReader):
|
|
|
785
785
|
)
|
|
786
786
|
rawfile_node.metadata.summary_ids = [mem_node.id for mem_node in fine_items]
|
|
787
787
|
fine_items.append(rawfile_node)
|
|
788
|
+
enriched_items = trigger_hook(
|
|
789
|
+
H.MEMORY_ITEMS_AFTER_FINE_EXTRACT,
|
|
790
|
+
items=fine_items,
|
|
791
|
+
user_context=kwargs.get("user_context"),
|
|
792
|
+
mem_reader=self,
|
|
793
|
+
extract_mode="fine",
|
|
794
|
+
)
|
|
795
|
+
fine_items = enriched_items if enriched_items is not None else fine_items
|
|
788
796
|
return fine_items
|
|
789
797
|
|
|
790
798
|
fine_memory_items: list[TextualMemoryItem] = []
|
|
@@ -993,6 +1001,7 @@ class MultiModalStructMemReader(SimpleStructMemReader):
|
|
|
993
1001
|
return fast_memory_items
|
|
994
1002
|
|
|
995
1003
|
# Stage: llm_extract — fine mode 4-way parallel LLM + per-source serial
|
|
1004
|
+
is_upload_skill = kwargs.pop("is_upload_skill", False)
|
|
996
1005
|
non_file_url_fast_items = [
|
|
997
1006
|
item for item in fast_memory_items if not self._is_file_url_only_item(item)
|
|
998
1007
|
]
|
|
@@ -1009,7 +1018,9 @@ class MultiModalStructMemReader(SimpleStructMemReader):
|
|
|
1009
1018
|
)
|
|
1010
1019
|
future_skill = executor.submit(
|
|
1011
1020
|
process_skill_memory_fine,
|
|
1012
|
-
fast_memory_items=
|
|
1021
|
+
fast_memory_items=fast_memory_items
|
|
1022
|
+
if is_upload_skill
|
|
1023
|
+
else non_file_url_fast_items,
|
|
1013
1024
|
info=info,
|
|
1014
1025
|
searcher=self.searcher,
|
|
1015
1026
|
graph_db=self.graph_db,
|
|
@@ -1017,6 +1028,7 @@ class MultiModalStructMemReader(SimpleStructMemReader):
|
|
|
1017
1028
|
embedder=self.embedder,
|
|
1018
1029
|
oss_config=self.oss_config,
|
|
1019
1030
|
skills_dir_config=self.skills_dir_config,
|
|
1031
|
+
is_upload_skill=is_upload_skill,
|
|
1020
1032
|
**kwargs,
|
|
1021
1033
|
)
|
|
1022
1034
|
future_pref = executor.submit(
|
|
@@ -1039,6 +1051,10 @@ class MultiModalStructMemReader(SimpleStructMemReader):
|
|
|
1039
1051
|
fine_memory_items.extend(fine_memory_items_pref_parser)
|
|
1040
1052
|
|
|
1041
1053
|
# Part B: per-source serial processing
|
|
1054
|
+
if is_upload_skill:
|
|
1055
|
+
# (skip for upload skill to avoid zip being parsed)
|
|
1056
|
+
return fine_memory_items
|
|
1057
|
+
|
|
1042
1058
|
with timed_stage("add", "per_source") as ts_ps:
|
|
1043
1059
|
for fast_item in fast_memory_items:
|
|
1044
1060
|
sources = fast_item.metadata.sources
|
|
@@ -1072,6 +1088,8 @@ class MultiModalStructMemReader(SimpleStructMemReader):
|
|
|
1072
1088
|
logger.warning("[MultiModalStruct] No raw nodes found.")
|
|
1073
1089
|
return []
|
|
1074
1090
|
|
|
1091
|
+
is_upload_skill = kwargs.pop("is_upload_skill", False)
|
|
1092
|
+
|
|
1075
1093
|
# Extract info from raw_nodes (same as simple_struct.py)
|
|
1076
1094
|
info = {
|
|
1077
1095
|
"user_id": raw_nodes[0].metadata.user_id,
|
|
@@ -1093,7 +1111,7 @@ class MultiModalStructMemReader(SimpleStructMemReader):
|
|
|
1093
1111
|
)
|
|
1094
1112
|
future_skill = executor.submit(
|
|
1095
1113
|
process_skill_memory_fine,
|
|
1096
|
-
non_file_url_nodes,
|
|
1114
|
+
raw_nodes if is_upload_skill else non_file_url_nodes,
|
|
1097
1115
|
info,
|
|
1098
1116
|
searcher=self.searcher,
|
|
1099
1117
|
llm=self.general_llm,
|
|
@@ -1101,6 +1119,7 @@ class MultiModalStructMemReader(SimpleStructMemReader):
|
|
|
1101
1119
|
graph_db=self.graph_db,
|
|
1102
1120
|
oss_config=self.oss_config,
|
|
1103
1121
|
skills_dir_config=self.skills_dir_config,
|
|
1122
|
+
is_upload_skill=is_upload_skill,
|
|
1104
1123
|
**kwargs,
|
|
1105
1124
|
)
|
|
1106
1125
|
# Add preference memory extraction
|
|
@@ -1125,6 +1144,9 @@ class MultiModalStructMemReader(SimpleStructMemReader):
|
|
|
1125
1144
|
fine_memory_items.extend(fine_memory_items_pref_parser)
|
|
1126
1145
|
|
|
1127
1146
|
# Part B: get fine multimodal items
|
|
1147
|
+
if is_upload_skill:
|
|
1148
|
+
# (skip for upload skill to avoid zip being parsed)
|
|
1149
|
+
return fine_memory_items
|
|
1128
1150
|
for raw_node in raw_nodes:
|
|
1129
1151
|
sources = raw_node.metadata.sources
|
|
1130
1152
|
for source in sources:
|
{memoryos-2.0.15 → memoryos-2.0.16}/src/memos/mem_reader/read_skill_memory/process_skill_memory.py
RENAMED
|
@@ -252,36 +252,6 @@ def _batch_generate_skill_details(
|
|
|
252
252
|
return [item[0] for item in raw_skills_data]
|
|
253
253
|
|
|
254
254
|
|
|
255
|
-
def add_id_to_mysql(memory_id: str, mem_cube_id: str):
|
|
256
|
-
"""Add id to mysql, will deprecate this function in the future"""
|
|
257
|
-
# TODO: tmp function, deprecate soon
|
|
258
|
-
import requests
|
|
259
|
-
|
|
260
|
-
skill_mysql_url = os.getenv("SKILLS_MYSQL_URL", "")
|
|
261
|
-
skill_mysql_bearer = os.getenv("SKILLS_MYSQL_BEARER", "")
|
|
262
|
-
|
|
263
|
-
if not skill_mysql_url or not skill_mysql_bearer:
|
|
264
|
-
logger.warning("[PROCESS_SKILLS] SKILLS_MYSQL_URL or SKILLS_MYSQL_BEARER is not set")
|
|
265
|
-
return None
|
|
266
|
-
headers = {"Authorization": skill_mysql_bearer, "Content-Type": "application/json"}
|
|
267
|
-
data = {"memCubeId": mem_cube_id, "skillId": memory_id}
|
|
268
|
-
try:
|
|
269
|
-
response = requests.post(skill_mysql_url, headers=headers, json=data)
|
|
270
|
-
|
|
271
|
-
logger.info(f"[PROCESS_SKILLS] response: \n\n{response.json()}")
|
|
272
|
-
logger.info(f"[PROCESS_SKILLS] memory_id: \n\n{memory_id}")
|
|
273
|
-
logger.info(f"[PROCESS_SKILLS] mem_cube_id: \n\n{mem_cube_id}")
|
|
274
|
-
logger.info(f"[PROCESS_SKILLS] skill_mysql_url: \n\n{skill_mysql_url}")
|
|
275
|
-
logger.info(f"[PROCESS_SKILLS] skill_mysql_bearer: \n\n{skill_mysql_bearer}")
|
|
276
|
-
logger.info(f"[PROCESS_SKILLS] headers: \n\n{headers}")
|
|
277
|
-
logger.info(f"[PROCESS_SKILLS] data: \n\n{data}")
|
|
278
|
-
|
|
279
|
-
return response.json()
|
|
280
|
-
except Exception as e:
|
|
281
|
-
logger.warning(f"[PROCESS_SKILLS] Error adding id to mysql: {e}")
|
|
282
|
-
return None
|
|
283
|
-
|
|
284
|
-
|
|
285
255
|
@require_python_package(
|
|
286
256
|
import_name="alibabacloud_oss_v2",
|
|
287
257
|
install_command="pip install alibabacloud-oss-v2",
|
|
@@ -948,6 +918,7 @@ def create_skill_memory_item(
|
|
|
948
918
|
scripts=skill_memory.get("scripts"),
|
|
949
919
|
others=skill_memory.get("others"),
|
|
950
920
|
url=skill_memory.get("url", ""),
|
|
921
|
+
skill_source=skill_memory.get("skill_source"),
|
|
951
922
|
manager_user_id=manager_user_id,
|
|
952
923
|
project_id=project_id,
|
|
953
924
|
)
|
|
@@ -1024,6 +995,21 @@ def process_skill_memory_fine(
|
|
|
1024
995
|
complete_skill_memory: bool = True,
|
|
1025
996
|
**kwargs,
|
|
1026
997
|
) -> list[TextualMemoryItem]:
|
|
998
|
+
is_upload_skill = kwargs.pop("is_upload_skill", False)
|
|
999
|
+
if is_upload_skill:
|
|
1000
|
+
from memos.mem_reader.read_skill_memory.upload_skill_memory import (
|
|
1001
|
+
process_upload_skill_memory,
|
|
1002
|
+
)
|
|
1003
|
+
|
|
1004
|
+
return process_upload_skill_memory(
|
|
1005
|
+
fast_memory_items=fast_memory_items,
|
|
1006
|
+
info=info,
|
|
1007
|
+
embedder=embedder,
|
|
1008
|
+
oss_config=oss_config,
|
|
1009
|
+
skills_dir_config=skills_dir_config,
|
|
1010
|
+
**kwargs,
|
|
1011
|
+
)
|
|
1012
|
+
|
|
1027
1013
|
skills_repo_backend = _get_skill_file_storage_location()
|
|
1028
1014
|
oss_client, _missing_keys, flag = _skill_init(
|
|
1029
1015
|
skills_repo_backend, oss_config, skills_dir_config
|
|
@@ -1252,6 +1238,7 @@ def process_skill_memory_fine(
|
|
|
1252
1238
|
if source:
|
|
1253
1239
|
skill_sources.append(source)
|
|
1254
1240
|
|
|
1241
|
+
skill_memory["skill_source"] = "auto_create"
|
|
1255
1242
|
memory_item = create_skill_memory_item(
|
|
1256
1243
|
skill_memory, info, embedder, sources=skill_sources, **kwargs
|
|
1257
1244
|
)
|
|
@@ -1260,12 +1247,4 @@ def process_skill_memory_fine(
|
|
|
1260
1247
|
logger.warning(f"[PROCESS_SKILLS] Error creating skill memory item: {e}")
|
|
1261
1248
|
continue
|
|
1262
1249
|
|
|
1263
|
-
# TODO: deprecate this funtion and call
|
|
1264
|
-
for skill_memory, skill_memory_item in zip(skill_memories, skill_memory_items, strict=False):
|
|
1265
|
-
if skill_memory.get("update", False) and skill_memory.get("old_memory_id", ""):
|
|
1266
|
-
continue
|
|
1267
|
-
add_id_to_mysql(
|
|
1268
|
-
memory_id=skill_memory_item.id,
|
|
1269
|
-
mem_cube_id=kwargs.get("user_name", info.get("user_id", "")),
|
|
1270
|
-
)
|
|
1271
1250
|
return skill_memory_items
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import re
|
|
2
|
+
import shutil
|
|
3
|
+
import tempfile
|
|
4
|
+
import zipfile
|
|
5
|
+
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import Any
|
|
8
|
+
from urllib.parse import urlparse
|
|
9
|
+
from uuid import uuid4
|
|
10
|
+
|
|
11
|
+
import requests
|
|
12
|
+
|
|
13
|
+
from memos.embedders.base import BaseEmbedder
|
|
14
|
+
from memos.log import get_logger
|
|
15
|
+
from memos.mem_reader.read_skill_memory.process_skill_memory import (
|
|
16
|
+
create_skill_memory_item,
|
|
17
|
+
)
|
|
18
|
+
from memos.memories.textual.item import TextualMemoryItem
|
|
19
|
+
from memos.utils import timed
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
logger = get_logger(__name__)
|
|
23
|
+
|
|
24
|
+
_TEXT_MAX_LEN = 20
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _truncate(text: str) -> str:
|
|
28
|
+
"""Truncate a string to at most ``_TEXT_MAX_LEN`` characters."""
|
|
29
|
+
return text[:_TEXT_MAX_LEN]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _extract_zip_url_from_items(items: list[TextualMemoryItem]) -> str | None:
|
|
33
|
+
"""
|
|
34
|
+
Extract the zip download URL from fast-stage memory items.
|
|
35
|
+
|
|
36
|
+
FileContentParser.parse_fast stores the URL in source.file_info["file_data"].
|
|
37
|
+
Each upload-skill request contains exactly one zip URL.
|
|
38
|
+
"""
|
|
39
|
+
for item in items:
|
|
40
|
+
for source in getattr(item.metadata, "sources", None) or []:
|
|
41
|
+
file_info = getattr(source, "file_info", None)
|
|
42
|
+
if not isinstance(file_info, dict):
|
|
43
|
+
continue
|
|
44
|
+
file_data = file_info.get("file_data", "")
|
|
45
|
+
if isinstance(file_data, str) and file_data.startswith(("http://", "https://")):
|
|
46
|
+
url_path = urlparse(file_data).path
|
|
47
|
+
if url_path.lower().endswith(".zip"):
|
|
48
|
+
return file_data
|
|
49
|
+
return None
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _extract_file_ids_from_items(items: list[TextualMemoryItem]) -> list[str]:
|
|
53
|
+
"""Extract uploaded file ids from fast-stage memory metadata and sources."""
|
|
54
|
+
file_ids: list[str] = []
|
|
55
|
+
|
|
56
|
+
def _append_file_id(file_id: Any) -> None:
|
|
57
|
+
if isinstance(file_id, str) and file_id and file_id not in file_ids:
|
|
58
|
+
file_ids.append(file_id)
|
|
59
|
+
|
|
60
|
+
for item in items:
|
|
61
|
+
metadata = getattr(item, "metadata", None)
|
|
62
|
+
metadata_file_ids = getattr(metadata, "file_ids", None) if metadata else None
|
|
63
|
+
if isinstance(metadata_file_ids, list):
|
|
64
|
+
for file_id in metadata_file_ids:
|
|
65
|
+
_append_file_id(file_id)
|
|
66
|
+
|
|
67
|
+
for source in getattr(metadata, "sources", None) or []:
|
|
68
|
+
file_info = getattr(source, "file_info", None)
|
|
69
|
+
if isinstance(file_info, dict):
|
|
70
|
+
_append_file_id(file_info.get("file_id"))
|
|
71
|
+
|
|
72
|
+
return file_ids
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _download_zip(url: str, tmp_dir: Path) -> Path:
|
|
76
|
+
"""Download a zip file to a local temporary directory."""
|
|
77
|
+
try:
|
|
78
|
+
resp = requests.get(url, stream=True, timeout=60)
|
|
79
|
+
resp.raise_for_status()
|
|
80
|
+
except Exception as e:
|
|
81
|
+
raise ValueError(f"Failed to download zip from {url}: {e}") from e
|
|
82
|
+
|
|
83
|
+
zip_path = tmp_dir / f"{uuid4()}.zip"
|
|
84
|
+
with open(zip_path, "wb") as f:
|
|
85
|
+
for chunk in resp.iter_content(chunk_size=8192):
|
|
86
|
+
f.write(chunk)
|
|
87
|
+
|
|
88
|
+
if not zipfile.is_zipfile(zip_path):
|
|
89
|
+
raise ValueError(f"Downloaded file is not a valid zip: {url}")
|
|
90
|
+
|
|
91
|
+
return zip_path
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def _extract_and_parse_skill_zip(zip_path: Path) -> dict[str, Any]:
|
|
95
|
+
"""
|
|
96
|
+
Extract a skill zip and parse SKILL.md + directory contents into a skill_memory dict.
|
|
97
|
+
|
|
98
|
+
The SKILL.md format mirrors the output of ``_write_skills_to_file`` in
|
|
99
|
+
``process_skill_memory.py``. Section headings at any level (``#`` through
|
|
100
|
+
``######``) are matched by title text (case-insensitive).
|
|
101
|
+
"""
|
|
102
|
+
# Step 1: extract & locate SKILL.md
|
|
103
|
+
extract_dir = zip_path.parent / zip_path.stem
|
|
104
|
+
with zipfile.ZipFile(zip_path, "r") as zf:
|
|
105
|
+
zf.extractall(extract_dir)
|
|
106
|
+
|
|
107
|
+
skill_md_path = None
|
|
108
|
+
for candidate in extract_dir.rglob("SKILL.md"):
|
|
109
|
+
skill_md_path = candidate
|
|
110
|
+
break
|
|
111
|
+
|
|
112
|
+
if skill_md_path is None:
|
|
113
|
+
raise FileNotFoundError(f"SKILL.md not found in zip: {zip_path.name}")
|
|
114
|
+
|
|
115
|
+
skill_root = skill_md_path.parent
|
|
116
|
+
raw_text = skill_md_path.read_text(encoding="utf-8")
|
|
117
|
+
|
|
118
|
+
# Step 2: parse frontmatter → name, description
|
|
119
|
+
name = ""
|
|
120
|
+
description = ""
|
|
121
|
+
fm_match = re.match(r"^---\s*\n(.*?)\n---", raw_text, re.DOTALL)
|
|
122
|
+
if fm_match:
|
|
123
|
+
for line in fm_match.group(1).splitlines():
|
|
124
|
+
if line.startswith("name:"):
|
|
125
|
+
name = line[len("name:") :].strip()
|
|
126
|
+
elif line.startswith("description:"):
|
|
127
|
+
description = line[len("description:") :].strip()
|
|
128
|
+
|
|
129
|
+
if not name:
|
|
130
|
+
name = zip_path.stem
|
|
131
|
+
|
|
132
|
+
# Step 3: split body by any-level heading and parse each section
|
|
133
|
+
trigger: str = ""
|
|
134
|
+
procedure: str = ""
|
|
135
|
+
experience: list[str] = []
|
|
136
|
+
preference: list[str] = []
|
|
137
|
+
examples: list[str] = []
|
|
138
|
+
tool: str | None = None
|
|
139
|
+
others_inline: dict[str, str] = {}
|
|
140
|
+
|
|
141
|
+
known_sections = {
|
|
142
|
+
"trigger",
|
|
143
|
+
"procedure",
|
|
144
|
+
"experience",
|
|
145
|
+
"user preferences",
|
|
146
|
+
"examples",
|
|
147
|
+
"scripts",
|
|
148
|
+
"tool usage",
|
|
149
|
+
"additional information",
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
body = raw_text[fm_match.end() :] if fm_match else raw_text
|
|
153
|
+
sections = re.split(r"\n(?=#{1,6}\s)", body)
|
|
154
|
+
|
|
155
|
+
for section in sections:
|
|
156
|
+
section = section.strip()
|
|
157
|
+
if not section:
|
|
158
|
+
continue
|
|
159
|
+
|
|
160
|
+
heading_match = re.match(r"^(#{1,6})\s+(.*)", section)
|
|
161
|
+
if not heading_match:
|
|
162
|
+
continue
|
|
163
|
+
|
|
164
|
+
title = heading_match.group(2).strip()
|
|
165
|
+
content = section[heading_match.end() :].strip()
|
|
166
|
+
title_lower = title.lower()
|
|
167
|
+
|
|
168
|
+
if title_lower not in known_sections:
|
|
169
|
+
logger.warning("[UPLOAD_SKILL] Unknown section '%s' in SKILL.md, skipping", title)
|
|
170
|
+
continue
|
|
171
|
+
|
|
172
|
+
if title_lower == "trigger":
|
|
173
|
+
trigger = content
|
|
174
|
+
|
|
175
|
+
elif title_lower == "procedure":
|
|
176
|
+
procedure = content
|
|
177
|
+
|
|
178
|
+
elif title_lower == "experience":
|
|
179
|
+
items = re.findall(r"^\d+\.\s+(.+)$", content, re.MULTILINE)
|
|
180
|
+
experience = [item.strip() for item in items] if items else []
|
|
181
|
+
|
|
182
|
+
elif title_lower == "user preferences":
|
|
183
|
+
items = re.findall(r"^-\s+(.+)$", content, re.MULTILINE)
|
|
184
|
+
preference = [item.strip() for item in items] if items else []
|
|
185
|
+
|
|
186
|
+
elif title_lower == "examples":
|
|
187
|
+
blocks = re.findall(r"```markdown\n(.*?)\n```", content, re.DOTALL)
|
|
188
|
+
examples = [b.strip() for b in blocks]
|
|
189
|
+
|
|
190
|
+
elif title_lower == "scripts":
|
|
191
|
+
pass
|
|
192
|
+
|
|
193
|
+
elif title_lower == "tool usage":
|
|
194
|
+
tool = content.strip() if content.strip() else None
|
|
195
|
+
|
|
196
|
+
elif title_lower == "additional information":
|
|
197
|
+
sub_sections = re.split(r"\n(?=#{1,6}\s)", content)
|
|
198
|
+
for sub in sub_sections:
|
|
199
|
+
sub = sub.strip()
|
|
200
|
+
if not sub or sub.startswith("See also:"):
|
|
201
|
+
continue
|
|
202
|
+
sub_heading = re.match(r"^(#{1,6})\s+(.*)", sub)
|
|
203
|
+
if not sub_heading:
|
|
204
|
+
continue
|
|
205
|
+
sub_key = sub_heading.group(2).strip()
|
|
206
|
+
sub_val = sub[sub_heading.end() :].strip()
|
|
207
|
+
if sub_val:
|
|
208
|
+
others_inline[sub_key] = sub_val
|
|
209
|
+
|
|
210
|
+
# Step 4: read scripts/ directory
|
|
211
|
+
scripts: dict[str, str] | None = None
|
|
212
|
+
scripts_dir = skill_root / "scripts"
|
|
213
|
+
if scripts_dir.is_dir():
|
|
214
|
+
scripts = {}
|
|
215
|
+
for py_file in scripts_dir.glob("*.py"):
|
|
216
|
+
scripts[py_file.name] = py_file.read_text(encoding="utf-8")
|
|
217
|
+
|
|
218
|
+
# Step 5: read reference/ directory → merge into others
|
|
219
|
+
others = dict(others_inline)
|
|
220
|
+
reference_dir = skill_root / "reference"
|
|
221
|
+
if reference_dir.is_dir():
|
|
222
|
+
for md_file in reference_dir.glob("*.md"):
|
|
223
|
+
others[md_file.name] = md_file.read_text(encoding="utf-8")
|
|
224
|
+
|
|
225
|
+
# Step 6: truncate text fields & assemble return dict
|
|
226
|
+
truncated_trigger = _truncate(trigger)
|
|
227
|
+
|
|
228
|
+
result: dict[str, Any] = {
|
|
229
|
+
"name": name,
|
|
230
|
+
"description": description,
|
|
231
|
+
"tags": [truncated_trigger] if truncated_trigger else [],
|
|
232
|
+
"procedure": _truncate(procedure),
|
|
233
|
+
"experience": [_truncate(e) for e in experience],
|
|
234
|
+
"preference": [_truncate(p) for p in preference],
|
|
235
|
+
"examples": [_truncate(e) for e in examples],
|
|
236
|
+
"tool": _truncate(tool) if tool else None,
|
|
237
|
+
"scripts": {k: _truncate(v) for k, v in scripts.items()} if scripts else None,
|
|
238
|
+
"others": {k: _truncate(v) for k, v in others.items()} if others else None,
|
|
239
|
+
}
|
|
240
|
+
# Only include trigger when non-empty; create_skill_memory_item uses
|
|
241
|
+
# `skill_memory.get("tags") or skill_memory.get("trigger", [])`,
|
|
242
|
+
# an empty-string trigger would override the correct [] fallback.
|
|
243
|
+
if truncated_trigger:
|
|
244
|
+
result["trigger"] = truncated_trigger
|
|
245
|
+
return result
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
@timed
|
|
249
|
+
def process_upload_skill_memory(
|
|
250
|
+
fast_memory_items: list[TextualMemoryItem],
|
|
251
|
+
info: dict[str, Any],
|
|
252
|
+
embedder: BaseEmbedder | None = None,
|
|
253
|
+
oss_config: dict[str, Any] | None = None,
|
|
254
|
+
skills_dir_config: dict[str, Any] | None = None,
|
|
255
|
+
**kwargs,
|
|
256
|
+
) -> list[TextualMemoryItem]:
|
|
257
|
+
"""
|
|
258
|
+
Process a user-uploaded skill zip, parse it, and build a SkillMemory node.
|
|
259
|
+
|
|
260
|
+
The zip URL is taken from the fast-stage ``TextualMemoryItem`` sources
|
|
261
|
+
(``source.file_info["file_data"]``), consistent with both sync-fine and
|
|
262
|
+
async-transfer paths.
|
|
263
|
+
"""
|
|
264
|
+
zip_url = _extract_zip_url_from_items(fast_memory_items)
|
|
265
|
+
if not zip_url:
|
|
266
|
+
logger.warning("[UPLOAD_SKILL] No zip URL found in fast_memory_items")
|
|
267
|
+
return []
|
|
268
|
+
file_ids = _extract_file_ids_from_items(fast_memory_items)
|
|
269
|
+
|
|
270
|
+
tmp_dir = Path(tempfile.mkdtemp(prefix="upload_skill_"))
|
|
271
|
+
try:
|
|
272
|
+
zip_path = _download_zip(zip_url, tmp_dir)
|
|
273
|
+
except Exception as e:
|
|
274
|
+
logger.warning("[UPLOAD_SKILL] Failed to download zip: %s", e)
|
|
275
|
+
shutil.rmtree(tmp_dir, ignore_errors=True)
|
|
276
|
+
return []
|
|
277
|
+
|
|
278
|
+
try:
|
|
279
|
+
skill_memory = _extract_and_parse_skill_zip(zip_path)
|
|
280
|
+
except FileNotFoundError as e:
|
|
281
|
+
logger.warning("[UPLOAD_SKILL] %s", e)
|
|
282
|
+
shutil.rmtree(tmp_dir, ignore_errors=True)
|
|
283
|
+
return []
|
|
284
|
+
except Exception as e:
|
|
285
|
+
logger.error("[UPLOAD_SKILL] Failed to parse skill zip: %s", e)
|
|
286
|
+
shutil.rmtree(tmp_dir, ignore_errors=True)
|
|
287
|
+
return []
|
|
288
|
+
|
|
289
|
+
skill_memory["url"] = zip_url
|
|
290
|
+
skill_memory["skill_source"] = "user_upload"
|
|
291
|
+
|
|
292
|
+
try:
|
|
293
|
+
skill_memory_item = create_skill_memory_item(skill_memory, info, embedder, **kwargs)
|
|
294
|
+
if file_ids:
|
|
295
|
+
skill_memory_item.metadata.file_ids = file_ids
|
|
296
|
+
metadata_info = dict(skill_memory_item.metadata.info or {})
|
|
297
|
+
metadata_info.setdefault("file_id", file_ids[0])
|
|
298
|
+
skill_memory_item.metadata.info = metadata_info
|
|
299
|
+
except Exception as e:
|
|
300
|
+
logger.error("[UPLOAD_SKILL] Failed to create skill memory item: %s", e)
|
|
301
|
+
shutil.rmtree(tmp_dir, ignore_errors=True)
|
|
302
|
+
return []
|
|
303
|
+
|
|
304
|
+
# Cleanup temp files
|
|
305
|
+
shutil.rmtree(tmp_dir, ignore_errors=True)
|
|
306
|
+
|
|
307
|
+
logger.info(
|
|
308
|
+
"[UPLOAD_SKILL] Successfully created SkillMemory from uploaded zip: name=%s, id=%s",
|
|
309
|
+
skill_memory.get("name"),
|
|
310
|
+
skill_memory_item.id,
|
|
311
|
+
)
|
|
312
|
+
return [skill_memory_item]
|
|
@@ -165,6 +165,9 @@ class MemReadMessageHandler(BaseSchedulerHandler):
|
|
|
165
165
|
|
|
166
166
|
logger.info("Processing %s memories with mem_reader", len(memory_items))
|
|
167
167
|
|
|
168
|
+
info = dict(info or {})
|
|
169
|
+
is_upload_skill = info.pop("is_upload_skill", False)
|
|
170
|
+
|
|
168
171
|
try:
|
|
169
172
|
processed_memories = mem_reader.fine_transfer_simple_mem(
|
|
170
173
|
memory_items,
|
|
@@ -173,6 +176,7 @@ class MemReadMessageHandler(BaseSchedulerHandler):
|
|
|
173
176
|
user_name=user_name,
|
|
174
177
|
chat_history=chat_history,
|
|
175
178
|
user_context=user_context,
|
|
179
|
+
is_upload_skill=is_upload_skill,
|
|
176
180
|
)
|
|
177
181
|
except Exception as e:
|
|
178
182
|
logger.warning("%s: Fail to transfer mem: %s", e, memory_items)
|
|
@@ -81,6 +81,14 @@ class ArchivedTextualMemory(BaseModel):
|
|
|
81
81
|
default_factory=lambda: datetime.now().isoformat(),
|
|
82
82
|
description="The time the memory was created.",
|
|
83
83
|
)
|
|
84
|
+
timespec: dict[str, Any] | None = Field(
|
|
85
|
+
default=None,
|
|
86
|
+
description="Compact temporal index snapshot for this archived version, used by retrieval-side version selection.",
|
|
87
|
+
)
|
|
88
|
+
memory_form: Literal["state", "event"] | None = Field(
|
|
89
|
+
default=None,
|
|
90
|
+
description="Internal memory form snapshot for this archived version, used by retrieval-side routing.",
|
|
91
|
+
)
|
|
84
92
|
|
|
85
93
|
|
|
86
94
|
class TextualMemoryMetadata(BaseModel):
|