From b8f842d77cbc38caafaccc8ff6a9e081c3807b1f Mon Sep 17 00:00:00 2001 From: suluyan Date: Tue, 16 Dec 2025 19:59:08 +0800 Subject: [PATCH 01/11] fix bugs --- ms_agent/agent/llm_agent.py | 18 ++++++++---- ms_agent/memory/default_memory.py | 48 +++++++++++++++---------------- 2 files changed, 37 insertions(+), 29 deletions(-) diff --git a/ms_agent/agent/llm_agent.py b/ms_agent/agent/llm_agent.py index 19c9c7496..c4ba9ec8b 100644 --- a/ms_agent/agent/llm_agent.py +++ b/ms_agent/agent/llm_agent.py @@ -1,4 +1,5 @@ # Copyright (c) Alibaba, Inc. and its affiliates. +import asyncio import importlib import inspect import os.path @@ -572,13 +573,13 @@ def _get_run_memory_info(self, memory_config: DictConfig): memory_type = memory_type or None return user_id, agent_id, run_id, memory_type - async def add_memory(self, messages: List[Message], **kwargs): + async def add_memory(self, messages: List[Message], add_type, **kwargs): if hasattr(self.config, 'memory') and self.config.memory: tools_num = len( self.memory_tools ) if self.memory_tools else 0 # Check index bounds before access to avoid IndexError for idx, memory_config in enumerate(self.config.memory): - if self.runtime.should_stop: + if add_type == 'add_after_task': user_id, agent_id, run_id, memory_type = self._get_run_memory_info( memory_config) else: @@ -658,7 +659,8 @@ async def run_loop(self, messages: Union[List[Message], str], yield messages self.runtime.round += 1 # save memory and history - await self.add_memory(messages, **kwargs) + await self.add_memory( + messages, add_type='add_after_step', **kwargs) self.save_history(messages) # +1 means the next round the assistant may give a conclusion @@ -674,11 +676,17 @@ async def run_loop(self, messages: Union[List[Message], str], yield messages # save memory - await self.add_memory(messages, **kwargs) - await self.on_task_end(messages) await self.cleanup_tools() yield messages + + def _add_memory(): + asyncio.run( + self.add_memory( + messages, add_type='add_after_task', **kwargs)) + + loop = asyncio.get_running_loop() + loop.run_in_executor(None, _add_memory) except Exception as e: import traceback logger.warning(traceback.format_exc()) diff --git a/ms_agent/memory/default_memory.py b/ms_agent/memory/default_memory.py index a0f08c958..0c3d20fdb 100644 --- a/ms_agent/memory/default_memory.py +++ b/ms_agent/memory/default_memory.py @@ -438,6 +438,7 @@ async def add( logger.info(item[1]) if should_add_messages: for messages in should_add_messages: + messages = self.parse_messages(messages) await self.add_single( messages, user_id=user_id, @@ -446,6 +447,23 @@ async def add( memory_type=memory_type) self.save_cache() + def parse_messages(self, messages: List[Message]) -> List[Message]: + new_messages = [] + for msg in messages: + role = getattr(msg, 'role', None) + content = getattr(msg, 'content', None) + + if 'system' not in self.ignore_roles and role == 'system': + new_messages.append(msg) + if role == 'user': + new_messages.append(msg) + if 'assistant' not in self.ignore_roles and role == 'assistant' and content is not None: + new_messages.append(msg) + if 'tool' not in self.ignore_roles and role == 'tool': + new_messages.append(msg) + + return new_messages + def delete(self, user_id: Optional[str] = None, agent_id: Optional[str] = None, @@ -482,7 +500,6 @@ def get_all(self, user_id=user_id or self.user_id, agent_id=agent_id, run_id=run_id) - print(res['results']) return res['results'] except Exception: return [] @@ -556,34 +573,14 @@ def _init_memory_obj(self): ) raise - parse_messages_origin = mem0.memory.main.parse_messages capture_event_origin = mem0.memory.main.capture_event - @wraps(parse_messages_origin) - def patched_parse_messages(messages, ignore_roles): - response = '' - for msg in messages: - if 'system' not in ignore_roles and msg['role'] == 'system': - response += f"system: {msg['content']}\n" - if msg['role'] == 'user': - response += f"user: {msg['content']}\n" - if msg['role'] == 'assistant' and msg['content'] is not None: - response += f"assistant: {msg['content']}\n" - if 'tool' not in ignore_roles and msg['role'] == 'tool': - response += f"tool: {msg['content']}\n" - return response - @wraps(capture_event_origin) def patched_capture_event(event_name, memory_instance, additional_data=None): pass - mem0.memory.main.parse_messages = partial( - patched_parse_messages, - ignore_roles=self.ignore_roles, - ) - mem0.memory.main.capture_event = partial(patched_capture_event, ) # emb config @@ -703,9 +700,12 @@ def sanitize_database_name(ori_name: str, mem0_config['llm'] = llm logger.info(f'Memory config: {mem0_config}') # Prompt content is too long, default logging reduces readability - mem0_config['custom_fact_extraction_prompt'] = getattr( - self.config, 'fact_retrieval_prompt', get_fact_retrieval_prompt() - ) + f'Today\'s date is {datetime.now().strftime("%Y-%m-%d")}.' + custom_fact_extraction_prompt = getattr(self.config, + 'fact_retrieval_prompt', None) + if custom_fact_extraction_prompt is not None: + mem0_config['custom_fact_extraction_prompt'] = ( + custom_fact_extraction_prompt + + f'Today\'s date is {datetime.now().strftime("%Y-%m-%d")}.') try: memory = mem0.Memory.from_config(mem0_config) memory._telemetry_vector_store = None From 257c5572f21ab59e36013299af1cfbdafb02113f Mon Sep 17 00:00:00 2001 From: suluyan Date: Tue, 16 Dec 2025 20:38:02 +0800 Subject: [PATCH 02/11] lazy import aiohttp --- ms_agent/tools/image_generator/ds_image_gen.py | 2 +- ms_agent/tools/image_generator/ms_image_gen.py | 2 +- ms_agent/tools/video_generator/ds_video_gen.py | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ms_agent/tools/image_generator/ds_image_gen.py b/ms_agent/tools/image_generator/ds_image_gen.py index 71aeab432..b7286b218 100644 --- a/ms_agent/tools/image_generator/ds_image_gen.py +++ b/ms_agent/tools/image_generator/ds_image_gen.py @@ -2,7 +2,6 @@ import uuid from io import BytesIO -import aiohttp from PIL import Image @@ -19,6 +18,7 @@ async def generate_image(self, size=None, ratio=None, **kwargs): + import aiohttp image_generator = self.config.tools.image_generator base_url = ( getattr(image_generator, 'base_url', None) diff --git a/ms_agent/tools/image_generator/ms_image_gen.py b/ms_agent/tools/image_generator/ms_image_gen.py index 648a10b3b..b121458e6 100644 --- a/ms_agent/tools/image_generator/ms_image_gen.py +++ b/ms_agent/tools/image_generator/ms_image_gen.py @@ -3,7 +3,6 @@ import uuid from io import BytesIO -import aiohttp import json from PIL import Image @@ -20,6 +19,7 @@ async def generate_image(self, negative_prompt=None, size=None, **kwargs): + import aiohttp image_generator = self.config.tools.image_generator base_url = (getattr(image_generator, 'base_url', None) or 'https://api-inference.modelscope.cn').strip('/') diff --git a/ms_agent/tools/video_generator/ds_video_gen.py b/ms_agent/tools/video_generator/ds_video_gen.py index fbdc38870..d757038d3 100644 --- a/ms_agent/tools/video_generator/ds_video_gen.py +++ b/ms_agent/tools/video_generator/ds_video_gen.py @@ -2,7 +2,6 @@ import os import uuid -import aiohttp from ms_agent.utils import get_logger logger = get_logger() @@ -34,6 +33,7 @@ async def generate_video(self, @staticmethod async def download_video(video_url, output_file): + import aiohttp max_retries = 3 retry_count = 0 @@ -57,6 +57,7 @@ async def download_video(video_url, output_file): @staticmethod async def _generate_video(base_url, api_key, model, prompt, size, seconds): + import aiohttp base_url = base_url.strip('/') create_endpoint = '/api/v1/services/aigc/model-evaluation/async-inference/' From 8eb5973c18c97685393ecf61a6ff6cfe85309cda Mon Sep 17 00:00:00 2001 From: suluyan Date: Mon, 22 Dec 2025 21:20:42 +0800 Subject: [PATCH 03/11] fix custom_fact_extraction_prompt & no search meta info --- ms_agent/memory/default_memory.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ms_agent/memory/default_memory.py b/ms_agent/memory/default_memory.py index 0c3d20fdb..e4c2c5e44 100644 --- a/ms_agent/memory/default_memory.py +++ b/ms_agent/memory/default_memory.py @@ -312,7 +312,6 @@ def search(self, agent_id = meta_info.get('agent_id', None) run_id = meta_info.get('run_id', None) limit = meta_info.get('limit', self.search_limit) - relevant_memories = self.memory.search( query, user_id=user_id or self.user_id, @@ -553,6 +552,8 @@ async def run( query = self._get_latest_user_message(messages) if not query: return messages + if meta_infos is None: + meta_infos = [{'user_id': self.user_id}] async with self._lock: try: memories = self.search(query, meta_infos) @@ -700,8 +701,8 @@ def sanitize_database_name(ori_name: str, mem0_config['llm'] = llm logger.info(f'Memory config: {mem0_config}') # Prompt content is too long, default logging reduces readability - custom_fact_extraction_prompt = getattr(self.config, - 'fact_retrieval_prompt', None) + custom_fact_extraction_prompt = getattr(self.config, 'fact_retrieval_prompt', + getattr(self.config, 'custom_fact_extraction_prompt', None)) if custom_fact_extraction_prompt is not None: mem0_config['custom_fact_extraction_prompt'] = ( custom_fact_extraction_prompt From 33281b8b746739af789dd5698c2d74366b9ddf4a Mon Sep 17 00:00:00 2001 From: suluyan Date: Thu, 25 Dec 2025 20:47:38 +0800 Subject: [PATCH 04/11] fix memory cache --- ms_agent/memory/default_memory.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/ms_agent/memory/default_memory.py b/ms_agent/memory/default_memory.py index e4c2c5e44..7272d46ed 100644 --- a/ms_agent/memory/default_memory.py +++ b/ms_agent/memory/default_memory.py @@ -388,21 +388,36 @@ def _analyze_messages( """ new_blocks = self._split_into_blocks(messages) self.cache_messages = dict(sorted(self.cache_messages.items())) - cache_messages = [(key, value) for key, value in self.cache_messages.items()] + first_unmatched_idx = -1 + for idx in range(len(new_blocks)): block_hash = self._hash_block(new_blocks[idx]) - if idx < len(cache_messages) - 1 and str(block_hash) == str( + + # Must allow comparison up to the last cache entry + if idx < len(cache_messages) and str(block_hash) == str( cache_messages[idx][1][1]): continue + + # mismatch first_unmatched_idx = idx break + + # If all new_blocks match but the cache has extra entries → delete the extra cache entries + if first_unmatched_idx == -1: + should_add_messages = [] + should_delete = [ + item[0] for item in cache_messages[len(new_blocks):] + ] + return should_add_messages, should_delete + + # On mismatch: add all new blocks and delete all cache entries starting from the mismatch index + should_add_messages = new_blocks[first_unmatched_idx:] should_delete = [ item[0] for item in cache_messages[first_unmatched_idx:] - ] if first_unmatched_idx != -1 else [] - should_add_messages = new_blocks[first_unmatched_idx:] + ] return should_add_messages, should_delete @@ -701,8 +716,9 @@ def sanitize_database_name(ori_name: str, mem0_config['llm'] = llm logger.info(f'Memory config: {mem0_config}') # Prompt content is too long, default logging reduces readability - custom_fact_extraction_prompt = getattr(self.config, 'fact_retrieval_prompt', - getattr(self.config, 'custom_fact_extraction_prompt', None)) + custom_fact_extraction_prompt = getattr( + self.config, 'fact_retrieval_prompt', + getattr(self.config, 'custom_fact_extraction_prompt', None)) if custom_fact_extraction_prompt is not None: mem0_config['custom_fact_extraction_prompt'] = ( custom_fact_extraction_prompt From 996dddea0657ef683c7c074d9b8f0fdaa5270973 Mon Sep 17 00:00:00 2001 From: suluyan Date: Mon, 29 Dec 2025 14:13:43 +0800 Subject: [PATCH 05/11] fix confict --- ms_agent/memory/default_memory.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/ms_agent/memory/default_memory.py b/ms_agent/memory/default_memory.py index 8fc58f007..b179e1985 100644 --- a/ms_agent/memory/default_memory.py +++ b/ms_agent/memory/default_memory.py @@ -81,7 +81,7 @@ class DefaultMemory(Memory): def __init__(self, config: DictConfig): super().__init__(config) - memory_config = config.default_memory + memory_config = config.memory.default_memory self.user_id: Optional[str] = getattr(memory_config, 'user_id', DEFAULT_USER) self.agent_id: Optional[str] = getattr(memory_config, 'agent_id', None) @@ -603,8 +603,8 @@ def patched_capture_event(event_name, # emb config embedder = None - embedder_config = getattr(self.config, 'embedder', - OmegaConf.create({})) + embedder_config = getattr(self.config.memory.default_memory, + 'embedder', OmegaConf.create({})) service = getattr(embedder_config, 'service', 'modelscope') api_key = getattr(embedder_config, 'api_key', None) emb_model = getattr(embedder_config, 'model', @@ -632,9 +632,11 @@ def patched_capture_event(event_name, service = getattr(llm_config, 'service', 'modelscope') llm_model = getattr(llm_config, 'model', 'Qwen/Qwen3-Coder-30B-A3B-Instruct') - api_key = getattr(llm_config, 'api_key', None) - openai_base_url = getattr(llm_config, 'openai_base_url', None) - max_tokens = getattr(llm_config, 'max_tokens', None) + api_key = getattr(llm_config, f'{service}_api_key', None) + openai_base_url = getattr(llm_config, f'{service}_base_url', + None) + gen_cfg = getattr(self.config, 'generation_config', None) + max_tokens = getattr(gen_cfg, 'max_tokens', None) llm = { 'provider': 'openai', @@ -665,8 +667,8 @@ def sanitize_database_name(ori_name: str, sanitized = f'col_{sanitized}' return sanitized - vector_store_config = getattr(self.config, 'vector_store', - OmegaConf.create({})) + vector_store_config = getattr(self.config.memory.default_memory, + 'vector_store', OmegaConf.create({})) vector_store_provider = getattr(vector_store_config, 'service', 'qdrant') on_disk = getattr(vector_store_config, 'on_disk', True) @@ -719,8 +721,9 @@ def sanitize_database_name(ori_name: str, logger.info(f'Memory config: {mem0_config}') # Prompt content is too long, default logging reduces readability custom_fact_extraction_prompt = getattr( - self.config, 'fact_retrieval_prompt', - getattr(self.config, 'custom_fact_extraction_prompt', None)) + self.config.memory.default_memory, 'fact_retrieval_prompt', + getattr(self.config.memory.default_memory, + 'custom_fact_extraction_prompt', None)) if custom_fact_extraction_prompt is not None: mem0_config['custom_fact_extraction_prompt'] = ( custom_fact_extraction_prompt From 03372f5bf934f0df8f15ff9784fb8ad14508175a Mon Sep 17 00:00:00 2001 From: suluyan Date: Mon, 29 Dec 2025 20:36:53 +0800 Subject: [PATCH 06/11] fix confict --- ms_agent/agent/llm_agent.py | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/ms_agent/agent/llm_agent.py b/ms_agent/agent/llm_agent.py index c7bac849d..4305cfc08 100644 --- a/ms_agent/agent/llm_agent.py +++ b/ms_agent/agent/llm_agent.py @@ -548,25 +548,23 @@ def _get_run_memory_info(self, memory_config: DictConfig): async def add_memory(self, messages: List[Message], add_type, **kwargs): if hasattr(self.config, 'memory') and self.config.memory: - tools_num = len( - self.memory_tools - ) if self.memory_tools else 0 # Check index bounds before access to avoid IndexError - for idx, memory_config in enumerate(self.config.memory): + tools_num = len(self.memory_tools) if self.memory_tools else 0 + + for idx, (mem_instance_type, memory_config) in enumerate(self.config.memory.items()): if add_type == 'add_after_task': - user_id, agent_id, run_id, memory_type = self._get_run_memory_info( - memory_config) + user_id, agent_id, run_id, memory_type = self._get_run_memory_info(memory_config) else: - user_id, agent_id, run_id, memory_type = self._get_step_memory_info( - memory_config) + user_id, agent_id, run_id, memory_type = self._get_step_memory_info(memory_config) + if idx < tools_num: - if any(value is not None for value in - [user_id, agent_id, run_id, memory_type]): + if any(v is not None for v in [user_id, agent_id, run_id, memory_type]): await self.memory_tools[idx].add( messages, user_id=user_id, agent_id=agent_id, run_id=run_id, - memory_type=memory_type) + memory_type=memory_type + ) def save_history(self, messages: List[Message], **kwargs): """ From 86f1cb0353e38485a7a7a94414c4e396a8beb875 Mon Sep 17 00:00:00 2001 From: suluyan Date: Fri, 9 Jan 2026 17:22:33 +0800 Subject: [PATCH 07/11] fix lint --- ms_agent/agent/llm_agent.py | 15 +++++++++------ ms_agent/memory/default_memory.py | 2 -- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/ms_agent/agent/llm_agent.py b/ms_agent/agent/llm_agent.py index 4305cfc08..6c45efe33 100644 --- a/ms_agent/agent/llm_agent.py +++ b/ms_agent/agent/llm_agent.py @@ -550,21 +550,24 @@ async def add_memory(self, messages: List[Message], add_type, **kwargs): if hasattr(self.config, 'memory') and self.config.memory: tools_num = len(self.memory_tools) if self.memory_tools else 0 - for idx, (mem_instance_type, memory_config) in enumerate(self.config.memory.items()): + for idx, (mem_instance_type, + memory_config) in enumerate(self.config.memory.items()): if add_type == 'add_after_task': - user_id, agent_id, run_id, memory_type = self._get_run_memory_info(memory_config) + user_id, agent_id, run_id, memory_type = self._get_run_memory_info( + memory_config) else: - user_id, agent_id, run_id, memory_type = self._get_step_memory_info(memory_config) + user_id, agent_id, run_id, memory_type = self._get_step_memory_info( + memory_config) if idx < tools_num: - if any(v is not None for v in [user_id, agent_id, run_id, memory_type]): + if any(v is not None + for v in [user_id, agent_id, run_id, memory_type]): await self.memory_tools[idx].add( messages, user_id=user_id, agent_id=agent_id, run_id=run_id, - memory_type=memory_type - ) + memory_type=memory_type) def save_history(self, messages: List[Message], **kwargs): """ diff --git a/ms_agent/memory/default_memory.py b/ms_agent/memory/default_memory.py index b179e1985..3308a5a84 100644 --- a/ms_agent/memory/default_memory.py +++ b/ms_agent/memory/default_memory.py @@ -569,8 +569,6 @@ async def run( query = self._get_latest_user_message(messages) if not query: return messages - if meta_infos is None: - meta_infos = [{'user_id': self.user_id}] async with self._lock: try: memories = self.search(query, meta_infos) From eb5eae6ab83de594a2540d6ce8e1b62ae11435f6 Mon Sep 17 00:00:00 2001 From: suluyan Date: Fri, 16 Jan 2026 12:22:46 +0800 Subject: [PATCH 08/11] fix mem0 milvus update & add_memory_after_task_early --- ms_agent/agent/llm_agent.py | 67 ++++++++++++++++++++++--------- ms_agent/memory/default_memory.py | 24 ++++++++++- 2 files changed, 70 insertions(+), 21 deletions(-) diff --git a/ms_agent/agent/llm_agent.py b/ms_agent/agent/llm_agent.py index fa0f74520..57df52224 100644 --- a/ms_agent/agent/llm_agent.py +++ b/ms_agent/agent/llm_agent.py @@ -340,8 +340,24 @@ async def load_memory(self): shared_memory = await SharedMemoryManager.get_shared_memory( self.config, mem_instance_type) + + ignore_roles = getattr(_memory, 'ignore_roles', []) + shared_memory.should_early_add_after_task = ( + 'assistant' in ignore_roles and 'tool' in ignore_roles) + shared_memory.early_add_after_task_done = False + self.memory_tools.append(shared_memory) + def _schedule_add_memory_after_task(self, messages, timestamp=None): + + def _add_memory(): + asyncio.run( + self.add_memory( + messages, add_type='add_after_task', timestamp=timestamp)) + + loop = asyncio.get_running_loop() + loop.run_in_executor(None, _add_memory) + async def prepare_rag(self): """Load and initialize the RAG component from the config.""" if hasattr(self.config, 'rag'): @@ -430,7 +446,6 @@ async def step( """ messages = deepcopy(messages) if (not self.load_cache) or messages[-1].role != 'assistant': - messages = await self.condense_memory(messages) await self.on_generate_response(messages) tools = await self.tool_manager.get_tools() @@ -551,26 +566,39 @@ def _get_run_memory_info(self, memory_config: DictConfig): async def add_memory(self, messages: List[Message], add_type, **kwargs): if hasattr(self.config, 'memory') and self.config.memory: - tools_num = len(self.memory_tools) if self.memory_tools else 0 - - for idx, (mem_instance_type, - memory_config) in enumerate(self.config.memory.items()): + for tool, (_, memory_config) in zip(self.memory_tools, + self.config.memory.items()): + timestamp = kwargs.get('timestamp', '') if add_type == 'add_after_task': user_id, agent_id, run_id, memory_type = self._get_run_memory_info( memory_config) + should_early = getattr(tool, 'should_early_add_after_task', + False) + early_done = getattr(tool, 'early_add_after_task_done', + False) + + if timestamp == 'early': + if not (should_early and not early_done): + # pass memory tool.run + continue + tool.early_add_after_task_done = True + else: + if early_done: + # pass memory tool.run + continue + else: user_id, agent_id, run_id, memory_type = self._get_step_memory_info( memory_config) - if idx < tools_num: - if any(v is not None - for v in [user_id, agent_id, run_id, memory_type]): - await self.memory_tools[idx].add( - messages, - user_id=user_id, - agent_id=agent_id, - run_id=run_id, - memory_type=memory_type) + if not any([user_id, agent_id, run_id, memory_type]): + continue + await tool.add( + messages, + user_id=user_id, + agent_id=agent_id, + run_id=run_id, + memory_type=memory_type) def save_history(self, messages: List[Message], **kwargs): """ @@ -632,6 +660,10 @@ async def run_loop(self, messages: Union[List[Message], str], self.log_output('[' + message.role + ']:') self.log_output(message.content) while not self.runtime.should_stop: + messages = await self.condense_memory(messages) + # If assistant and tool content can be ignored, add memory earlier to reduce running time. + self._schedule_add_memory_after_task( + messages, timestamp='early') async for messages in self.step(messages): yield messages self.runtime.round += 1 @@ -657,13 +689,8 @@ async def run_loop(self, messages: Union[List[Message], str], await self.cleanup_tools() yield messages - def _add_memory(): - asyncio.run( - self.add_memory( - messages, add_type='add_after_task', **kwargs)) + self._schedule_add_memory_after_task(messages) - loop = asyncio.get_running_loop() - loop.run_in_executor(None, _add_memory) except Exception as e: import traceback logger.warning(traceback.format_exc()) diff --git a/ms_agent/memory/default_memory.py b/ms_agent/memory/default_memory.py index 3308a5a84..8fa704363 100644 --- a/ms_agent/memory/default_memory.py +++ b/ms_agent/memory/default_memory.py @@ -588,8 +588,29 @@ def _init_memory_obj(self): f'Failed to import mem0: {e}. Please install mem0ai package via `pip install mem0ai`.' ) raise - + import mem0.vector_stores.milvus capture_event_origin = mem0.memory.main.capture_event + update_origin = mem0.vector_stores.milvus.MilvusDB.update + + @wraps(update_origin) + def update(self, vector_id=None, vector=None, payload=None): + """ + Update a vector and its payload. + + Args: + vector_id (str): ID of the vector to update. + vector (List[float], optional): Updated vector. + payload (Dict, optional): Updated payload. + """ + if vector is None: + res = self.client.get( + collection_name=self.collection_name, ids=[vector_id]) + if res: + vector = res[0]['vectors'] + + schema = {'id': vector_id, 'vectors': vector, 'metadata': payload} + self.client.upsert( + collection_name=self.collection_name, data=schema) @wraps(capture_event_origin) def patched_capture_event(event_name, @@ -597,6 +618,7 @@ def patched_capture_event(event_name, additional_data=None): pass + mem0.vector_stores.milvus.MilvusDB.update = update mem0.memory.main.capture_event = partial(patched_capture_event, ) # emb config From 6baa994b14f103cb4d6033e756760de9586c3894 Mon Sep 17 00:00:00 2001 From: suluyan Date: Fri, 6 Feb 2026 15:03:04 +0800 Subject: [PATCH 09/11] fix: video gen exclude edit_file --- projects/singularity_cinema/agent.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/projects/singularity_cinema/agent.yaml b/projects/singularity_cinema/agent.yaml index d171fc7fc..dc1756486 100644 --- a/projects/singularity_cinema/agent.yaml +++ b/projects/singularity_cinema/agent.yaml @@ -279,6 +279,7 @@ tools: mcp: false allow_read_all_files: true exclude: + - edit_file - list_files - search_file_content - search_file_name From 9a4cac83e312fb1dbdfde4e89c0ee6e41d421031 Mon Sep 17 00:00:00 2001 From: suluyan Date: Tue, 10 Feb 2026 17:07:34 +0800 Subject: [PATCH 10/11] fix memory manager key --- ms_agent/memory/memory_manager.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ms_agent/memory/memory_manager.py b/ms_agent/memory/memory_manager.py index 5a203505d..03333355b 100644 --- a/ms_agent/memory/memory_manager.py +++ b/ms_agent/memory/memory_manager.py @@ -4,7 +4,7 @@ from ms_agent.memory import Memory, memory_mapping from ms_agent.utils import get_logger from ms_agent.utils.constants import DEFAULT_OUTPUT_DIR, DEFAULT_USER -from omegaconf import DictConfig +from omegaconf import DictConfig, OmegaConf logger = get_logger() @@ -17,8 +17,8 @@ class SharedMemoryManager: async def get_shared_memory(cls, config: DictConfig, mem_instance_type: str) -> Memory: """Get or create a shared memory instance based on configuration.""" - user_id: str = getattr(config, 'user_id', DEFAULT_USER) - path: str = getattr(config, 'path', DEFAULT_OUTPUT_DIR) + user_id: str = getattr(getattr(config.memory, mem_instance_type, OmegaConf.create({})), 'user_id', DEFAULT_USER) + path: str = getattr(getattr(config.memory, mem_instance_type, OmegaConf.create({})), 'path', DEFAULT_OUTPUT_DIR) key = f'{mem_instance_type}_{user_id}_{path}' From 65da5293c053fa159d65ef608987f6bccb7b9889 Mon Sep 17 00:00:00 2001 From: suluyan Date: Thu, 12 Feb 2026 16:39:57 +0800 Subject: [PATCH 11/11] fix llm key --- ms_agent/memory/memory_manager.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/ms_agent/memory/memory_manager.py b/ms_agent/memory/memory_manager.py index 03333355b..8a142f777 100644 --- a/ms_agent/memory/memory_manager.py +++ b/ms_agent/memory/memory_manager.py @@ -17,10 +17,15 @@ class SharedMemoryManager: async def get_shared_memory(cls, config: DictConfig, mem_instance_type: str) -> Memory: """Get or create a shared memory instance based on configuration.""" - user_id: str = getattr(getattr(config.memory, mem_instance_type, OmegaConf.create({})), 'user_id', DEFAULT_USER) - path: str = getattr(getattr(config.memory, mem_instance_type, OmegaConf.create({})), 'path', DEFAULT_OUTPUT_DIR) - - key = f'{mem_instance_type}_{user_id}_{path}' + user_id: str = getattr( + getattr(config.memory, mem_instance_type, OmegaConf.create({})), + 'user_id', DEFAULT_USER) + path: str = getattr( + getattr(config.memory, mem_instance_type, OmegaConf.create({})), + 'path', DEFAULT_OUTPUT_DIR) + llm_str: str = getattr(config.llm, 'model', 'default_model') + + key = f'{mem_instance_type}_{user_id}_{llm_str}_{path}' if key not in cls._instances: logger.info(f'Creating new shared memory instance for key: {key}')