MemoryOS 2.0.27__tar.gz → 2.0.30__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.27 → memoryos-2.0.30}/PKG-INFO +2 -2
- {memoryos-2.0.27 → memoryos-2.0.30}/pyproject.toml +2 -2
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/__init__.py +1 -1
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/config.py +1 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/chunkers/base.py +25 -9
- memoryos-2.0.30/src/memos/chunkers/simple_chunker.py +113 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/configs/llm.py +11 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/embedders/cache.py +16 -4
- memoryos-2.0.30/src/memos/embedders/universal_api.py +148 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/llms/openai.py +53 -37
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/llms/vllm.py +10 -6
- memoryos-2.0.27/src/memos/chunkers/simple_chunker.py +0 -53
- memoryos-2.0.27/src/memos/embedders/universal_api.py +0 -112
- {memoryos-2.0.27 → memoryos-2.0.30}/LICENSE +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/README.md +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/client.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/context/dependencies.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/exceptions.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/handlers/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/handlers/add_handler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/handlers/base_handler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/handlers/chat_handler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/handlers/component_init.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/handlers/config_builders.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/handlers/cube_handler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/handlers/feedback_handler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/handlers/formatters_handler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/handlers/memory_handler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/handlers/scheduler_handler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/handlers/search_handler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/handlers/suggestion_handler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/lifecycle.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/mcp_serve.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/middleware/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/middleware/auth.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/middleware/rate_limit.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/middleware/request_context.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/product_models.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/routers/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/routers/admin_router.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/routers/server_router.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/server_api.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/server_api_ext.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/utils/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/api/utils/api_keys.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/chunkers/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/chunkers/charactertext_chunker.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/chunkers/factory.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/chunkers/markdown_chunker.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/chunkers/sentence_chunker.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/cli.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/configs/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/configs/base.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/configs/chunker.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/configs/embedder.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/configs/graph_db.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/configs/internet_retriever.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/configs/mem_agent.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/configs/mem_chat.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/configs/mem_cube.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/configs/mem_os.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/configs/mem_reader.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/configs/mem_scheduler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/configs/mem_user.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/configs/memory.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/configs/parser.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/configs/reranker.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/configs/utils.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/configs/vec_db.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/context/context.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dependency.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/deprecation.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/README.md +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/contextualization.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/enrichment.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/hook_defs.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/hooks.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/maintenance.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/pipeline/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/pipeline/base.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/pipeline/diary.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/pipeline/motive.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/pipeline/persistence.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/pipeline/reasoning.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/pipeline/recall.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/plugin.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/prompts/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/prompts/context_binding_prompt.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/prompts/context_summary_prompt.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/prompts/motive_prompt.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/prompts/reasoning_prompt.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/routers/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/routers/diary_router.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/routers/trigger_router.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/routes.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/search.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/signal_store.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/dream/types.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/embedders/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/embedders/ark.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/embedders/base.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/embedders/factory.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/embedders/ollama.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/embedders/sentence_transformer.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/exceptions.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/extras/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/graph_dbs/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/graph_dbs/base.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/graph_dbs/factory.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/graph_dbs/item.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/graph_dbs/neo4j.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/graph_dbs/neo4j_community.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/graph_dbs/polardb.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/graph_dbs/postgres.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/hello_world.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/llms/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/llms/base.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/llms/deepseek.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/llms/factory.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/llms/hf.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/llms/hf_singleton.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/llms/minimax.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/llms/ollama.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/llms/openai_new.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/llms/qwen.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/llms/utils.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/log.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_agent/base.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_agent/deepsearch_agent.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_agent/factory.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_chat/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_chat/base.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_chat/factory.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_chat/simple.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_cube/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_cube/base.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_cube/general.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_cube/navie.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_cube/utils.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_feedback/base.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_feedback/feedback.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_feedback/simple_feedback.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_feedback/utils.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_os/core.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_os/main.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_os/utils/default_config.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_os/utils/format_utils.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_os/utils/reference_utils.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_reader/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_reader/base.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_reader/factory.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_reader/memory.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_reader/multi_modal_struct.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_reader/read_multi_modal/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_reader/read_multi_modal/assistant_parser.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_reader/read_multi_modal/base.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_reader/read_multi_modal/file_content_parser.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_reader/read_multi_modal/image_parser.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_reader/read_multi_modal/multi_modal_parser.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_reader/read_multi_modal/string_parser.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_reader/read_multi_modal/system_parser.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_reader/read_multi_modal/text_content_parser.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_reader/read_multi_modal/tool_parser.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_reader/read_multi_modal/user_parser.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_reader/read_multi_modal/utils.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_reader/read_pref_memory/process_preference_memory.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_reader/read_skill_memory/process_skill_memory.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_reader/read_skill_memory/upload_skill_memory.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_reader/simple_struct.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_reader/strategy_struct.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_reader/utils.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/analyzer/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/analyzer/api_analyzer.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/analyzer/eval_analyzer.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/analyzer/mos_for_test_scheduler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/analyzer/scheduler_for_eval.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/base_mixins/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/base_mixins/memory_ops.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/base_mixins/queue_ops.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/base_mixins/web_log_ops.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/base_scheduler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/general_modules/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/general_modules/api_misc.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/general_modules/base.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/general_modules/init_components_for_scheduler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/general_modules/misc.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/general_modules/scheduler_logger.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/general_modules/task_threads.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/general_scheduler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/memory_manage_modules/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/memory_manage_modules/activation_memory_manager.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/memory_manage_modules/enhancement_pipeline.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/memory_manage_modules/filter_pipeline.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/memory_manage_modules/memory_filter.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/memory_manage_modules/post_processor.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/memory_manage_modules/rerank_pipeline.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/memory_manage_modules/retriever.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/memory_manage_modules/search_pipeline.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/memory_manage_modules/search_service.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/monitors/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/monitors/dispatcher_monitor.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/monitors/general_monitor.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/monitors/task_schedule_monitor.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/optimized_scheduler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/orm_modules/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/orm_modules/api_redis_model.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/orm_modules/base_model.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/orm_modules/monitor_models.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/orm_modules/redis_model.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/scheduler_factory.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/schemas/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/schemas/analyzer_schemas.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/schemas/api_schemas.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/schemas/general_schemas.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/schemas/message_schemas.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/schemas/monitor_schemas.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/schemas/task_schemas.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/task_schedule_modules/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/task_schedule_modules/base_handler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/task_schedule_modules/context.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/task_schedule_modules/dispatcher.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/task_schedule_modules/handlers/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/task_schedule_modules/handlers/add_handler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/task_schedule_modules/handlers/answer_handler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/task_schedule_modules/handlers/feedback_handler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/task_schedule_modules/handlers/mem_dream_handler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/task_schedule_modules/handlers/mem_read_handler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/task_schedule_modules/handlers/mem_reorganize_handler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/task_schedule_modules/handlers/memory_update_handler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/task_schedule_modules/handlers/pref_add_handler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/task_schedule_modules/handlers/query_handler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/task_schedule_modules/local_queue.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/task_schedule_modules/orchestrator.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/task_schedule_modules/registry.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/task_schedule_modules/task_queue.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/utils/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/utils/api_utils.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/utils/config_utils.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/utils/db_utils.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/utils/filter_utils.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/utils/metrics.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/utils/misc_utils.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/utils/monitor_event_utils.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/utils/status_tracker.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/webservice_modules/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_scheduler/webservice_modules/redis_service.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_user/factory.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_user/mysql_persistent_user_manager.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_user/mysql_user_manager.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_user/persistent_factory.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_user/persistent_user_manager.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_user/redis_persistent_user_manager.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/mem_user/user_manager.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/activation/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/activation/base.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/activation/item.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/activation/kv.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/activation/vllmkv.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/base.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/factory.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/parametric/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/parametric/base.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/parametric/item.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/parametric/lora.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/base.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/general.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/item.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/naive.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/prefer_text_memory/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/prefer_text_memory/adder.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/prefer_text_memory/config.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/prefer_text_memory/extractor.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/prefer_text_memory/factory.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/prefer_text_memory/retrievers.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/prefer_text_memory/spliter.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/prefer_text_memory/utils.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/preference.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/simple_preference.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/simple_tree.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/tree.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/tree_text_memory/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/tree_text_memory/organize/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/tree_text_memory/organize/handler.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/tree_text_memory/organize/manager.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/tree_text_memory/organize/relation_reason_detector.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/tree_text_memory/organize/reorganizer.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/tree_text_memory/retrieve/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/tree_text_memory/retrieve/advanced_searcher.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/tree_text_memory/retrieve/bm25_util.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/tree_text_memory/retrieve/bochasearch.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/tree_text_memory/retrieve/internet_retriever_factory.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/tree_text_memory/retrieve/reasoner.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/tree_text_memory/retrieve/recall.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/tree_text_memory/retrieve/reranker.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/tree_text_memory/retrieve/retrieval_mid_structs.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/tree_text_memory/retrieve/retrieve_utils.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/tree_text_memory/retrieve/task_goal_parser.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/tree_text_memory/retrieve/tavilysearch.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/tree_text_memory/retrieve/utils.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memories/textual/tree_text_memory/retrieve/xinyusearch.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memos_tools/dinding_report_bot.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memos_tools/lockfree_dict.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memos_tools/notification_service.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memos_tools/notification_utils.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memos_tools/singleton.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memos_tools/thread_safe_dict.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/memos_tools/thread_safe_dict_segment.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/multi_mem_cube/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/multi_mem_cube/composite_cube.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/multi_mem_cube/single_cube.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/multi_mem_cube/views.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/parsers/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/parsers/base.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/parsers/factory.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/parsers/markitdown.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/plugins/README.md +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/plugins/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/plugins/base.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/plugins/component_bootstrap.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/plugins/hook_defs.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/plugins/hooks.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/plugins/manager.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/reranker/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/reranker/base.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/reranker/concat.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/reranker/cosine_local.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/reranker/factory.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/reranker/http_bge.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/reranker/http_bge_strategy.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/reranker/noop.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/reranker/strategies/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/reranker/strategies/base.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/reranker/strategies/concat_background.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/reranker/strategies/concat_docsource.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/reranker/strategies/dialogue_common.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/reranker/strategies/factory.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/reranker/strategies/single_turn.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/reranker/strategies/singleturn_outmem.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/search/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/search/search_service.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/settings.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/templates/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/templates/advanced_search_prompts.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/templates/cloud_service_prompt.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/templates/instruction_completion.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/templates/mem_agent_prompts.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/templates/mem_feedback_prompts.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/templates/mem_reader_prompts.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/templates/mem_reader_strategy_prompts.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/templates/mem_scheduler_prompts.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/templates/mem_search_prompts.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/templates/mos_prompts.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/templates/prefer_complete_prompt.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/templates/skill_mem_prompt.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/templates/tool_mem_prompts.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/templates/tree_reorganize_prompts.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/types/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/types/general_types.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/types/openai_chat_completion_types/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/types/openai_chat_completion_types/chat_completion_assistant_message_param.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_image_param.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_input_audio_param.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_param.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_refusal_param.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/types/openai_chat_completion_types/chat_completion_content_part_text_param.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/types/openai_chat_completion_types/chat_completion_message_custom_tool_call_param.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/types/openai_chat_completion_types/chat_completion_message_function_tool_call_param.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/types/openai_chat_completion_types/chat_completion_message_param.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/types/openai_chat_completion_types/chat_completion_message_tool_call_union_param.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/types/openai_chat_completion_types/chat_completion_system_message_param.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/types/openai_chat_completion_types/chat_completion_tool_message_param.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/types/openai_chat_completion_types/chat_completion_user_message_param.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/utils.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/vec_dbs/__init__.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/vec_dbs/base.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/vec_dbs/factory.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/vec_dbs/item.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/src/memos/vec_dbs/milvus.py +0 -0
- {memoryos-2.0.27 → memoryos-2.0.30}/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.30
|
|
4
4
|
Summary: Intelligence Begins with Memory
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
License-File: LICENSE
|
|
@@ -30,7 +30,7 @@ Provides-Extra: tavily
|
|
|
30
30
|
Provides-Extra: tree-mem
|
|
31
31
|
Requires-Dist: alibabacloud-oss-v2 (>=1.2.2,<1.2.3) ; extra == "all"
|
|
32
32
|
Requires-Dist: alibabacloud-oss-v2 (>=1.2.2,<1.2.3) ; extra == "skill-mem"
|
|
33
|
-
Requires-Dist: cachetools (>=6.0.0)
|
|
33
|
+
Requires-Dist: cachetools (>=6.0.0)
|
|
34
34
|
Requires-Dist: chonkie (>=1.0.7,<2.0.0) ; extra == "all"
|
|
35
35
|
Requires-Dist: chonkie (>=1.0.7,<2.0.0) ; extra == "mem-reader"
|
|
36
36
|
Requires-Dist: concurrent-log-handler (>=0.9.28,<1.0.0)
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
##############################################################################
|
|
5
5
|
|
|
6
6
|
name = "MemoryOS"
|
|
7
|
-
version = "2.0.
|
|
7
|
+
version = "2.0.30"
|
|
8
8
|
description = "Intelligence Begins with Memory"
|
|
9
9
|
license = {text = "Apache-2.0"}
|
|
10
10
|
readme = "README.md"
|
|
@@ -48,6 +48,7 @@ dependencies = [
|
|
|
48
48
|
"python-dateutil (>=2.9.0.post0,<3.0.0)",
|
|
49
49
|
"prometheus-client (>=0.23.1,<0.24.0)",
|
|
50
50
|
"concurrent-log-handler (>=0.9.28,<1.0.0)", # Process-safe rotating file handler
|
|
51
|
+
"cachetools (>=6.0.0)", # Embedding request caching
|
|
51
52
|
]
|
|
52
53
|
|
|
53
54
|
[project.urls]
|
|
@@ -128,7 +129,6 @@ all = [
|
|
|
128
129
|
"datasketch (>=1.6.5,<2.0.0)",
|
|
129
130
|
"jieba (>=0.38.1,<0.42.1)",
|
|
130
131
|
"rank-bm25 (>=0.2.2)",
|
|
131
|
-
"cachetools (>=6.0.0)",
|
|
132
132
|
# NOT exist in the above optional groups
|
|
133
133
|
# Because they are either huge-size dependencies or infrequently used dependencies.
|
|
134
134
|
# We kindof don't want users to install them.
|
|
@@ -622,6 +622,7 @@ class APIConfig:
|
|
|
622
622
|
"provider": os.getenv("MOS_EMBEDDER_PROVIDER", "openai"),
|
|
623
623
|
"api_key": os.getenv("MOS_EMBEDDER_API_KEY", "sk-xxxx"),
|
|
624
624
|
"model_name_or_path": os.getenv("MOS_EMBEDDER_MODEL", "text-embedding-3-large"),
|
|
625
|
+
"embedding_dims": int(os.getenv("EMBEDDING_DIMENSION", "1024")),
|
|
625
626
|
"headers_extra": json.loads(os.getenv("MOS_EMBEDDER_HEADERS_EXTRA", "{}")),
|
|
626
627
|
"base_url": os.getenv("MOS_EMBEDDER_API_BASE", "http://openai.com"),
|
|
627
628
|
"backup_client": os.getenv("MOS_EMBEDDER_BACKUP_CLIENT", "false").lower()
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import re
|
|
2
|
+
import uuid
|
|
2
3
|
|
|
3
4
|
from abc import ABC, abstractmethod
|
|
4
5
|
|
|
@@ -17,6 +18,12 @@ class Chunk:
|
|
|
17
18
|
class BaseChunker(ABC):
|
|
18
19
|
"""Base class for all text chunkers."""
|
|
19
20
|
|
|
21
|
+
_URL_PATTERN = r'https?://[^\s<>"{}|\\^`\[\]]+'
|
|
22
|
+
_URL_PLACEHOLDER_PREFIX = "__URL_"
|
|
23
|
+
_URL_PLACEHOLDER_PATTERN = re.compile(
|
|
24
|
+
rf"{re.escape(_URL_PLACEHOLDER_PREFIX)}(?:[0-9a-f]+_)?\d+__"
|
|
25
|
+
)
|
|
26
|
+
|
|
20
27
|
@abstractmethod
|
|
21
28
|
def __init__(self, config: BaseChunkerConfig):
|
|
22
29
|
"""Initialize the chunker with the given configuration."""
|
|
@@ -25,6 +32,17 @@ class BaseChunker(ABC):
|
|
|
25
32
|
def chunk(self, text: str) -> list[Chunk]:
|
|
26
33
|
"""Chunk the given text into smaller chunks."""
|
|
27
34
|
|
|
35
|
+
@classmethod
|
|
36
|
+
def _new_url_placeholder_prefix(cls, text: str) -> str:
|
|
37
|
+
"""Return a placeholder namespace that cannot collide with the input."""
|
|
38
|
+
if cls._URL_PLACEHOLDER_PREFIX not in text:
|
|
39
|
+
return cls._URL_PLACEHOLDER_PREFIX
|
|
40
|
+
|
|
41
|
+
while True:
|
|
42
|
+
placeholder_prefix = f"{cls._URL_PLACEHOLDER_PREFIX}{uuid.uuid4().hex[:8]}_"
|
|
43
|
+
if placeholder_prefix not in text:
|
|
44
|
+
return placeholder_prefix
|
|
45
|
+
|
|
28
46
|
def protect_urls(self, text: str) -> tuple[str, dict[str, str]]:
|
|
29
47
|
"""
|
|
30
48
|
Protect URLs in text from being split during chunking.
|
|
@@ -35,16 +53,16 @@ class BaseChunker(ABC):
|
|
|
35
53
|
Returns:
|
|
36
54
|
tuple: (Text with URLs replaced by placeholders, URL mapping dictionary)
|
|
37
55
|
"""
|
|
38
|
-
|
|
39
|
-
|
|
56
|
+
url_map: dict[str, str] = {}
|
|
57
|
+
placeholder_prefix = self._new_url_placeholder_prefix(text)
|
|
40
58
|
|
|
41
59
|
def replace_url(match):
|
|
42
60
|
url = match.group(0)
|
|
43
|
-
placeholder = f"
|
|
61
|
+
placeholder = f"{placeholder_prefix}{len(url_map)}__"
|
|
44
62
|
url_map[placeholder] = url
|
|
45
63
|
return placeholder
|
|
46
64
|
|
|
47
|
-
protected_text = re.sub(
|
|
65
|
+
protected_text = re.sub(self._URL_PATTERN, replace_url, text)
|
|
48
66
|
return protected_text, url_map
|
|
49
67
|
|
|
50
68
|
def restore_urls(self, text: str, url_map: dict[str, str]) -> str:
|
|
@@ -58,8 +76,6 @@ class BaseChunker(ABC):
|
|
|
58
76
|
Returns:
|
|
59
77
|
str: Text with URLs restored
|
|
60
78
|
"""
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
return restored_text
|
|
79
|
+
return self._URL_PLACEHOLDER_PATTERN.sub(
|
|
80
|
+
lambda match: url_map.get(match.group(0), match.group(0)), text
|
|
81
|
+
)
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
from .base import BaseChunker
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class SimpleTextSplitter(BaseChunker):
|
|
5
|
+
"""Simple text splitter wrapper."""
|
|
6
|
+
|
|
7
|
+
def __init__(self, chunk_size: int, chunk_overlap: int):
|
|
8
|
+
if chunk_size <= 0:
|
|
9
|
+
raise ValueError("chunk_size must be greater than 0")
|
|
10
|
+
if chunk_overlap < 0:
|
|
11
|
+
raise ValueError("chunk_overlap must be non-negative")
|
|
12
|
+
if chunk_overlap >= chunk_size:
|
|
13
|
+
raise ValueError("chunk_overlap must be smaller than chunk_size")
|
|
14
|
+
|
|
15
|
+
self.chunk_size = chunk_size
|
|
16
|
+
self.chunk_overlap = chunk_overlap
|
|
17
|
+
|
|
18
|
+
def chunk(self, text: str, **kwargs) -> list[str]:
|
|
19
|
+
return self._simple_split_text(text, self.chunk_size, self.chunk_overlap)
|
|
20
|
+
|
|
21
|
+
@classmethod
|
|
22
|
+
def _placeholder_spans(
|
|
23
|
+
cls, protected_text: str, url_map: dict[str, str]
|
|
24
|
+
) -> list[tuple[int, int]]:
|
|
25
|
+
"""Return the protected-text ranges occupied by URL placeholders."""
|
|
26
|
+
return [
|
|
27
|
+
(match.start(), match.end())
|
|
28
|
+
for match in cls._URL_PLACEHOLDER_PATTERN.finditer(protected_text)
|
|
29
|
+
if match.group(0) in url_map
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
@staticmethod
|
|
33
|
+
def _align_end_to_placeholder(
|
|
34
|
+
end: int,
|
|
35
|
+
start: int,
|
|
36
|
+
chunk_overlap: int,
|
|
37
|
+
placeholder_spans: list[tuple[int, int]],
|
|
38
|
+
) -> int:
|
|
39
|
+
"""Move a chunk end away from the middle of a URL placeholder."""
|
|
40
|
+
for placeholder_start, placeholder_end in placeholder_spans:
|
|
41
|
+
if placeholder_start < end < placeholder_end:
|
|
42
|
+
if placeholder_start - start > chunk_overlap:
|
|
43
|
+
return placeholder_start
|
|
44
|
+
return placeholder_end
|
|
45
|
+
return end
|
|
46
|
+
|
|
47
|
+
@staticmethod
|
|
48
|
+
def _align_start_to_placeholder(
|
|
49
|
+
next_start: int,
|
|
50
|
+
previous_start: int,
|
|
51
|
+
placeholder_spans: list[tuple[int, int]],
|
|
52
|
+
) -> int:
|
|
53
|
+
"""Keep overlap starts from landing in the middle of a URL placeholder."""
|
|
54
|
+
for placeholder_start, placeholder_end in placeholder_spans:
|
|
55
|
+
if placeholder_start < next_start < placeholder_end:
|
|
56
|
+
if placeholder_start > previous_start:
|
|
57
|
+
return placeholder_start
|
|
58
|
+
return placeholder_end
|
|
59
|
+
return next_start
|
|
60
|
+
|
|
61
|
+
def _simple_split_text(self, text: str, chunk_size: int, chunk_overlap: int) -> list[str]:
|
|
62
|
+
"""
|
|
63
|
+
Simple text splitter as fallback when langchain is not available.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
text: Text to split
|
|
67
|
+
chunk_size: Maximum size of chunks
|
|
68
|
+
chunk_overlap: Overlap between chunks
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
List of text chunks
|
|
72
|
+
"""
|
|
73
|
+
protected_text, url_map = self.protect_urls(text)
|
|
74
|
+
|
|
75
|
+
if not protected_text or len(protected_text) <= chunk_size:
|
|
76
|
+
chunks = [protected_text] if protected_text.strip() else []
|
|
77
|
+
return [self.restore_urls(chunk, url_map) for chunk in chunks]
|
|
78
|
+
|
|
79
|
+
chunks = []
|
|
80
|
+
start = 0
|
|
81
|
+
text_len = len(protected_text)
|
|
82
|
+
placeholder_spans = self._placeholder_spans(protected_text, url_map)
|
|
83
|
+
|
|
84
|
+
while start < text_len:
|
|
85
|
+
# Calculate end position
|
|
86
|
+
end = min(start + chunk_size, text_len)
|
|
87
|
+
|
|
88
|
+
# If not the last chunk, try to break at a good position
|
|
89
|
+
if end < text_len:
|
|
90
|
+
# Try to break at newline, sentence end, or space
|
|
91
|
+
for separator in ["\n\n", "\n", "。", "!", "?", ". ", "! ", "? ", " "]:
|
|
92
|
+
last_sep = protected_text.rfind(separator, start, end)
|
|
93
|
+
if last_sep == -1:
|
|
94
|
+
continue
|
|
95
|
+
split_end = last_sep + len(separator)
|
|
96
|
+
if split_end - start > chunk_overlap:
|
|
97
|
+
end = split_end
|
|
98
|
+
break
|
|
99
|
+
|
|
100
|
+
end = self._align_end_to_placeholder(end, start, chunk_overlap, placeholder_spans)
|
|
101
|
+
|
|
102
|
+
chunk = protected_text[start:end].strip()
|
|
103
|
+
if chunk:
|
|
104
|
+
chunks.append(chunk)
|
|
105
|
+
|
|
106
|
+
if end >= text_len:
|
|
107
|
+
break
|
|
108
|
+
|
|
109
|
+
# Move start position with overlap
|
|
110
|
+
next_start = max(start + 1, end - chunk_overlap)
|
|
111
|
+
start = self._align_start_to_placeholder(next_start, start, placeholder_spans)
|
|
112
|
+
|
|
113
|
+
return [self.restore_urls(chunk, url_map) for chunk in chunks]
|
|
@@ -28,6 +28,11 @@ class OpenAILLMConfig(BaseLLMConfig):
|
|
|
28
28
|
default="https://api.openai.com/v1", description="Base URL for OpenAI API"
|
|
29
29
|
)
|
|
30
30
|
extra_body: Any = Field(default=None, description="extra body")
|
|
31
|
+
enable_thinking: bool | None = Field(
|
|
32
|
+
default=None,
|
|
33
|
+
description="Enable/disable thinking mode for models that support it (e.g. Qwen3, DeepSeek-R1). "
|
|
34
|
+
"When None (default), the provider's default behavior is preserved.",
|
|
35
|
+
)
|
|
31
36
|
backup_client: bool = Field(
|
|
32
37
|
default=False,
|
|
33
38
|
description="Whether to enable backup client for fallback on primary failure",
|
|
@@ -91,6 +96,12 @@ class AzureLLMConfig(BaseLLMConfig):
|
|
|
91
96
|
description="API version for Azure OpenAI",
|
|
92
97
|
)
|
|
93
98
|
api_key: str = Field(..., description="API key for Azure OpenAI")
|
|
99
|
+
extra_body: Any = Field(default=None, description="Extra request body parameters")
|
|
100
|
+
enable_thinking: bool | None = Field(
|
|
101
|
+
default=None,
|
|
102
|
+
description="Enable/disable thinking mode for models that support it. "
|
|
103
|
+
"When None (default), the provider's default behavior is preserved.",
|
|
104
|
+
)
|
|
94
105
|
|
|
95
106
|
|
|
96
107
|
class AzureResponsesLLMConfig(BaseLLMConfig):
|
|
@@ -1,18 +1,23 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
import os
|
|
2
4
|
import threading
|
|
3
5
|
|
|
4
6
|
from collections import Counter
|
|
5
7
|
from concurrent.futures import Future
|
|
6
|
-
from typing import Any
|
|
7
|
-
|
|
8
|
-
from cachetools import LRUCache, TTLCache
|
|
8
|
+
from typing import TYPE_CHECKING, Any
|
|
9
9
|
|
|
10
10
|
from memos.context.context import get_current_trace_id
|
|
11
|
+
from memos.dependency import require_python_package
|
|
11
12
|
from memos.embedders.base import BaseEmbedder
|
|
12
13
|
from memos.exceptions import EmbedderError
|
|
13
14
|
from memos.log import get_logger
|
|
14
15
|
|
|
15
16
|
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from cachetools import LRUCache, TTLCache
|
|
19
|
+
|
|
20
|
+
|
|
16
21
|
logger = get_logger(__name__)
|
|
17
22
|
|
|
18
23
|
|
|
@@ -68,9 +73,16 @@ def _env_int(name: str, default: int, minimum: int = 1) -> int:
|
|
|
68
73
|
class CachingEmbedder(BaseEmbedder):
|
|
69
74
|
"""Add exact caches and singleflight coordination to an embedder."""
|
|
70
75
|
|
|
76
|
+
@require_python_package(
|
|
77
|
+
import_name="cachetools",
|
|
78
|
+
install_command="pip install 'cachetools>=6.0.0'",
|
|
79
|
+
)
|
|
71
80
|
def __init__(self, backend: BaseEmbedder):
|
|
81
|
+
from cachetools import LRUCache, TTLCache
|
|
82
|
+
|
|
72
83
|
self._backend = backend
|
|
73
84
|
self.config = backend.config
|
|
85
|
+
self._lru_cache_cls: type[LRUCache] = LRUCache
|
|
74
86
|
self._lock = threading.RLock()
|
|
75
87
|
self._inflight: dict[str, Future[CachedVector]] = {}
|
|
76
88
|
self._stats: Counter[str] = Counter()
|
|
@@ -196,7 +208,7 @@ class CachingEmbedder(BaseEmbedder):
|
|
|
196
208
|
return None
|
|
197
209
|
request_cache = self._request_caches.get(request_id)
|
|
198
210
|
if request_cache is None:
|
|
199
|
-
request_cache =
|
|
211
|
+
request_cache = self._lru_cache_cls(maxsize=self._request_cache_text_limit)
|
|
200
212
|
self._request_caches[request_id] = request_cache
|
|
201
213
|
return request_cache
|
|
202
214
|
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
from openai import AzureOpenAI as AzureClient
|
|
4
|
+
from openai import BadRequestError
|
|
5
|
+
from openai import OpenAI as OpenAIClient
|
|
6
|
+
|
|
7
|
+
from memos.configs.embedder import UniversalAPIEmbedderConfig
|
|
8
|
+
from memos.embedders.base import BaseEmbedder, log_embedding_call
|
|
9
|
+
from memos.log import get_logger
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
logger = get_logger(__name__)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _sanitize_unicode(text: str) -> str:
|
|
16
|
+
"""
|
|
17
|
+
Remove Unicode surrogates and other problematic characters.
|
|
18
|
+
Surrogates (U+D800-U+DFFF) cause UnicodeEncodeError with some APIs.
|
|
19
|
+
"""
|
|
20
|
+
try:
|
|
21
|
+
# Encode with 'surrogatepass' then decode, replacing invalid chars
|
|
22
|
+
cleaned = text.encode("utf-8", errors="surrogatepass").decode("utf-8", errors="replace")
|
|
23
|
+
# Replace replacement char with empty string for cleaner output
|
|
24
|
+
return cleaned.replace("\ufffd", "")
|
|
25
|
+
except Exception:
|
|
26
|
+
# Fallback: remove all non-BMP characters
|
|
27
|
+
return "".join(c for c in text if ord(c) < 0x10000)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class UniversalAPIEmbedder(BaseEmbedder):
|
|
31
|
+
def __init__(self, config: UniversalAPIEmbedderConfig):
|
|
32
|
+
self.provider = config.provider
|
|
33
|
+
self.config = config
|
|
34
|
+
|
|
35
|
+
if self.provider == "openai":
|
|
36
|
+
self.client = OpenAIClient(
|
|
37
|
+
api_key=config.api_key,
|
|
38
|
+
base_url=config.base_url,
|
|
39
|
+
default_headers=config.headers_extra if config.headers_extra else None,
|
|
40
|
+
)
|
|
41
|
+
elif self.provider == "azure":
|
|
42
|
+
self.client = AzureClient(
|
|
43
|
+
azure_endpoint=config.base_url,
|
|
44
|
+
api_version="2024-03-01-preview",
|
|
45
|
+
api_key=config.api_key,
|
|
46
|
+
)
|
|
47
|
+
else:
|
|
48
|
+
raise ValueError(f"Embeddings unsupported provider: {self.provider}")
|
|
49
|
+
self.use_backup_client = config.backup_client
|
|
50
|
+
if self.use_backup_client:
|
|
51
|
+
self.backup_client = OpenAIClient(
|
|
52
|
+
api_key=config.backup_api_key,
|
|
53
|
+
base_url=config.backup_base_url,
|
|
54
|
+
default_headers=config.backup_headers_extra
|
|
55
|
+
if config.backup_headers_extra
|
|
56
|
+
else None,
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
@staticmethod
|
|
60
|
+
def _build_embedding_kwargs(model: str, texts: list[str], embedding_dims: int | None) -> dict:
|
|
61
|
+
kwargs = {"model": model, "input": texts}
|
|
62
|
+
if embedding_dims is not None:
|
|
63
|
+
kwargs["dimensions"] = embedding_dims
|
|
64
|
+
return kwargs
|
|
65
|
+
|
|
66
|
+
@staticmethod
|
|
67
|
+
def _is_dimensions_unsupported(error: BadRequestError) -> bool:
|
|
68
|
+
body = getattr(error, "body", None)
|
|
69
|
+
details = body.get("error", body) if isinstance(body, dict) else {}
|
|
70
|
+
if isinstance(details, dict):
|
|
71
|
+
param = str(details.get("param") or "").lower()
|
|
72
|
+
code = str(details.get("code") or "").lower()
|
|
73
|
+
if param == "dimensions" and any(
|
|
74
|
+
marker in code for marker in ("unsupported", "unknown", "unrecognized")
|
|
75
|
+
):
|
|
76
|
+
return True
|
|
77
|
+
|
|
78
|
+
messages = [str(error)]
|
|
79
|
+
if isinstance(details, dict) and isinstance(details.get("message"), str):
|
|
80
|
+
messages.append(details["message"])
|
|
81
|
+
message = " ".join(messages).lower()
|
|
82
|
+
unsupported_markers = (
|
|
83
|
+
"dimensions is not supported",
|
|
84
|
+
"dimensions not supported",
|
|
85
|
+
"does not support dimensions",
|
|
86
|
+
"unsupported parameter: dimensions",
|
|
87
|
+
"unknown parameter: dimensions",
|
|
88
|
+
"does not support matryoshka",
|
|
89
|
+
"changing output dimensions is unsupported",
|
|
90
|
+
"changing output dimensions will lead",
|
|
91
|
+
)
|
|
92
|
+
return any(marker in message for marker in unsupported_markers)
|
|
93
|
+
|
|
94
|
+
def _call_embeddings_api(
|
|
95
|
+
self, client, model: str, texts: list[str], timeout: int
|
|
96
|
+
) -> list[list[float]]:
|
|
97
|
+
embedding_dims = getattr(self.config, "embedding_dims", None)
|
|
98
|
+
kwargs = self._build_embedding_kwargs(model, texts, embedding_dims)
|
|
99
|
+
|
|
100
|
+
try:
|
|
101
|
+
response = client.embeddings.create(**kwargs, timeout=timeout)
|
|
102
|
+
except BadRequestError as error:
|
|
103
|
+
if embedding_dims is None or not self._is_dimensions_unsupported(error):
|
|
104
|
+
raise
|
|
105
|
+
|
|
106
|
+
logger.warning(
|
|
107
|
+
"Embedding provider rejected dimensions=%d; retrying without dimensions",
|
|
108
|
+
embedding_dims,
|
|
109
|
+
)
|
|
110
|
+
fallback_kwargs = self._build_embedding_kwargs(model, texts, None)
|
|
111
|
+
response = client.embeddings.create(**fallback_kwargs, timeout=timeout)
|
|
112
|
+
|
|
113
|
+
return [item.embedding for item in response.data]
|
|
114
|
+
|
|
115
|
+
@log_embedding_call
|
|
116
|
+
def embed(self, texts: list[str]) -> list[list[float]]:
|
|
117
|
+
if isinstance(texts, str):
|
|
118
|
+
texts = [texts]
|
|
119
|
+
texts = [_sanitize_unicode(t) for t in texts]
|
|
120
|
+
texts = self._truncate_texts(texts)
|
|
121
|
+
if self.provider == "openai" or self.provider == "azure":
|
|
122
|
+
timeout = int(os.getenv("MOS_EMBEDDER_TIMEOUT", 5))
|
|
123
|
+
try:
|
|
124
|
+
model = getattr(self.config, "model_name_or_path", "text-embedding-3-large")
|
|
125
|
+
return self._call_embeddings_api(self.client, model, texts, timeout)
|
|
126
|
+
except Exception as e:
|
|
127
|
+
if self.use_backup_client:
|
|
128
|
+
logger.warning(
|
|
129
|
+
"Embedding request failed error_type=%s; trying backup client",
|
|
130
|
+
type(e).__name__,
|
|
131
|
+
)
|
|
132
|
+
try:
|
|
133
|
+
backup_model = getattr(
|
|
134
|
+
self.config,
|
|
135
|
+
"backup_model_name_or_path",
|
|
136
|
+
"text-embedding-3-large",
|
|
137
|
+
)
|
|
138
|
+
return self._call_embeddings_api(
|
|
139
|
+
self.backup_client, backup_model, texts, timeout
|
|
140
|
+
)
|
|
141
|
+
except Exception as e_backup:
|
|
142
|
+
raise ValueError(
|
|
143
|
+
f"Backup embeddings request ended with error: {e_backup}"
|
|
144
|
+
) from e_backup
|
|
145
|
+
else:
|
|
146
|
+
raise ValueError(f"Embeddings request ended with error: {e}") from e
|
|
147
|
+
else:
|
|
148
|
+
raise ValueError(f"Embeddings unsupported provider: {self.provider}")
|
|
@@ -2,6 +2,7 @@ import json
|
|
|
2
2
|
import time
|
|
3
3
|
|
|
4
4
|
from collections.abc import Generator
|
|
5
|
+
from typing import Any
|
|
5
6
|
|
|
6
7
|
import openai
|
|
7
8
|
|
|
@@ -19,6 +20,13 @@ from memos.utils import timed_with_status
|
|
|
19
20
|
logger = get_logger(__name__)
|
|
20
21
|
|
|
21
22
|
|
|
23
|
+
def _merge_enable_thinking(extra_body: Any, enable_thinking: bool | None) -> Any:
|
|
24
|
+
"""Merge provider-specific thinking control into the SDK's extra request body."""
|
|
25
|
+
if enable_thinking is None:
|
|
26
|
+
return extra_body
|
|
27
|
+
return {**(extra_body or {}), "enable_thinking": enable_thinking}
|
|
28
|
+
|
|
29
|
+
|
|
22
30
|
class OpenAILLM(BaseLLM):
|
|
23
31
|
"""OpenAI LLM class via openai.chat.completions.create."""
|
|
24
32
|
|
|
@@ -61,6 +69,22 @@ class OpenAILLM(BaseLLM):
|
|
|
61
69
|
return reasoning_content + (response_content or "")
|
|
62
70
|
return response_content or ""
|
|
63
71
|
|
|
72
|
+
def _build_request_body(self, messages: MessageList, **kwargs) -> dict:
|
|
73
|
+
enable_thinking = kwargs.get("enable_thinking", self.config.enable_thinking)
|
|
74
|
+
extra_body = _merge_enable_thinking(
|
|
75
|
+
kwargs.get("extra_body", self.config.extra_body), enable_thinking
|
|
76
|
+
)
|
|
77
|
+
request_body = {
|
|
78
|
+
"model": kwargs.get("model_name_or_path", self.config.model_name_or_path),
|
|
79
|
+
"messages": messages,
|
|
80
|
+
"temperature": kwargs.get("temperature", self.config.temperature),
|
|
81
|
+
"max_tokens": kwargs.get("max_tokens", self.config.max_tokens),
|
|
82
|
+
"top_p": kwargs.get("top_p", self.config.top_p),
|
|
83
|
+
"extra_body": extra_body,
|
|
84
|
+
"tools": kwargs.get("tools", NOT_GIVEN),
|
|
85
|
+
}
|
|
86
|
+
return request_body
|
|
87
|
+
|
|
64
88
|
@timed_with_status(
|
|
65
89
|
log_prefix="OpenAI LLM",
|
|
66
90
|
log_extra_args=lambda self, messages, **kwargs: {
|
|
@@ -70,15 +94,7 @@ class OpenAILLM(BaseLLM):
|
|
|
70
94
|
)
|
|
71
95
|
def generate(self, messages: MessageList, **kwargs) -> str:
|
|
72
96
|
"""Generate a response from OpenAI LLM, optionally overriding generation params."""
|
|
73
|
-
request_body =
|
|
74
|
-
"model": kwargs.get("model_name_or_path", self.config.model_name_or_path),
|
|
75
|
-
"messages": messages,
|
|
76
|
-
"temperature": kwargs.get("temperature", self.config.temperature),
|
|
77
|
-
"max_tokens": kwargs.get("max_tokens", self.config.max_tokens),
|
|
78
|
-
"top_p": kwargs.get("top_p", self.config.top_p),
|
|
79
|
-
"extra_body": kwargs.get("extra_body", self.config.extra_body),
|
|
80
|
-
"tools": kwargs.get("tools", NOT_GIVEN),
|
|
81
|
-
}
|
|
97
|
+
request_body = self._build_request_body(messages, **kwargs)
|
|
82
98
|
start_time = time.perf_counter()
|
|
83
99
|
logger.info(f"OpenAI LLM Request body: {request_body}")
|
|
84
100
|
|
|
@@ -121,16 +137,8 @@ class OpenAILLM(BaseLLM):
|
|
|
121
137
|
logger.info("stream api not support tools")
|
|
122
138
|
return
|
|
123
139
|
|
|
124
|
-
request_body =
|
|
125
|
-
|
|
126
|
-
"messages": messages,
|
|
127
|
-
"stream": True,
|
|
128
|
-
"temperature": kwargs.get("temperature", self.config.temperature),
|
|
129
|
-
"max_tokens": kwargs.get("max_tokens", self.config.max_tokens),
|
|
130
|
-
"top_p": kwargs.get("top_p", self.config.top_p),
|
|
131
|
-
"extra_body": kwargs.get("extra_body", self.config.extra_body),
|
|
132
|
-
"tools": kwargs.get("tools", NOT_GIVEN),
|
|
133
|
-
}
|
|
140
|
+
request_body = self._build_request_body(messages, **kwargs)
|
|
141
|
+
request_body["stream"] = True
|
|
134
142
|
|
|
135
143
|
logger.info(f"OpenAI LLM Stream Request body: {request_body}")
|
|
136
144
|
response = self.client.chat.completions.create(**request_body)
|
|
@@ -184,15 +192,19 @@ class AzureLLM(BaseLLM):
|
|
|
184
192
|
|
|
185
193
|
def generate(self, messages: MessageList, **kwargs) -> str:
|
|
186
194
|
"""Generate a response from Azure OpenAI LLM."""
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
195
|
+
enable_thinking = kwargs.get("enable_thinking", self.config.enable_thinking)
|
|
196
|
+
request_body = {
|
|
197
|
+
"model": self.config.model_name_or_path,
|
|
198
|
+
"messages": messages,
|
|
199
|
+
"temperature": kwargs.get("temperature", self.config.temperature),
|
|
200
|
+
"max_tokens": kwargs.get("max_tokens", self.config.max_tokens),
|
|
201
|
+
"top_p": kwargs.get("top_p", self.config.top_p),
|
|
202
|
+
"tools": kwargs.get("tools", NOT_GIVEN),
|
|
203
|
+
"extra_body": _merge_enable_thinking(
|
|
204
|
+
kwargs.get("extra_body", self.config.extra_body), enable_thinking
|
|
205
|
+
),
|
|
206
|
+
}
|
|
207
|
+
response = self.client.chat.completions.create(**request_body)
|
|
196
208
|
logger.info(f"Response from Azure OpenAI: {response.model_dump_json()}")
|
|
197
209
|
if not response.choices:
|
|
198
210
|
logger.warning("Azure OpenAI response has no choices")
|
|
@@ -212,15 +224,19 @@ class AzureLLM(BaseLLM):
|
|
|
212
224
|
logger.info("stream api not support tools")
|
|
213
225
|
return
|
|
214
226
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
227
|
+
enable_thinking = kwargs.get("enable_thinking", self.config.enable_thinking)
|
|
228
|
+
request_body = {
|
|
229
|
+
"model": self.config.model_name_or_path,
|
|
230
|
+
"messages": messages,
|
|
231
|
+
"stream": True,
|
|
232
|
+
"temperature": kwargs.get("temperature", self.config.temperature),
|
|
233
|
+
"max_tokens": kwargs.get("max_tokens", self.config.max_tokens),
|
|
234
|
+
"top_p": kwargs.get("top_p", self.config.top_p),
|
|
235
|
+
"extra_body": _merge_enable_thinking(
|
|
236
|
+
kwargs.get("extra_body", self.config.extra_body), enable_thinking
|
|
237
|
+
),
|
|
238
|
+
}
|
|
239
|
+
response = self.client.chat.completions.create(**request_body)
|
|
224
240
|
|
|
225
241
|
reasoning_started = False
|
|
226
242
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
|
|
3
|
+
from collections.abc import Generator
|
|
3
4
|
from typing import Any, cast
|
|
4
5
|
|
|
5
6
|
import openai
|
|
@@ -152,7 +153,7 @@ class VLLMLLM(BaseLLM):
|
|
|
152
153
|
prompt_parts.append(f"{role.capitalize()}: {content}")
|
|
153
154
|
return "\n".join(prompt_parts)
|
|
154
155
|
|
|
155
|
-
def generate_stream(self, messages: list[MessageDict], **kwargs):
|
|
156
|
+
def generate_stream(self, messages: list[MessageDict], **kwargs) -> Generator[str, None, None]:
|
|
156
157
|
"""
|
|
157
158
|
Generate a response from the model using streaming.
|
|
158
159
|
Yields content chunks as they are received.
|
|
@@ -185,11 +186,14 @@ class VLLMLLM(BaseLLM):
|
|
|
185
186
|
reasoning_started = True
|
|
186
187
|
yield delta.reasoning
|
|
187
188
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
189
|
+
if hasattr(delta, "content") and delta.content:
|
|
190
|
+
if reasoning_started and not self.config.remove_think_prefix:
|
|
191
|
+
yield "</think>"
|
|
192
|
+
reasoning_started = False
|
|
193
|
+
yield delta.content
|
|
194
|
+
|
|
195
|
+
if reasoning_started and not self.config.remove_think_prefix:
|
|
196
|
+
yield "</think>"
|
|
193
197
|
|
|
194
198
|
else:
|
|
195
199
|
raise RuntimeError("API client is not available")
|