From 83d157689c5d1dc4a2a10d8176e81dff97e2b9c6 Mon Sep 17 00:00:00 2001 From: chentang Date: Thu, 18 Dec 2025 14:38:19 +0800 Subject: [PATCH 01/53] fix bugs: try to fix bugs in _submit_web_logs --- src/memos/mem_scheduler/base_scheduler.py | 37 ++++++++++------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/src/memos/mem_scheduler/base_scheduler.py b/src/memos/mem_scheduler/base_scheduler.py index 81defaa0f..9ab356f1d 100644 --- a/src/memos/mem_scheduler/base_scheduler.py +++ b/src/memos/mem_scheduler/base_scheduler.py @@ -846,28 +846,23 @@ def _submit_web_logs( f"[DIAGNOSTIC] base_scheduler._submit_web_logs called. Message to publish: {message.model_dump_json(indent=2)}" ) - if self.rabbitmq_config is None: - logger.info( - "[DIAGNOSTIC] base_scheduler._submit_web_logs: RabbitMQ config not loaded; skipping publish." - ) - return - - for message in messages: - message_info = message.debug_info() - logger.info(f"[DIAGNOSTIC] base_scheduler._submit_web_logs: submitted {message_info}") + try: + for message in messages: + # Always call publish; the publisher now caches when offline and flushes after reconnect + logger.info( + f"[DIAGNOSTIC] base_scheduler._submit_web_logs: enqueue publish {message.model_dump_json(indent=2)}" + ) + self.rabbitmq_publish_message(message=message.to_dict()) + logger.info( + "[DIAGNOSTIC] base_scheduler._submit_web_logs: publish dispatched " + "item_id=%s task_id=%s label=%s", + message.item_id, + message.task_id, + message.label, + ) + except Exception as e: + logger.error(f"[DIAGNOSTIC] base_scheduler._submit_web_logs failed: {e}", exc_info=True) - # Always call publish; the publisher now caches when offline and flushes after reconnect - logger.info( - f"[DIAGNOSTIC] base_scheduler._submit_web_logs: enqueue publish {message_info}" - ) - self.rabbitmq_publish_message(message=message.to_dict()) - logger.info( - "[DIAGNOSTIC] base_scheduler._submit_web_logs: publish dispatched " - "item_id=%s task_id=%s label=%s", - message.item_id, - message.task_id, - message.label, - ) logger.debug( f"{len(messages)} submitted. {self._web_log_message_queue.qsize()} in queue. additional_log_info: {additional_log_info}" ) From e50c56cf817cb6d63b8e8e882aeaa4de12c444b8 Mon Sep 17 00:00:00 2001 From: chentang Date: Thu, 18 Dec 2025 15:00:28 +0800 Subject: [PATCH 02/53] fix bugs: try to address bugs --- src/memos/mem_scheduler/base_scheduler.py | 13 +++++-------- .../webservice_modules/rabbitmq_service.py | 6 ++++-- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/memos/mem_scheduler/base_scheduler.py b/src/memos/mem_scheduler/base_scheduler.py index 9ab356f1d..1e0ecaadb 100644 --- a/src/memos/mem_scheduler/base_scheduler.py +++ b/src/memos/mem_scheduler/base_scheduler.py @@ -842,12 +842,7 @@ def _submit_web_logs( messages = [messages] # transform single message to list for message in messages: - logger.info( - f"[DIAGNOSTIC] base_scheduler._submit_web_logs called. Message to publish: {message.model_dump_json(indent=2)}" - ) - - try: - for message in messages: + try: # Always call publish; the publisher now caches when offline and flushes after reconnect logger.info( f"[DIAGNOSTIC] base_scheduler._submit_web_logs: enqueue publish {message.model_dump_json(indent=2)}" @@ -860,8 +855,10 @@ def _submit_web_logs( message.task_id, message.label, ) - except Exception as e: - logger.error(f"[DIAGNOSTIC] base_scheduler._submit_web_logs failed: {e}", exc_info=True) + except Exception as e: + logger.error( + f"[DIAGNOSTIC] base_scheduler._submit_web_logs failed: {e}", exc_info=True + ) logger.debug( f"{len(messages)} submitted. {self._web_log_message_queue.qsize()} in queue. additional_log_info: {additional_log_info}" diff --git a/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py b/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py index a8a09760c..db8320879 100644 --- a/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py +++ b/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py @@ -7,6 +7,8 @@ from pathlib import Path from queue import Empty +from pyglet.libs.win32.constants import FALSE + from memos.configs.mem_scheduler import AuthConfig, RabbitMQConfig from memos.context.context import ContextThread from memos.dependency import require_python_package @@ -325,14 +327,14 @@ def rabbitmq_publish_message(self, message: dict): f"[DIAGNOSTIC] Publishing {label} message in Cloud Env. " f"Exchange: {exchange_name}, Routing Key: '{routing_key}'." ) - logger.info(f" - Message Content: {json.dumps(message, indent=2)}") + logger.info(f" - Message Content: {json.dumps(message, indent=2, ensure_ascii=FALSE)}") elif label == "knowledgeBaseUpdate": # Original diagnostic logging for knowledgeBaseUpdate if NOT in cloud env logger.info( f"[DIAGNOSTIC] Publishing knowledgeBaseUpdate message (Local Env). " f"Current configured Exchange: {exchange_name}, Routing Key: '{routing_key}'." ) - logger.info(f" - Message Content: {json.dumps(message, indent=2)}") + logger.info(f" - Message Content: {json.dumps(message, indent=2, ensure_ascii=FALSE)}") with self._rabbitmq_lock: logger.info( From 58eb6b81af34437677e929e629f25dd3ddf0c1ff Mon Sep 17 00:00:00 2001 From: chentang Date: Thu, 18 Dec 2025 15:13:21 +0800 Subject: [PATCH 03/53] fix bugs --- .../mem_scheduler/webservice_modules/rabbitmq_service.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py b/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py index db8320879..43d24c5b9 100644 --- a/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py +++ b/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py @@ -7,8 +7,6 @@ from pathlib import Path from queue import Empty -from pyglet.libs.win32.constants import FALSE - from memos.configs.mem_scheduler import AuthConfig, RabbitMQConfig from memos.context.context import ContextThread from memos.dependency import require_python_package @@ -327,14 +325,14 @@ def rabbitmq_publish_message(self, message: dict): f"[DIAGNOSTIC] Publishing {label} message in Cloud Env. " f"Exchange: {exchange_name}, Routing Key: '{routing_key}'." ) - logger.info(f" - Message Content: {json.dumps(message, indent=2, ensure_ascii=FALSE)}") + logger.info(f" - Message Content: {json.dumps(message, indent=2, ensure_ascii=False)}") elif label == "knowledgeBaseUpdate": # Original diagnostic logging for knowledgeBaseUpdate if NOT in cloud env logger.info( f"[DIAGNOSTIC] Publishing knowledgeBaseUpdate message (Local Env). " f"Current configured Exchange: {exchange_name}, Routing Key: '{routing_key}'." ) - logger.info(f" - Message Content: {json.dumps(message, indent=2, ensure_ascii=FALSE)}") + logger.info(f" - Message Content: {json.dumps(message, indent=2, ensure_ascii=False)}") with self._rabbitmq_lock: logger.info( From 0d72ce7669f3a9b30aa6849893a0e6ec6f991063 Mon Sep 17 00:00:00 2001 From: chentang Date: Thu, 18 Dec 2025 15:59:20 +0800 Subject: [PATCH 04/53] refactor: modify examples --- examples/mem_scheduler/memos_w_scheduler.py | 40 --------------------- 1 file changed, 40 deletions(-) diff --git a/examples/mem_scheduler/memos_w_scheduler.py b/examples/mem_scheduler/memos_w_scheduler.py index 09aec4cba..ef7d853df 100644 --- a/examples/mem_scheduler/memos_w_scheduler.py +++ b/examples/mem_scheduler/memos_w_scheduler.py @@ -4,7 +4,6 @@ from datetime import datetime from pathlib import Path -from queue import Queue from memos.configs.mem_cube import GeneralMemCubeConfig from memos.configs.mem_os import MOSConfig @@ -12,7 +11,6 @@ from memos.log import get_logger from memos.mem_cube.general import GeneralMemCube from memos.mem_os.main import MOS -from memos.mem_scheduler.general_scheduler import GeneralScheduler from memos.mem_scheduler.schemas.message_schemas import ScheduleLogForWebItem from memos.mem_scheduler.schemas.task_schemas import ( ADD_TASK_LABEL, @@ -160,42 +158,6 @@ def _first_content() -> str: return title, _truncate_with_rules(_first_content()) -def show_web_logs(mem_scheduler: GeneralScheduler): - """Display all web log entries from the scheduler's log queue. - - Args: - mem_scheduler: The scheduler instance containing web logs to display - """ - if mem_scheduler._web_log_message_queue.empty(): - print("Web log queue is currently empty.") - return - - print("\n" + "=" * 50 + " WEB LOGS " + "=" * 50) - - # Create a temporary queue to preserve the original queue contents - temp_queue = Queue() - collected: list[ScheduleLogForWebItem] = [] - - while not mem_scheduler._web_log_message_queue.empty(): - log_item: ScheduleLogForWebItem = mem_scheduler._web_log_message_queue.get() - collected.append(log_item) - temp_queue.put(log_item) - - for idx, log_item in enumerate(sorted(collected, key=lambda x: x.timestamp, reverse=True), 1): - title, content = _format_entry(log_item) - print(f"\nLog Entry #{idx}:") - print(title) - print(content) - print("-" * 50) - - # Restore items back to the original queue - while not temp_queue.empty(): - mem_scheduler._web_log_message_queue.put(temp_queue.get()) - - print(f"\nTotal {len(collected)} web log entries displayed.") - print("=" * 110 + "\n") - - def run_with_scheduler_init(): print("==== run_with_automatic_scheduler_init ====") conversations, questions = init_task() @@ -253,8 +215,6 @@ def run_with_scheduler_init(): response = mos.chat(query=query, user_id=user_id) print(f"Answer:\n {response}\n") - show_web_logs(mem_scheduler=mos.mem_scheduler) - mos.mem_scheduler.stop() From 2fe965be240ea0e68c511b5573d88e9599b7cbd2 Mon Sep 17 00:00:00 2001 From: chentang Date: Thu, 18 Dec 2025 20:06:40 +0800 Subject: [PATCH 05/53] revise add operation and fix an unbelievable bug --- .../mem_scheduler/try_schedule_modules.py | 47 ------------------- src/memos/mem_reader/simple_struct.py | 2 +- .../webservice_modules/rabbitmq_service.py | 3 +- src/memos/templates/mem_reader_prompts.py | 39 ++++++++------- 4 files changed, 21 insertions(+), 70 deletions(-) diff --git a/examples/mem_scheduler/try_schedule_modules.py b/examples/mem_scheduler/try_schedule_modules.py index a5c5bc737..d942aad4e 100644 --- a/examples/mem_scheduler/try_schedule_modules.py +++ b/examples/mem_scheduler/try_schedule_modules.py @@ -1,8 +1,6 @@ import sys from pathlib import Path -from queue import Queue -from typing import TYPE_CHECKING from tqdm import tqdm @@ -11,18 +9,11 @@ ) from memos.log import get_logger from memos.mem_scheduler.analyzer.api_analyzer import DirectSearchMemoriesAnalyzer -from memos.mem_scheduler.base_scheduler import BaseScheduler from memos.mem_scheduler.optimized_scheduler import OptimizedScheduler from memos.mem_scheduler.schemas.message_schemas import ScheduleMessageItem from memos.mem_scheduler.schemas.task_schemas import MEM_UPDATE_TASK_LABEL -if TYPE_CHECKING: - from memos.mem_scheduler.schemas import ( - ScheduleLogForWebItem, - ) - - FILE_PATH = Path(__file__).absolute() BASE_DIR = FILE_PATH.parent.parent.parent sys.path.insert(0, str(BASE_DIR)) # Enable execution from any working directory @@ -105,41 +96,6 @@ def init_task(): return conversations, questions -def show_web_logs(mem_scheduler: BaseScheduler): - """Display all web log entries from the scheduler's log queue. - - Args: - mem_scheduler: The scheduler instance containing web logs to display - """ - if mem_scheduler._web_log_message_queue.empty(): - print("Web log queue is currently empty.") - return - - print("\n" + "=" * 50 + " WEB LOGS " + "=" * 50) - - # Create a temporary queue to preserve the original queue contents - temp_queue = Queue() - log_count = 0 - - while not mem_scheduler._web_log_message_queue.empty(): - log_item: ScheduleLogForWebItem = mem_scheduler._web_log_message_queue.get() - temp_queue.put(log_item) - log_count += 1 - - # Print log entry details - print(f"\nLog Entry #{log_count}:") - print(f'- "{log_item.label}" log: {log_item}') - - print("-" * 50) - - # Restore items back to the original queue - while not temp_queue.empty(): - mem_scheduler._web_log_message_queue.put(temp_queue.get()) - - print(f"\nTotal {log_count} web log entries displayed.") - print("=" * 110 + "\n") - - class ScheduleModulesRunner(DirectSearchMemoriesAnalyzer): def __init__(self): super().__init__() @@ -215,6 +171,3 @@ def add_msgs( mem_scheduler._memory_update_consumer( messages=[message], ) - - # Show accumulated web logs - show_web_logs(mem_scheduler) diff --git a/src/memos/mem_reader/simple_struct.py b/src/memos/mem_reader/simple_struct.py index ac79c246b..b870bf70a 100644 --- a/src/memos/mem_reader/simple_struct.py +++ b/src/memos/mem_reader/simple_struct.py @@ -522,7 +522,7 @@ def filter_hallucination_in_memories( raw = self.llm.generate([{"role": "user", "content": prompt}]) success, parsed = self._parse_hallucination_filter_response(raw) logger.info( - f"[filter_hallucination_in_memories] Hallucination filter parsed successfully: {success}" + f"[filter_hallucination_in_memories] Hallucination filter parsed successfully: {success};prompt: {prompt}" ) if success: logger.info(f"Hallucination filter result: {parsed}") diff --git a/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py b/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py index 43d24c5b9..46b2ad3d1 100644 --- a/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py +++ b/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py @@ -108,8 +108,7 @@ def initialize_rabbitmq( elif Path(config_path).exists(): auth_config = AuthConfig.from_local_config(config_path=config_path) else: - logger.error("Fail to initialize auth_config") - return + auth_config = AuthConfig.from_local_env() self.rabbitmq_config = auth_config.rabbitmq elif isinstance(config, RabbitMQConfig): self.rabbitmq_config = config diff --git a/src/memos/templates/mem_reader_prompts.py b/src/memos/templates/mem_reader_prompts.py index 12c445df7..fef3ee6c0 100644 --- a/src/memos/templates/mem_reader_prompts.py +++ b/src/memos/templates/mem_reader_prompts.py @@ -625,21 +625,20 @@ SIMPLE_STRUCT_HALLUCINATION_FILTER_PROMPT = """ You are a strict, language-preserving memory validator and rewriter. -Your task is to compare each memory against the provided user messages (the ground truth) and produce a corrected version only when necessary. Always preserve the original language of the memory—do not translate. +Your task is to eliminate hallucinations and tighten memories by grounding them strictly in the user’s explicit messages. Memories must be factual, unambiguous, and free of any inferred or speculative content. Rules: -1. **Language Consistency**: The rewritten memory must be in the exact same language as the original input memory. Never switch languages. -2. **Strict Grounding**: Only use information explicitly stated in the user messages. Do not introduce external facts, assumptions, or common sense. -3. **Ambiguity Resolution**: - - Replace vague pronouns (e.g., "he", "it", "they") or unclear references with specific, unambiguous entities based solely on the messages. - - Convert relative time expressions (e.g., "yesterday", "last week", "in two days") into absolute dates or times **only if the messages provide enough context** (e.g., current date is known or implied). -4. **Handling Assistant Inferences**: - - If a memory contains any content **not directly stated by the user**—such as interpretations, summaries, emotional attributions, predictions, causal claims, or generalizations—this is considered an assistant inference. - - In such cases, you **must** set `need_rewrite = true`. - - The `rewritten` text **must explicitly indicate that the statement is an inference**, using a clear and natural prefix in the memory’s language. For English memories, use: - > "The assistant inferred that [rest of the memory]." - - Do **not** present inferred content as factual user statements. -5. **No Rewrite Needed**: If the memory is factually accurate, fully grounded in the messages, unambiguous, and contains no unsupported content, set `need_rewrite = false` and copy the original memory exactly. +1. **Language Consistency**: Keep the exact original language of each memory—no translation or language switching. +2. **Strict Factual Grounding**: Include only what the user explicitly stated. Remove or flag anything not directly present in the messages—no assumptions, interpretations, predictions, emotional labels, summaries, or generalizations. +3. **Ambiguity Elimination**: + - Replace vague pronouns (e.g., “he”, “it”, “they”) with clear, specific entities **only if** the messages identify them. + - Convert relative time expressions (e.g., “yesterday”) to absolute dates **only if** the messages provide enough temporal context. +4. **Hallucination Removal**: + - If a memory contains **any content not verbatim or directly implied by the user**, it must be rewritten. + - Do **not** rephrase inferences as facts. Instead, either: + - Remove the unsupported part and retain only the grounded core, or + - If the entire memory is ungrounded, mark it for rewrite and make the lack of user support explicit. +5. **No Change if Fully Grounded**: If the memory is concise, unambiguous, and fully supported by the user’s messages, keep it unchanged. Inputs: messages: @@ -649,15 +648,15 @@ {memories_inline} Output Format: -- Return a JSON object with string keys ("0", "1", "2", ...) corresponding to the input memory indices. +- Return a JSON object with string keys ("0", "1", "2", ...) matching input memory indices. - Each value must be: {{ "need_rewrite": boolean, "rewritten": string, "reason": string }} -- The "reason" should be concise and specific, e.g.: - - "contains assistant inference not stated by user" - - "pronoun 'it' has no clear referent in messages" - - "relative time 'yesterday' converted to 2025-12-16" - - "accurate and directly supported by user message" +- The "reason" must be brief and precise, e.g.: + - "contains unsupported inference" + - "vague pronoun with no referent in messages" + - "relative time resolved to 2025-12-16" + - "fully grounded and concise" -Important: Output **only** the JSON. No additional text, explanations, markdown, or fields. +Important: Output **only** the JSON. No extra text, explanations, markdown, or fields. """ From eecfa5136d9065fefd82867068a8deb12efae8a2 Mon Sep 17 00:00:00 2001 From: chentang Date: Mon, 22 Dec 2025 10:37:34 +0800 Subject: [PATCH 06/53] address the bug issues --- .../task_schedule_modules/redis_queue.py | 38 +++++++++---------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py b/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py index ed8171ade..1c57f18f0 100644 --- a/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py +++ b/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py @@ -699,27 +699,23 @@ def _batch_claim_pending_messages( results = [] try: results = pipe.execute() - except Exception as e: - err_msg = str(e).lower() - if "nogroup" in err_msg or "no such key" in err_msg: - # Fallback: attempt sequential xautoclaim for robustness - for stream_key, need_count, label in claims_spec: - try: - self._ensure_consumer_group(stream_key=stream_key) - res = self._redis_conn.xautoclaim( - name=stream_key, - groupname=self.consumer_group, - consumername=self.consumer_name, - min_idle_time=self.orchestrator.get_task_idle_min(task_label=label), - start_id="0-0", - count=need_count, - justid=False, - ) - results.append(res) - except Exception: - continue - else: - logger.error(f"Pipeline xautoclaim failed: {e}") + except Exception: + # Fallback: attempt sequential xautoclaim for robustness + for stream_key, need_count, label in claims_spec: + try: + self._ensure_consumer_group(stream_key=stream_key) + res = self._redis_conn.xautoclaim( + name=stream_key, + groupname=self.consumer_group, + consumername=self.consumer_name, + min_idle_time=self.orchestrator.get_task_idle_min(task_label=label), + start_id="0-0", + count=need_count, + justid=False, + ) + results.append(res) + except Exception: + continue claimed_pairs: list[tuple[str, list[tuple[str, dict]]]] = [] for (stream_key, _need_count, _label), claimed_result in zip( From f2da3a7bd718cf663b29fb285e602e847f4dc91a Mon Sep 17 00:00:00 2001 From: chentang Date: Wed, 24 Dec 2025 19:35:40 +0800 Subject: [PATCH 07/53] the doc file has a format problem which has been fixed in this commit --- docs/README.md | 2 +- .../{task_stop_rerun.py => scheduler_for_async_tasks.py} | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) rename examples/mem_scheduler/{task_stop_rerun.py => scheduler_for_async_tasks.py} (98%) diff --git a/docs/README.md b/docs/README.md index bf5fea70d..8be17ffb7 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,3 +1,3 @@ All documentation has been moved to a separate repository: https://github.com/MemTensor/MemOS-Docs. Please edit documentation there. -所有文档已迁移至独立仓库:https://github.com/MemTensor/MemOS-Docs。请在该仓库中编辑文档。 +所有文档已迁移至独立仓库 https://github.com/MemTensor/MemOS-Docs 。请在该仓库中编辑文档。 diff --git a/examples/mem_scheduler/task_stop_rerun.py b/examples/mem_scheduler/scheduler_for_async_tasks.py similarity index 98% rename from examples/mem_scheduler/task_stop_rerun.py rename to examples/mem_scheduler/scheduler_for_async_tasks.py index b5e62ff8f..a767b57c4 100644 --- a/examples/mem_scheduler/task_stop_rerun.py +++ b/examples/mem_scheduler/scheduler_for_async_tasks.py @@ -25,7 +25,7 @@ def my_test_handler(messages: list[ScheduleMessageItem]): task_id = str(msg.item_id) file_path = tmp_dir / f"{task_id}.txt" try: - sleep(1) + sleep(5) file_path.write_text(f"Task {task_id} processed.\n") print(f"writing {file_path} done") except Exception as e: @@ -58,7 +58,7 @@ def submit_tasks(): mem_scheduler.register_handlers({TEST_HANDLER_LABEL: my_test_handler}) # 10s to restart -mem_scheduler.orchestrator.tasks_min_idle_ms[TEST_HANDLER_LABEL] = 10_000 +mem_scheduler.orchestrator.tasks_min_idle_ms[TEST_HANDLER_LABEL] = 5_000 tmp_dir = Path("./tmp") tmp_dir.mkdir(exist_ok=True) @@ -88,6 +88,6 @@ def submit_tasks(): print(f"[Result] Final files in tmp: {len(list(tmp_dir.glob('*.txt')))})") # 7. Stop the scheduler +sleep(20) print("Stopping the scheduler...") -sleep(5) mem_scheduler.stop() From a6881b4b064145f032c9b9e58ed0f9772ef33612 Mon Sep 17 00:00:00 2001 From: chentang Date: Wed, 24 Dec 2025 19:45:48 +0800 Subject: [PATCH 08/53] add a range of new feats for the add operation --- src/memos/api/config.py | 21 +- src/memos/llms/openai.py | 6 +- src/memos/mem_reader/simple_struct.py | 354 ++++++++++-------- src/memos/mem_reader/utils.py | 210 +++++++++++ .../mem_scheduler/schemas/general_schemas.py | 4 +- .../task_schedule_modules/redis_queue.py | 69 ++-- .../textual/prefer_text_memory/extractor.py | 4 + src/memos/templates/mem_reader_prompts.py | 156 +++++++- 8 files changed, 624 insertions(+), 200 deletions(-) create mode 100644 src/memos/mem_reader/utils.py diff --git a/src/memos/api/config.py b/src/memos/api/config.py index b795c2be6..0cdcb9a92 100644 --- a/src/memos/api/config.py +++ b/src/memos/api/config.py @@ -7,16 +7,19 @@ import re import time -from typing import Any +from typing import TYPE_CHECKING, Any import requests from dotenv import load_dotenv -from memos.configs.mem_cube import GeneralMemCubeConfig -from memos.configs.mem_os import MOSConfig from memos.context.context import ContextThread -from memos.mem_cube.general import GeneralMemCube + + +if TYPE_CHECKING: + from memos.configs.mem_cube import GeneralMemCubeConfig + from memos.configs.mem_os import MOSConfig + from memos.mem_cube.general import GeneralMemCube # Load environment variables @@ -805,8 +808,12 @@ def get_start_default_config() -> dict[str, Any]: return config @staticmethod - def create_user_config(user_name: str, user_id: str) -> tuple[MOSConfig, GeneralMemCube]: + def create_user_config(user_name: str, user_id: str) -> tuple["MOSConfig", "GeneralMemCube"]: """Create configuration for a specific user.""" + from memos.configs.mem_cube import GeneralMemCubeConfig + from memos.configs.mem_os import MOSConfig + from memos.mem_cube.general import GeneralMemCube + openai_config = APIConfig.get_openai_config() qwen_config = APIConfig.qwen_config() vllm_config = APIConfig.vllm_config() @@ -933,12 +940,14 @@ def create_user_config(user_name: str, user_id: str) -> tuple[MOSConfig, General return default_config, default_mem_cube @staticmethod - def get_default_cube_config() -> GeneralMemCubeConfig | None: + def get_default_cube_config() -> "GeneralMemCubeConfig | None": """Get default cube configuration for product initialization. Returns: GeneralMemCubeConfig | None: Default cube configuration if enabled, None otherwise. """ + from memos.configs.mem_cube import GeneralMemCubeConfig + if not APIConfig.is_default_cube_config_enabled(): return None diff --git a/src/memos/llms/openai.py b/src/memos/llms/openai.py index 1d180eebd..752386c91 100644 --- a/src/memos/llms/openai.py +++ b/src/memos/llms/openai.py @@ -57,8 +57,8 @@ def generate(self, messages: MessageList, **kwargs) -> str: if self.config.remove_think_prefix: return remove_thinking_tags(response_content) if reasoning_content: - return reasoning_content + response_content - return response_content + return reasoning_content + (response_content or "") + return response_content or "" @timed_with_status( log_prefix="OpenAI LLM", @@ -146,7 +146,7 @@ def generate(self, messages: MessageList, **kwargs) -> str: if self.config.remove_think_prefix: return remove_thinking_tags(response_content) else: - return response_content + return response_content or "" def generate_stream(self, messages: MessageList, **kwargs) -> Generator[str, None, None]: """Stream response from Azure OpenAI LLM with optional reasoning support.""" diff --git a/src/memos/mem_reader/simple_struct.py b/src/memos/mem_reader/simple_struct.py index b870bf70a..866b6d988 100644 --- a/src/memos/mem_reader/simple_struct.py +++ b/src/memos/mem_reader/simple_struct.py @@ -2,7 +2,6 @@ import copy import json import os -import re import traceback from abc import ABC @@ -18,6 +17,13 @@ from memos.llms.factory import LLMFactory from memos.mem_reader.base import BaseMemReader from memos.mem_reader.read_multi_modal import coerce_scene_data, detect_lang +from memos.mem_reader.utils import ( + count_tokens_text, + derive_key, + parse_json_result, + parse_keep_filter_response, + parse_rewritten_response, +) from memos.memories.textual.item import ( SourceMessage, TextualMemoryItem, @@ -89,27 +95,6 @@ def from_config(_config): } -try: - import tiktoken - - try: - _ENC = tiktoken.encoding_for_model("gpt-4o-mini") - except Exception: - _ENC = tiktoken.get_encoding("cl100k_base") - - def _count_tokens_text(s: str) -> int: - return len(_ENC.encode(s or "", disallowed_special=())) -except Exception: - # Heuristic fallback: zh chars ~1 token, others ~1 token per ~4 chars - def _count_tokens_text(s: str) -> int: - if not s: - return 0 - zh_chars = re.findall(r"[\u4e00-\u9fff]", s) - zh = len(zh_chars) - rest = len(s) - zh - return zh + max(1, rest // 4) - - def _build_node(idx, message, info, source_info, llm, parse_json_result, embedder): # generate try: @@ -172,14 +157,6 @@ def _build_node(idx, message, info, source_info, llm, parse_json_result, embedde return None -def _derive_key(text: str, max_len: int = 80) -> str: - """default key when without LLM: first max_len words""" - if not text: - return "" - sent = re.split(r"[。!?!?]\s*|\n", text.strip())[0] - return (sent[:max_len]).strip() - - class SimpleStructMemReader(BaseMemReader, ABC): """Naive implementation of MemReader.""" @@ -197,7 +174,8 @@ def __init__(self, config: SimpleStructMemReaderConfig): self.memory_max_length = 8000 # Use token-based windowing; default to ~5000 tokens if not configured self.chat_window_max_tokens = getattr(self.config, "chat_window_max_tokens", 1024) - self._count_tokens = _count_tokens_text + self._count_tokens = count_tokens_text + self.searcher = None def _make_memory_item( self, @@ -224,7 +202,7 @@ def _make_memory_item( memory_type=memory_type, status="activated", tags=tags or [], - key=key if key is not None else _derive_key(value), + key=key if key is not None else derive_key(value), embedding=self.embedder.embed([value])[0], usage=[], sources=sources or [], @@ -254,7 +232,7 @@ def _get_llm_response(self, mem_str: str, custom_tags: list[str] | None) -> dict messages = [{"role": "user", "content": prompt}] try: response_text = self.llm.generate(messages) - response_json = self.parse_json_result(response_text) + response_json = parse_json_result(response_text) except Exception as e: logger.error(f"[LLM] Exception during chat generation: {e}") response_json = { @@ -456,47 +434,73 @@ def get_memory( standard_scene_data = coerce_scene_data(scene_data, type) return self._read_memory(standard_scene_data, type, info, mode) - @staticmethod - def _parse_hallucination_filter_response(text: str) -> tuple[bool, dict[int, dict]]: - """Parse index-keyed JSON from hallucination filter response. - Expected shape: { "0": {"need_rewrite": bool, "rewritten": str, "reason": str}, ... } - Returns (success, parsed_dict) with int keys. - """ + def rewrite_memories( + self, messages: list[dict], memory_list: list[TextualMemoryItem], user_only: bool = True + ) -> list[TextualMemoryItem]: + # Build input objects with memory text and metadata (timestamps, sources, etc.) + if user_only: + template = PROMPT_MAPPING["rewrite_user_only"] + filtered_messages = [m for m in messages if m.get("role") != "assistant"] + if len(filtered_messages) < 1: + return memory_list + else: + template = PROMPT_MAPPING["rewrite"] + filtered_messages = messages + if len(filtered_messages) < 2: + return memory_list + + prompt_args = { + "messages_inline": "\n".join( + [f"- [{message['role']}]: {message['content']}" for message in filtered_messages] + ), + "memories_inline": json.dumps( + {idx: mem.memory for idx, mem in enumerate(memory_list)}, + ensure_ascii=False, + indent=2, + ), + } + prompt = template.format(**prompt_args) + + # Optionally run filter and parse the output try: - data = json.loads(text) - except Exception: - return False, {} + raw = self.llm.generate([{"role": "user", "content": prompt}]) + success, parsed = parse_rewritten_response(raw) + logger.info( + f"[rewrite_memories] Hallucination filter parsed successfully: {success};prompt: {prompt}" + ) + if success: + logger.info(f"Rewrite filter result: {parsed}") - if not isinstance(data, dict): - return False, {} + new_memory_list = [] + for mem_idx, content in parsed.items(): + if mem_idx < 0 or mem_idx >= len(memory_list): + logger.warning( + f"[rewrite_memories] Invalid memory index {mem_idx} for memory_list {len(memory_list)}, skipping." + ) + continue - result: dict[int, dict] = {} - for k, v in data.items(): - try: - idx = int(k) - except Exception: - # allow integer keys as-is - if isinstance(k, int): - idx = k - else: - continue - if not isinstance(v, dict): - continue - need_rewrite = v.get("need_rewrite") - rewritten = v.get("rewritten", "") - reason = v.get("reason", "") - if ( - isinstance(need_rewrite, bool) - and isinstance(rewritten, str) - and isinstance(reason, str) - ): - result[idx] = { - "need_rewrite": need_rewrite, - "rewritten": rewritten, - "reason": reason, - } + need_rewrite = content.get("need_rewrite", False) + rewritten_text = content.get("rewritten", "") + reason = content.get("reason", "") + original_text = memory_list[mem_idx].memory + + # Replace memory text with rewritten content when rewrite is needed + if need_rewrite and isinstance(rewritten_text, str): + logger.info( + f"[rewrite_memories] index={mem_idx}, need_rewrite={need_rewrite}, rewritten='{rewritten_text}', reason='{reason}', original memory='{original_text}', action='replace_text'" + ) + if len(rewritten_text.strip()) != 0: + memory_list[mem_idx].memory = rewritten_text + new_memory_list.append(memory_list[mem_idx]) + else: + new_memory_list.append(memory_list[mem_idx]) + return new_memory_list + else: + logger.warning("Rewrite filter parsing failed or returned empty result.") + except Exception as e: + logger.error(f"Rewrite filter execution error: {e}", stack_info=True) - return (len(result) > 0), result + return memory_list def filter_hallucination_in_memories( self, messages: list[dict], memory_list: list[TextualMemoryItem] @@ -520,32 +524,32 @@ def filter_hallucination_in_memories( # Optionally run filter and parse the output try: raw = self.llm.generate([{"role": "user", "content": prompt}]) - success, parsed = self._parse_hallucination_filter_response(raw) + success, parsed = parse_keep_filter_response(raw) logger.info( f"[filter_hallucination_in_memories] Hallucination filter parsed successfully: {success};prompt: {prompt}" ) if success: logger.info(f"Hallucination filter result: {parsed}") - assert len(parsed) == len(memory_list) - for mem_idx, content in parsed.items(): - need_rewrite = content.get("need_rewrite", False) - rewritten_text = content.get("rewritten", "") - reason = content.get("reason", "") - # Replace memory text with rewritten content when rewrite is needed - if ( - need_rewrite - and isinstance(rewritten_text, str) - and len(rewritten_text.strip()) > 0 - ): - original_text = memory_list[mem_idx].memory + filtered_list = [] + for mem_idx, mem in enumerate(memory_list): + content = parsed.get(mem_idx) + if not content: + logger.warning(f"No verdict for memory {mem_idx}, keeping it.") + filtered_list.append(mem) + continue + keep = content.get("keep", True) + reason = content.get("reason", "") + + if keep: + filtered_list.append(mem) + else: logger.info( - f"[filter_hallucination_in_memories] index={mem_idx}, need_rewrite={need_rewrite}, rewritten='{rewritten_text}', reason='{reason}', original memory='{original_text}', action='replace_text'" + f"[filter_hallucination_in_memories] Dropping memory index={mem_idx}, reason='{reason}', memory='{mem.memory}'" ) - memory_list[mem_idx].memory = rewritten_text - return memory_list + return filtered_list else: logger.warning("Hallucination filter parsing failed or returned empty result.") except Exception as e: @@ -553,6 +557,103 @@ def filter_hallucination_in_memories( return memory_list + def add_before_search( + self, + messages: list[dict], + memory_list: list[TextualMemoryItem], + ) -> list[TextualMemoryItem]: + # Build input objects with memory text and metadata (timestamps, sources, etc.) + template = PROMPT_MAPPING["add_before_search"] + + if not self.searcher: + try: + from memos.mem_reader.utils import init_searcher + + self.searcher = init_searcher(self.llm, self.embedder) + except Exception as e: + logger.error(f"[add_before_search] Failed to init searcher: {e}") + return memory_list + + # 1. Gather candidates and search for related memories + candidates_data = [] + for idx, mem in enumerate(memory_list): + try: + related_memories = self.searcher.search( + query=mem.memory, top_k=3, mode="fast", info={"user_id": "", "session_id": ""} + ) + related_text = "None" + if related_memories: + related_text = "\n".join([f"- {r.memory}" for r in related_memories]) + + candidates_data.append( + {"idx": idx, "new_memory": mem.memory, "related_memories": related_text} + ) + except Exception as e: + logger.error(f"[add_before_search] Search error for memory '{mem.memory}': {e}") + # If search fails, we can either skip this check or treat related as empty + candidates_data.append( + { + "idx": idx, + "new_memory": mem.memory, + "related_memories": "None (Search Failed)", + } + ) + + if not candidates_data: + return memory_list + + # 2. Build Prompt + messages_inline = "\n".join( + [ + f"- [{message.get('role', 'unknown')}]: {message.get('content', '')}" + for message in messages + ] + ) + + candidates_inline_dict = { + str(item["idx"]): { + "new_memory": item["new_memory"], + "related_memories": item["related_memories"], + } + for item in candidates_data + } + + candidates_inline = json.dumps(candidates_inline_dict, ensure_ascii=False, indent=2) + + prompt = template.format( + messages_inline=messages_inline, candidates_inline=candidates_inline + ) + + # 3. Call LLM + try: + raw = self.llm.generate([{"role": "user", "content": prompt}]) + success, parsed_result = parse_keep_filter_response(raw) + + if not success: + logger.warning("[add_before_search] Failed to parse LLM response, keeping all.") + return memory_list + + # 4. Filter + filtered_list = [] + for idx, mem in enumerate(memory_list): + res = parsed_result.get(idx) + if not res: + filtered_list.append(mem) + continue + + if res.get("keep", True): + filtered_list.append(mem) + else: + logger.info( + f"[add_before_search] Dropping memory: '{mem.memory}', reason: '{res.get('reason')}'" + ) + + return filtered_list + + except Exception as e: + logger.error(f"[add_before_search] LLM execution error: {e}") + return memory_list + def _read_memory( self, messages: list[MessagesType], type: str, info: dict[str, Any], mode: str = "fine" ) -> list[list[TextualMemoryItem]]: @@ -606,29 +707,27 @@ def _read_memory( for group_id in range(len(memory_list)): try: - revised_memory_list = self.filter_hallucination_in_memories( + original_memory_group = copy.deepcopy(memory_list[group_id]) + serialized_origin_memories = json.dumps( + [one.memory for one in original_memory_group], indent=2 + ) + revised_memory_list = self.rewrite_memories( messages=combined_messages, - memory_list=memory_list[group_id], + memory_list=original_memory_group, + user_only=os.getenv("SIMPLE_STRUCT_REWRITE_USER_ONLY", "true").lower() + == "true", + ) + serialized_revised_memories = json.dumps( + [one.memory for one in revised_memory_list], indent=2 ) - if len(revised_memory_list) != len(memory_list[group_id]): - original_serialized = [ - one.memory if hasattr(one, "memory") else str(one) - for one in memory_list[group_id] - ] - filtered_serialized = [ - one.memory if hasattr(one, "memory") else str(one) - for one in revised_memory_list - ] - logger.error( - f"Length mismatch after hallucination filtering for group_id={group_id}: " - f"original={len(memory_list[group_id])}, filtered={len(revised_memory_list)}" - f"\noriginal_memory_list(serialized): {original_serialized}" - f"\nfiltered_memory_list(serialized): {filtered_serialized}" - f"\nmessages: {combined_messages}" - f"\nSkipping update and keeping original memory." + if serialized_origin_memories != serialized_revised_memories: + memory_list[group_id] = revised_memory_list + logger.info( + f"[SIMPLE_STRUCT_ADD_FILTER] Modified the list for group_id={group_id}: " + f"\noriginal={serialized_origin_memories}," + f"\nrevised={serialized_revised_memories}" ) - continue - memory_list[group_id] = revised_memory_list + except Exception as e: group_serialized = [ one.memory if hasattr(one, "memory") else str(one) @@ -847,7 +946,7 @@ def _process_doc_data(self, scene_data_info, info, **kwargs): info, source_info_list, self.llm, - self.parse_json_result, + parse_json_result, self.embedder, ): idx for idx, msg in enumerate(messages) @@ -870,44 +969,3 @@ def _process_transfer_doc_data( self, raw_node: TextualMemoryItem, custom_tags: list[str] | None = None ): raise NotImplementedError - - def parse_json_result(self, response_text: str) -> dict: - s = (response_text or "").strip() - - m = re.search(r"```(?:json)?\s*([\s\S]*?)```", s, flags=re.I) - s = (m.group(1) if m else s.replace("```", "")).strip() - - i = s.find("{") - if i == -1: - return {} - s = s[i:].strip() - - try: - return json.loads(s) - except json.JSONDecodeError: - pass - - j = max(s.rfind("}"), s.rfind("]")) - if j != -1: - try: - return json.loads(s[: j + 1]) - except json.JSONDecodeError: - pass - - def _cheap_close(t: str) -> str: - t += "}" * max(0, t.count("{") - t.count("}")) - t += "]" * max(0, t.count("[") - t.count("]")) - return t - - t = _cheap_close(s) - try: - return json.loads(t) - except json.JSONDecodeError as e: - if "Invalid \\escape" in str(e): - s = s.replace("\\", "\\\\") - return json.loads(s) - logger.error( - f"[JSONParse] Failed to decode JSON: {e}\nTail: Raw {response_text} \ - json: {s}" - ) - return {} diff --git a/src/memos/mem_reader/utils.py b/src/memos/mem_reader/utils.py new file mode 100644 index 000000000..843345ec4 --- /dev/null +++ b/src/memos/mem_reader/utils.py @@ -0,0 +1,210 @@ +import json +import os +import re + +from typing import Any + +from memos import log +from memos.api.config import APIConfig +from memos.configs.graph_db import GraphDBConfigFactory +from memos.configs.reranker import RerankerConfigFactory +from memos.graph_dbs.factory import GraphStoreFactory +from memos.memories.textual.tree_text_memory.retrieve.searcher import Searcher +from memos.reranker.factory import RerankerFactory + + +logger = log.get_logger(__name__) + +try: + import tiktoken + + try: + _ENC = tiktoken.encoding_for_model("gpt-4o-mini") + except Exception: + _ENC = tiktoken.get_encoding("cl100k_base") + + def count_tokens_text(s: str) -> int: + return len(_ENC.encode(s or "", disallowed_special=())) +except Exception: + # Heuristic fallback: zh chars ~1 token, others ~1 token per ~4 chars + def count_tokens_text(s: str) -> int: + if not s: + return 0 + zh_chars = re.findall(r"[\u4e00-\u9fff]", s) + zh = len(zh_chars) + rest = len(s) - zh + return zh + max(1, rest // 4) + + +def derive_key(text: str, max_len: int = 80) -> str: + """default key when without LLM: first max_len words""" + if not text: + return "" + sent = re.split(r"[。!?!?]\s*|\n", text.strip())[0] + return (sent[:max_len]).strip() + + +def parse_json_result(response_text: str) -> dict: + s = (response_text or "").strip() + + m = re.search(r"```(?:json)?\s*([\s\S]*?)```", s, flags=re.I) + s = (m.group(1) if m else s.replace("```", "")).strip() + + i = s.find("{") + if i == -1: + return {} + s = s[i:].strip() + + try: + return json.loads(s) + except json.JSONDecodeError: + pass + + j = max(s.rfind("}"), s.rfind("]")) + if j != -1: + try: + return json.loads(s[: j + 1]) + except json.JSONDecodeError: + pass + + def _cheap_close(t: str) -> str: + t += "}" * max(0, t.count("{") - t.count("}")) + t += "]" * max(0, t.count("[") - t.count("]")) + return t + + t = _cheap_close(s) + try: + return json.loads(t) + except json.JSONDecodeError as e: + if "Invalid \\escape" in str(e): + s = s.replace("\\", "\\\\") + return json.loads(s) + logger.error( + f"[JSONParse] Failed to decode JSON: {e}\nTail: Raw {response_text} \ + json: {s}" + ) + return {} + + +def parse_rewritten_response(text: str) -> tuple[bool, dict[int, dict]]: + """Parse index-keyed JSON from hallucination filter response. + Expected shape: { "0": {"need_rewrite": bool, "rewritten": str, "reason": str}, ... } + Returns (success, parsed_dict) with int keys. + """ + try: + m = re.search(r"```(?:json)?\s*([\s\S]*?)```", text, flags=re.I) + s = (m.group(1) if m else text).strip() + data = json.loads(s) + except Exception: + return False, {} + + if not isinstance(data, dict): + return False, {} + + result: dict[int, dict] = {} + for k, v in data.items(): + try: + idx = int(k) + except Exception: + # allow integer keys as-is + if isinstance(k, int): + idx = k + else: + continue + if not isinstance(v, dict): + continue + need_rewrite = v.get("need_rewrite") + rewritten = v.get("rewritten", "") + reason = v.get("reason", "") + if ( + isinstance(need_rewrite, bool) + and isinstance(rewritten, str) + and isinstance(reason, str) + ): + result[idx] = { + "need_rewrite": need_rewrite, + "rewritten": rewritten, + "reason": reason, + } + + return (len(result) > 0), result + + +def parse_keep_filter_response(text: str) -> tuple[bool, dict[int, dict]]: + """Parse index-keyed JSON from keep filter response. + Expected shape: { "0": {"keep": bool, "reason": str}, ... } + Returns (success, parsed_dict) with int keys. + """ + try: + m = re.search(r"```(?:json)?\s*([\s\S]*?)```", text, flags=re.I) + s = (m.group(1) if m else text).strip() + data = json.loads(s) + except Exception: + return False, {} + + if not isinstance(data, dict): + return False, {} + + result: dict[int, dict] = {} + for k, v in data.items(): + try: + idx = int(k) + except Exception: + if isinstance(k, int): + idx = k + else: + continue + if not isinstance(v, dict): + continue + keep = v.get("keep") + reason = v.get("reason", "") + if isinstance(keep, bool): + result[idx] = { + "keep": keep, + "reason": reason, + } + return (len(result) > 0), result + + +def build_graph_db_config(user_id: str = "default") -> dict[str, Any]: + graph_db_backend_map = { + "neo4j-community": APIConfig.get_neo4j_community_config(user_id=user_id), + "neo4j": APIConfig.get_neo4j_config(user_id=user_id), + "nebular": APIConfig.get_nebular_config(user_id=user_id), + "polardb": APIConfig.get_polardb_config(user_id=user_id), + } + + graph_db_backend = os.getenv("NEO4J_BACKEND", "nebular").lower() + return GraphDBConfigFactory.model_validate( + { + "backend": graph_db_backend, + "config": graph_db_backend_map[graph_db_backend], + } + ) + + +def build_reranker_config() -> dict[str, Any]: + return RerankerConfigFactory.model_validate(APIConfig.get_reranker_config()) + + +def init_searcher(llm, embedder) -> Searcher: + """Initialize a Searcher instance for SimpleStructMemReader.""" + + # Build configs + graph_db_config = build_graph_db_config() + reranker_config = build_reranker_config() + + # Create instances + graph_db = GraphStoreFactory.from_config(graph_db_config) + reranker = RerankerFactory.from_config(reranker_config) + + # Create Searcher + searcher = Searcher( + dispatcher_llm=llm, + graph_store=graph_db, + embedder=embedder, + reranker=reranker, + manual_close_internet=os.getenv("ENABLE_INTERNET", "true").lower() == "false", + ) + + return searcher diff --git a/src/memos/mem_scheduler/schemas/general_schemas.py b/src/memos/mem_scheduler/schemas/general_schemas.py index f4ad9fe48..06910ba17 100644 --- a/src/memos/mem_scheduler/schemas/general_schemas.py +++ b/src/memos/mem_scheduler/schemas/general_schemas.py @@ -1,3 +1,5 @@ +import os + from pathlib import Path @@ -21,7 +23,7 @@ DEFAULT_MAX_INTERNAL_MESSAGE_QUEUE_SIZE = -1 DEFAULT_TOP_K = 5 DEFAULT_CONTEXT_WINDOW_SIZE = 5 -DEFAULT_USE_REDIS_QUEUE = True +DEFAULT_USE_REDIS_QUEUE = os.getenv("MEMSCHEDULER_USE_REDIS_QUEUE", "False").lower() == "true" DEFAULT_MULTI_TASK_RUNNING_TIMEOUT = 30 DEFAULT_SCHEDULER_RETRIEVER_BATCH_SIZE = 20 DEFAULT_SCHEDULER_RETRIEVER_RETRIES = 1 diff --git a/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py b/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py index 1c57f18f0..7923b3750 100644 --- a/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py +++ b/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py @@ -679,11 +679,6 @@ def _batch_claim_pending_messages( if not self._redis_conn or not claims_spec: return [] - # Ensure consumer groups exist to avoid NOGROUP errors during batch claim - for stream_key, _need_count, _label in claims_spec: - with contextlib.suppress(Exception): - self._ensure_consumer_group(stream_key=stream_key) - pipe = self._redis_conn.pipeline(transaction=False) for stream_key, need_count, label in claims_spec: pipe.xautoclaim( @@ -696,26 +691,42 @@ def _batch_claim_pending_messages( justid=False, ) - results = [] try: - results = pipe.execute() - except Exception: - # Fallback: attempt sequential xautoclaim for robustness - for stream_key, need_count, label in claims_spec: - try: - self._ensure_consumer_group(stream_key=stream_key) - res = self._redis_conn.xautoclaim( - name=stream_key, - groupname=self.consumer_group, - consumername=self.consumer_name, - min_idle_time=self.orchestrator.get_task_idle_min(task_label=label), - start_id="0-0", - count=need_count, - justid=False, - ) - results.append(res) - except Exception: - continue + # Execute with raise_on_error=False so we get exceptions in the results list + # instead of aborting the whole batch. + results = pipe.execute(raise_on_error=False) + except Exception as e: + logger.error(f"Pipeline execution critical failure: {e}") + results = [e] * len(claims_spec) + + # Handle individual failures (e.g. NOGROUP) by retrying just that stream + final_results = [] + for i, res in enumerate(results): + if isinstance(res, Exception): + err_msg = str(res).lower() + if "nogroup" in err_msg or "no such key" in err_msg: + stream_key, need_count, label = claims_spec[i] + try: + self._ensure_consumer_group(stream_key=stream_key) + retry_res = self._redis_conn.xautoclaim( + name=stream_key, + groupname=self.consumer_group, + consumername=self.consumer_name, + min_idle_time=self.orchestrator.get_task_idle_min(task_label=label), + start_id="0-0", + count=need_count, + justid=False, + ) + final_results.append(retry_res) + except Exception as retry_err: + logger.warning(f"Retry xautoclaim failed for {stream_key}: {retry_err}") + final_results.append(None) + else: + final_results.append(None) + else: + final_results.append(res) + + results = final_results claimed_pairs: list[tuple[str, list[tuple[str, dict]]]] = [] for (stream_key, _need_count, _label), claimed_result in zip( @@ -1189,9 +1200,7 @@ def _update_stream_cache_with_log( self._stream_keys_cache = active_stream_keys self._stream_keys_last_refresh = time.time() cache_count = len(self._stream_keys_cache) - logger.info( - f"[REDIS_QUEUE] Stream keys refresh: prefix='{stream_key_prefix}', " - f"total={len(candidate_keys)}, active={len(active_stream_keys)}, cached={cache_count}, " - f"active_threshold_sec={int(active_threshold_sec)}, deleted={deleted_count}, " - f"inactive_threshold_sec={int(DEFAULT_STREAM_INACTIVITY_DELETE_SECONDS)}" - ) + logger.info( + f"Refreshed stream keys cache: {cache_count} active keys, " + f"{deleted_count} deleted, {len(candidate_keys)} candidates examined." + ) diff --git a/src/memos/memories/textual/prefer_text_memory/extractor.py b/src/memos/memories/textual/prefer_text_memory/extractor.py index 144bfad7f..3404c6d4c 100644 --- a/src/memos/memories/textual/prefer_text_memory/extractor.py +++ b/src/memos/memories/textual/prefer_text_memory/extractor.py @@ -69,6 +69,8 @@ def extract_explicit_preference(self, qa_pair: MessageList | str) -> dict[str, A try: response = self.llm_provider.generate([{"role": "user", "content": prompt}]) + if not response: + return None response = response.strip().replace("```json", "").replace("```", "").strip() result = json.loads(response) for d in result: @@ -92,6 +94,8 @@ def extract_implicit_preference(self, qa_pair: MessageList | str) -> dict[str, A try: response = self.llm_provider.generate([{"role": "user", "content": prompt}]) + if not response: + return None response = response.strip().replace("```json", "").replace("```", "").strip() result = json.loads(response) for d in result: diff --git a/src/memos/templates/mem_reader_prompts.py b/src/memos/templates/mem_reader_prompts.py index fef3ee6c0..40971c77e 100644 --- a/src/memos/templates/mem_reader_prompts.py +++ b/src/memos/templates/mem_reader_prompts.py @@ -622,23 +622,56 @@ 专注于从图像中提取事实性、可观察的信息。除非与用户记忆明显相关,否则避免推测。""" -SIMPLE_STRUCT_HALLUCINATION_FILTER_PROMPT = """ +SIMPLE_STRUCT_REWRITE_MEMORY_PROMPT = """ +You are a strict, language-preserving memory validator and rewriter. + +Your task is to eliminate hallucinations and tighten memories by grounding them strictly in the user’s explicit messages. Memories must be factual, unambiguous, and free of any inferred or speculative content. + +Rules: +1. **Language Consistency**: Keep the exact original language of each memory—no translation or language switching. +2. **Strict Factual Grounding**: Include only what the user explicitly stated. Remove or flag anything not directly present in the messages—no assumptions, interpretations, predictions, or generalizations NOT supported by the text. However, **you MUST retain specific details, reasons, explanations, and feelings if the user explicitly expressed them.** Minor formatting corrections (e.g., adding missing spaces between names, fixing obvious typos) are ALLOWED. +4. **Hallucination Removal**: +- If a memory contains **any content not supported by the user's explicit statements**, it must be rewritten. +- **Do NOT remove** details, reasons, or explanations that the user explicitly provided, even if they are subjective or specific. +- Do **not** rephrase inferences as facts. Instead, either: +- Remove the unsupported part and retain only the grounded core. +5. **No Change if Fully Grounded**: If the memory is concise, unambiguous, and fully supported by the user’s messages, keep it unchanged. +6. **Timestamp Exception**: Memories may include timestamps (e.g., dates like "On December 19, 2026") derived from conversation metadata. If the date in the memory is likely the conversation time (even if not shown in the `messages` list), do NOT treat it as a hallucination or require a rewrite. + +Inputs: +messages: +{messages_inline} + +memories: +{memories_inline} + +Output Format: +- Return a JSON object with string keys ("0", "1", "2", ...) matching input memory indices. +- Each value must be: {{ "need_rewrite": boolean, "rewritten": string, "reason": string }} +- The "reason" must be brief and precise, e.g.: + - "contains unsupported inference ...." + - "fully grounded and concise" + +Important: Output **only** the JSON. No extra text, explanations, markdown, or fields. +""" + +SIMPLE_STRUCT_REWRITE_MEMORY_USER_ONLY_PROMPT = """ You are a strict, language-preserving memory validator and rewriter. Your task is to eliminate hallucinations and tighten memories by grounding them strictly in the user’s explicit messages. Memories must be factual, unambiguous, and free of any inferred or speculative content. +Note: The provided messages contain only user messages. The assistant's responses are intentionally omitted, not because the assistant didn't answer, but to focus strictly on validating memories against user input. + Rules: 1. **Language Consistency**: Keep the exact original language of each memory—no translation or language switching. -2. **Strict Factual Grounding**: Include only what the user explicitly stated. Remove or flag anything not directly present in the messages—no assumptions, interpretations, predictions, emotional labels, summaries, or generalizations. -3. **Ambiguity Elimination**: - - Replace vague pronouns (e.g., “he”, “it”, “they”) with clear, specific entities **only if** the messages identify them. - - Convert relative time expressions (e.g., “yesterday”) to absolute dates **only if** the messages provide enough temporal context. +2. **Strict Factual Grounding**: Include only what the user explicitly stated. Remove or flag anything not directly present in the messages—no assumptions, interpretations, predictions, or generalizations NOT supported by the text. However, **you MUST retain specific details, reasons, explanations, and feelings if the user explicitly expressed them.** Minor formatting corrections (e.g., adding missing spaces between names, fixing obvious typos) are ALLOWED. 4. **Hallucination Removal**: - - If a memory contains **any content not verbatim or directly implied by the user**, it must be rewritten. - - Do **not** rephrase inferences as facts. Instead, either: - - Remove the unsupported part and retain only the grounded core, or - - If the entire memory is ungrounded, mark it for rewrite and make the lack of user support explicit. +- If a memory contains **any content not supported by the user's explicit statements**, it must be rewritten. +- **Do NOT remove** details, reasons, or explanations that the user explicitly provided, even if they are subjective or specific. +- Do **not** rephrase inferences as facts. Instead, either: +- Remove the unsupported part and retain only the grounded core. 5. **No Change if Fully Grounded**: If the memory is concise, unambiguous, and fully supported by the user’s messages, keep it unchanged. +6. **Timestamp Exception**: Memories may include timestamps (e.g., dates like "On December 19, 2026") derived from conversation metadata. If the date in the memory is likely the conversation time (even if not shown in the `messages` list), do NOT treat it as a hallucination or require a rewrite. Inputs: messages: @@ -651,16 +684,115 @@ - Return a JSON object with string keys ("0", "1", "2", ...) matching input memory indices. - Each value must be: {{ "need_rewrite": boolean, "rewritten": string, "reason": string }} - The "reason" must be brief and precise, e.g.: - - "contains unsupported inference" - - "vague pronoun with no referent in messages" - - "relative time resolved to 2025-12-16" + - "contains unsupported inference ...." - "fully grounded and concise" Important: Output **only** the JSON. No extra text, explanations, markdown, or fields. """ +SIMPLE_STRUCT_REWRITE_MEMORY_PROMPT_BACKUP = """ +You are a strict, language-preserving memory validator and rewriter. + +Your task is to eliminate hallucinations and tighten memories by grounding them strictly in the user’s explicit messages. Memories must be factual, unambiguous, and free of any inferred or speculative content. + +Rules: +1. **Language Consistency**: Keep the exact original language of each memory—no translation or language switching. +2. **Strict Factual Grounding**: Include only what the user explicitly stated. Remove or flag anything not directly present in the messages—no assumptions, interpretations, predictions, or generalizations NOT supported by the text. However, **you MUST retain specific details, reasons, explanations, and feelings if the user explicitly expressed them.** Minor formatting corrections (e.g., adding missing spaces between names, fixing obvious typos) are ALLOWED. +4. **Hallucination Removal**: +- If a memory contains **any content not supported by the user's explicit statements**, it must be rewritten. +- **Do NOT remove** details, reasons, or explanations that the user explicitly provided, even if they are subjective or specific. +- Do **not** rephrase inferences as facts. Instead, either: +- Remove the unsupported part and retain only the grounded core. +5. **No Change if Fully Grounded**: If the memory is concise, unambiguous, and fully supported by the user’s messages, keep it unchanged. +6. **Timestamp Exception**: Memories may include timestamps (e.g., dates like "On December 19, 2026") derived from conversation metadata. If the date in the memory is likely the conversation time (even if not shown in the `messages` list), do NOT treat it as a hallucination or require a rewrite. + +Inputs: +messages: +{messages_inline} + +memories: +{memories_inline} + +Output Format: +- Return a JSON object with string keys ("0", "1", "2", ...) matching input memory indices. +- Each value must be: {{ "need_rewrite": boolean, "rewritten": string, "reason": string }} +- The "reason" must be brief and precise, e.g.: + - "contains unsupported inference ...." + - "fully grounded and concise" + +Important: Output **only** the JSON. No extra text, explanations, markdown, or fields. +""" + +SIMPLE_STRUCT_HALLUCINATION_FILTER_PROMPT = """ +You are a strict memory validator. +Your task is to identify and delete hallucinated memories that are not explicitly stated by the user in the provided messages. + +Rules: +1. **User-Only Origin**: Verify facts against USER messages ONLY. If the Assistant repeats a User fact, it is VALID. If the Assistant introduces a new detail (e.g., 'philanthropy') that the User did not explicitly confirm, it is INVALID. +2. **No Inference Allowed**: Do NOT keep memories based on implication, emotion, preference, or generalization. Only verbatim or direct restatements of user-provided facts are valid. However, minor formatting corrections (e.g., adding missing spaces between names, fixing obvious typos) are ALLOWED. +3. **Hallucination = Deletion**: If a memory contains any detail not directly expressed by the user, mark it for deletion. +4. **Timestamp Exception**: Memories may include timestamps (e.g., dates like "On December 19, 2026") derived from conversation metadata. If the date in the memory is likely the conversation time (even if not shown in the `messages` list), do NOT treat it as a hallucination or require a rewrite. + +Examples: +Messages: +- [user]: I love coding in Python. +- [assistant]: That's great! I assume you also contribute to open source projects? +Memory: User enjoys Python and contributes to open source. +Result: {{"keep": false, "reason": "User never stated they contribute to open source; this came from Assistant's assumption."}} + +Messages: +- [user]: I am tired. +- [assistant]: I hear you are tired. Rest is important. +Memory: User stated they are tired. +Result: {{"keep": true, "reason": "Direct restatement of user input, even if Assistant repeated it."}} + +Inputs: +messages: +{messages_inline} + +memories: +{memories_inline} + +Output Format: +- Return a JSON object with string keys ("0", "1", "2", ...) matching the input memory indices. +- Each value must be: {{ "keep": boolean, "reason": string }} +- "keep": true only if the memory is a direct reflection of the user's explicit words. +- "reason": brief, factual, and cites missing or unsupported content. + +Important: Output **only** the JSON. No extra text, explanations, markdown, or fields. +""" + + +SIMPLE_STRUCT_ADD_BEFORE_SEARCH_PROMPT = """ +You are a memory manager. +Your task is to decide if a new memory should be added to the long-term memory, given a list of existing related memories. + +Rules: +1. **Redundancy Check**: If the new memory is completely redundant, already known, or covered by the existing memories, discard it. +2. **New Information**: If the new memory provides new information, details, or updates compared to the existing memories, keep it. +3. **Contradiction**: If the new memory contradicts existing memories but seems valid/newer, keep it (updates). +4. **Context Check**: Use the provided conversation messages to verify if the new memory is grounded in the user's explicit statements. + +Inputs: +Messages: +{messages_inline} + +Candidate Memories (to be evaluated): +{candidates_inline} + +Output Format: +- Return a JSON object with string keys ("0", "1", "2", ...) matching the input candidate memory indices. +- Each value must be: {{ "keep": boolean, "reason": string }} +- "keep": true if the memory should be added. +- "reason": brief explanation. + +Important: Output **only** the JSON. No extra text. +""" # Prompt mapping for specialized tasks (e.g., hallucination filtering) PROMPT_MAPPING = { "hallucination_filter": SIMPLE_STRUCT_HALLUCINATION_FILTER_PROMPT, + "rewrite": SIMPLE_STRUCT_REWRITE_MEMORY_PROMPT, + "rewrite_user_only": SIMPLE_STRUCT_REWRITE_MEMORY_USER_ONLY_PROMPT, + "add_before_search": SIMPLE_STRUCT_ADD_BEFORE_SEARCH_PROMPT, } From 7f39e7ecc052d2e85e7bbeb2ca73f586db143875 Mon Sep 17 00:00:00 2001 From: chentang Date: Wed, 24 Dec 2025 20:04:56 +0800 Subject: [PATCH 09/53] address the incompatible issue of local scheduler --- src/memos/mem_scheduler/base_scheduler.py | 20 +++-- .../task_schedule_modules/local_queue.py | 75 +++++++++++++++++-- .../task_schedule_modules/task_queue.py | 23 +----- .../mem_scheduler/utils/status_tracker.py | 26 ++++++- tests/test_local_queue_full.py | 54 +++++++++++++ 5 files changed, 164 insertions(+), 34 deletions(-) create mode 100644 tests/test_local_queue_full.py diff --git a/src/memos/mem_scheduler/base_scheduler.py b/src/memos/mem_scheduler/base_scheduler.py index 1e0ecaadb..728203f5b 100644 --- a/src/memos/mem_scheduler/base_scheduler.py +++ b/src/memos/mem_scheduler/base_scheduler.py @@ -1009,14 +1009,24 @@ def _monitor_loop(self): q_sizes = self.memos_message_queue.qsize() for stream_key, queue_length in q_sizes.items(): - # Expected format: "memos:stream:{user_id}:{mem_cube_id}" or "{user_id}" + # Skip aggregate keys like 'total_size' + if stream_key == "total_size": + continue + + # Key format: ...:{user_id}:{mem_cube_id}:{task_label} + # We want to extract user_id, which is the 3rd component from the end. parts = stream_key.split(":") if len(parts) >= 3: - user_id = parts[2] - self.metrics.update_queue_length(queue_length, user_id) - elif not self.use_redis_queue: # local queue - user_id = stream_key + user_id = parts[-3] self.metrics.update_queue_length(queue_length, user_id) + else: + # Fallback for unexpected key formats (e.g. legacy or testing) + # Try to use the key itself if it looks like a user_id (no colons) + # or just log a warning? + # For now, let's assume if it's not total_size and short, it might be a direct user_id key + # (though that shouldn't happen with current queue implementations) + if ":" not in stream_key: + self.metrics.update_queue_length(queue_length, stream_key) except Exception as e: logger.error(f"Error in metrics monitor loop: {e}", exc_info=True) diff --git a/src/memos/mem_scheduler/task_schedule_modules/local_queue.py b/src/memos/mem_scheduler/task_schedule_modules/local_queue.py index 69cfc0af9..32d79cef3 100644 --- a/src/memos/mem_scheduler/task_schedule_modules/local_queue.py +++ b/src/memos/mem_scheduler/task_schedule_modules/local_queue.py @@ -62,7 +62,7 @@ def put( Exception: Any underlying error during queue.put() operation. """ stream_key = self.get_stream_key( - user_id=message.user_id, mem_cube_id=message.mem_cube_id, task_label=message.task_label + user_id=message.user_id, mem_cube_id=message.mem_cube_id, task_label=message.label ) message.stream_key = stream_key @@ -108,35 +108,95 @@ def get( ) return res - def get_nowait(self, batch_size: int | None = None) -> list[ScheduleMessageItem]: + def get_nowait( + self, stream_key: str, batch_size: int | None = None + ) -> list[ScheduleMessageItem]: """ - Non-blocking version of get(). Equivalent to get(block=False, batch_size=batch_size). + Non-blocking version of get(). Equivalent to get(stream_key, block=False, batch_size=batch_size). Returns immediately with available messages or an empty list if queue is empty. Args: + stream_key (str): The stream/queue identifier. batch_size (int | None): Number of messages to retrieve in a batch. If None, retrieves one message. Returns: List[ScheduleMessageItem]: Retrieved messages or empty list if queue is empty. """ - logger.debug(f"get_nowait() called with batch_size: {batch_size}") - return self.get(block=False, batch_size=batch_size) + logger.debug(f"get_nowait() called for {stream_key} with batch_size: {batch_size}") + return self.get(stream_key=stream_key, block=False, batch_size=batch_size) + + def get_messages(self, batch_size: int) -> list[ScheduleMessageItem]: + """ + Get messages from all streams in round-robin or sequential fashion. + Equivalent to SchedulerRedisQueue.get_messages. + """ + messages = [] + # Snapshot keys to avoid runtime modification issues + stream_keys = list(self.queue_streams.keys()) + + # Simple strategy: try to get up to batch_size messages across all streams + # We can just iterate and collect. + + # Calculate how many to get per stream to be fair? + # Or just greedy? Redis implementation uses a complex logic. + # For local, let's keep it simple: just iterate and take what's available (non-blocking) + + for stream_key in stream_keys: + if len(messages) >= batch_size: + break + + needed = batch_size - len(messages) + # Use get_nowait to avoid blocking + fetched = self.get_nowait(stream_key=stream_key, batch_size=needed) + messages.extend(fetched) + + return messages def qsize(self) -> dict: """ Return the current size of all internal queues as a dictionary. Each key is the stream name, and each value is the number of messages in that queue. + Also includes 'total_size'. Returns: Dict[str, int]: Mapping from stream name to current queue size. """ sizes = {stream: queue.qsize() for stream, queue in self.queue_streams.items()} + total_size = sum(sizes.values()) + sizes["total_size"] = total_size logger.debug(f"Current queue sizes: {sizes}") return sizes + def size(self) -> int: + """ + Get the current size of the queue (total message count). + Compatible with SchedulerRedisQueue. + """ + return self.unfinished_tasks + + def empty(self) -> bool: + """ + Check if the queue is empty. + Compatible with SchedulerRedisQueue. + """ + return self.size() == 0 + + def full(self) -> bool: + """ + Check if the queue is full. + Compatible with SchedulerRedisQueue. + + Returns True if all internal queues are full. + If there are no queues, returns False. + """ + if not self.queue_streams: + return False + + return all(queue.full() for queue in self.queue_streams.values()) + def clear(self) -> None: for queue in self.queue_streams.values(): queue.clear() @@ -151,6 +211,9 @@ def unfinished_tasks(self) -> int: Returns: int: Sum of all message counts in all internal queues. """ - total = sum(self.qsize().values()) + # qsize() now includes "total_size", so we need to be careful not to double count if we use qsize() values + # But qsize() implementation above sums values from queue_streams, then adds total_size. + # So sum(self.queue_streams.values().qsize()) is safer. + total = sum(queue.qsize() for queue in self.queue_streams.values()) logger.debug(f"Total unfinished tasks across all queues: {total}") return total diff --git a/src/memos/mem_scheduler/task_schedule_modules/task_queue.py b/src/memos/mem_scheduler/task_schedule_modules/task_queue.py index c20243242..b49db2b36 100644 --- a/src/memos/mem_scheduler/task_schedule_modules/task_queue.py +++ b/src/memos/mem_scheduler/task_schedule_modules/task_queue.py @@ -153,28 +153,7 @@ def submit_messages(self, messages: ScheduleMessageItem | list[ScheduleMessageIt ) def get_messages(self, batch_size: int) -> list[ScheduleMessageItem]: - if isinstance(self.memos_message_queue, SchedulerRedisQueue): - return self.memos_message_queue.get_messages(batch_size=batch_size) - stream_keys = self.get_stream_keys() - - if len(stream_keys) == 0: - return [] - - messages: list[ScheduleMessageItem] = [] - - for stream_key in stream_keys: - fetched = self.memos_message_queue.get( - stream_key=stream_key, - block=False, - batch_size=batch_size, - ) - - messages.extend(fetched) - if len(messages) > 0: - logger.debug( - f"Fetched {len(messages)} messages across users with per-user batch_size={batch_size}" - ) - return messages + return self.memos_message_queue.get_messages(batch_size=batch_size) def clear(self): self.memos_message_queue.clear() diff --git a/src/memos/mem_scheduler/utils/status_tracker.py b/src/memos/mem_scheduler/utils/status_tracker.py index d8c8d2cee..2a995b239 100644 --- a/src/memos/mem_scheduler/utils/status_tracker.py +++ b/src/memos/mem_scheduler/utils/status_tracker.py @@ -13,7 +13,7 @@ class TaskStatusTracker: @require_python_package(import_name="redis", install_command="pip install redis") - def __init__(self, redis_client: "redis.Redis"): + def __init__(self, redis_client: "redis.Redis | None"): self.redis = redis_client def _get_key(self, user_id: str) -> str: @@ -41,6 +41,9 @@ def task_submitted( mem_cube_id: Memory cube identifier business_task_id: Optional business-level task ID (one task_id can have multiple item_ids) """ + if not self.redis: + return + key = self._get_key(user_id) payload = { "status": "waiting", @@ -61,6 +64,9 @@ def task_submitted( self.redis.expire(key, timedelta(days=7)) def task_started(self, task_id: str, user_id: str): + if not self.redis: + return + key = self._get_key(user_id) existing_data_json = self.redis.hget(key, task_id) if not existing_data_json: @@ -77,6 +83,9 @@ def task_started(self, task_id: str, user_id: str): self.redis.expire(key, timedelta(days=7)) def task_completed(self, task_id: str, user_id: str): + if not self.redis: + return + key = self._get_key(user_id) existing_data_json = self.redis.hget(key, task_id) if not existing_data_json: @@ -91,6 +100,9 @@ def task_completed(self, task_id: str, user_id: str): self.redis.expire(key, timedelta(days=7)) def task_failed(self, task_id: str, user_id: str, error_message: str): + if not self.redis: + return + key = self._get_key(user_id) existing_data_json = self.redis.hget(key, task_id) if not existing_data_json: @@ -108,11 +120,17 @@ def task_failed(self, task_id: str, user_id: str, error_message: str): self.redis.expire(key, timedelta(days=7)) def get_task_status(self, task_id: str, user_id: str) -> dict | None: + if not self.redis: + return None + key = self._get_key(user_id) data = self.redis.hget(key, task_id) return json.loads(data) if data else None def get_all_tasks_for_user(self, user_id: str) -> dict[str, dict]: + if not self.redis: + return {} + key = self._get_key(user_id) all_tasks = self.redis.hgetall(key) return {tid: json.loads(t_data) for tid, t_data in all_tasks.items()} @@ -132,6 +150,9 @@ def get_task_status_by_business_id(self, business_task_id: str, user_id: str) -> - If any item is 'failed' → 'failed' Returns None if task_id not found. """ + if not self.redis: + return None + # Get all item_ids for this task_id task_items_key = self._get_task_items_key(user_id, business_task_id) item_ids = self.redis.smembers(task_items_key) @@ -180,6 +201,9 @@ def get_all_tasks_global(self) -> dict[str, dict[str, dict]]: Returns: dict: {user_id: {task_id: task_data, ...}, ...} """ + if not self.redis: + return {} + all_users_tasks = {} cursor: int | str = 0 while True: diff --git a/tests/test_local_queue_full.py b/tests/test_local_queue_full.py new file mode 100644 index 000000000..6c523046a --- /dev/null +++ b/tests/test_local_queue_full.py @@ -0,0 +1,54 @@ +import unittest + +from datetime import datetime, timezone + +from memos.mem_scheduler.schemas.message_schemas import ScheduleMessageItem +from memos.mem_scheduler.task_schedule_modules.local_queue import SchedulerLocalQueue + + +class TestLocalQueueFull(unittest.TestCase): + def test_full_behavior(self): + # Create a queue with very small maxsize for testing + lq = SchedulerLocalQueue(maxsize=1) + + # Initially empty + self.assertFalse(lq.full()) + + # Add message to stream 1 + msg1 = ScheduleMessageItem( + user_id="u1", + mem_cube_id="c1", + label="l1", + content="m1", + timestamp=datetime.now(timezone.utc), + ) + lq.put(msg1) + + # Now stream 1 is full (maxsize=1). + # Since it's the only stream, and it's full, lq.full() should be True. + self.assertTrue(lq.full()) + + # Add message to stream 2 + msg2 = ScheduleMessageItem( + user_id="u2", + mem_cube_id="c2", + label="l2", + content="m2", + timestamp=datetime.now(timezone.utc), + ) + lq.put(msg2) + + # Now both stream 1 and stream 2 are full. lq.full() should be True. + self.assertTrue(lq.full()) + + # Remove message from stream 1 + stream1_key = lq.get_stream_key("u1", "c1", "l1") + lq.get(stream1_key) + + # Now stream 1 is empty, stream 2 is full. + # "all streams are full" is False. + self.assertFalse(lq.full()) + + +if __name__ == "__main__": + unittest.main() From 3fe9cb09b4f1864db8225be7e64b0959e50c358f Mon Sep 17 00:00:00 2001 From: chentang Date: Wed, 24 Dec 2025 20:25:07 +0800 Subject: [PATCH 10/53] feat(scheduler): optimize redis queue consumer group management - Proactively ensure consumer groups exist in '_refresh_stream_keys' for newly discovered streams. - Remove redundant consumer group checks in '_read_new_messages_batch' to improve read performance. - Clean up 'seen_streams' cache when streams are deleted to ensure correct group recreation. - This change reduces unnecessary Redis calls during high-frequency polling. --- .../task_schedule_modules/redis_queue.py | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py b/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py index 7923b3750..2f4318003 100644 --- a/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py +++ b/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py @@ -5,7 +5,6 @@ the local memos_message_queue functionality in BaseScheduler. """ -import contextlib import os import re import threading @@ -201,6 +200,20 @@ def _refresh_stream_keys( recent_seconds=DEFAULT_STREAM_RECENT_ACTIVE_SECONDS, now_sec=now_sec, ) + + # Ensure consumer groups for newly discovered active streams + with self._stream_keys_lock: + # Identify keys we haven't seen yet + new_streams = [k for k in active_stream_keys if k not in self.seen_streams] + + # Create groups outside the lock to avoid blocking + for key in new_streams: + self._ensure_consumer_group(key) + + if new_streams: + with self._stream_keys_lock: + self.seen_streams.update(new_streams) + deleted_count = self._delete_streams(keys_to_delete) self._update_stream_cache_with_log( stream_key_prefix=stream_key_prefix, @@ -560,10 +573,7 @@ def _read_new_messages_batch( return {} # Pre-ensure consumer groups to avoid NOGROUP during batch reads - for stream_key in stream_keys: - with contextlib.suppress(Exception): - self._ensure_consumer_group(stream_key=stream_key) - + # (Optimization: rely on put() and _refresh_stream_keys() to ensure groups) pipe = self._redis_conn.pipeline(transaction=False) for stream_key in stream_keys: pipe.xreadgroup( @@ -1170,10 +1180,14 @@ def _delete_streams(self, keys_to_delete: list[str]) -> int: del_pipe.delete(key) del_pipe.execute() deleted_count = len(keys_to_delete) - # Clean up empty-tracking state for deleted keys + # Clean up empty-tracking state and seen_streams for deleted keys with self._empty_stream_seen_lock: for key in keys_to_delete: self._empty_stream_seen_times.pop(key, None) + + with self._stream_keys_lock: + for key in keys_to_delete: + self.seen_streams.discard(key) except Exception: for key in keys_to_delete: try: @@ -1181,6 +1195,8 @@ def _delete_streams(self, keys_to_delete: list[str]) -> int: deleted_count += 1 with self._empty_stream_seen_lock: self._empty_stream_seen_times.pop(key, None) + with self._stream_keys_lock: + self.seen_streams.discard(key) except Exception: pass return deleted_count From b35096fa61d3d3aeea3297354b0d10a78916a0f8 Mon Sep 17 00:00:00 2001 From: chentang Date: Wed, 24 Dec 2025 20:34:05 +0800 Subject: [PATCH 11/53] fix(tests): resolve AttributeError in SimpleStructMemReader tests - Import 'parse_json_result' from 'memos.mem_reader.utils' instead of accessing it as an instance attribute. - Fixes 'AttributeError: 'SimpleStructMemReader' object has no attribute 'parse_json_result'' in 'test_parse_json_result_success' and 'test_parse_json_result_failure'. - Remove incorrect mock assignment of 'parse_json_result' in 'test_process_chat_data'. --- tests/mem_reader/test_simple_structure.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/mem_reader/test_simple_structure.py b/tests/mem_reader/test_simple_structure.py index f81356886..fd07fbf41 100644 --- a/tests/mem_reader/test_simple_structure.py +++ b/tests/mem_reader/test_simple_structure.py @@ -1,4 +1,3 @@ -import json import unittest from unittest.mock import MagicMock, patch @@ -8,6 +7,7 @@ from memos.embedders.factory import EmbedderFactory from memos.llms.factory import LLMFactory from memos.mem_reader.simple_struct import SimpleStructMemReader +from memos.mem_reader.utils import parse_json_result from memos.memories.textual.item import TextualMemoryItem @@ -57,7 +57,6 @@ def test_process_chat_data(self): '"summary": "Tom is currently focused on managing a new project with a tight schedule."}' ) self.reader.llm.generate.return_value = mock_response - self.reader.parse_json_result = lambda x: json.loads(x) result = self.reader._process_chat_data(scene_data_info, info) @@ -105,7 +104,7 @@ def test_get_scene_data_info_with_chat(self): def test_parse_json_result_success(self): """Test successful JSON parsing.""" raw_response = '{"summary": "Test summary", "tags": ["test"]}' - result = self.reader.parse_json_result(raw_response) + result = parse_json_result(raw_response) self.assertIsInstance(result, dict) self.assertIn("summary", result) @@ -113,7 +112,7 @@ def test_parse_json_result_success(self): def test_parse_json_result_failure(self): """Test failure in JSON parsing.""" raw_response = "Invalid JSON string" - result = self.reader.parse_json_result(raw_response) + result = parse_json_result(raw_response) self.assertEqual(result, {}) From 8943ba8b437d9b0f2bfe3ec4e93901c36b976314 Mon Sep 17 00:00:00 2001 From: chentang Date: Wed, 24 Dec 2025 20:49:32 +0800 Subject: [PATCH 12/53] fix(mem_reader): pass info dict to add_before_search for correct user_id usage - Update 'add_before_search' signature in 'SimpleStructMemReader' to accept 'info' dict. - Pass 'info' (containing 'user_id' and 'session_id') to 'self.searcher.search' instead of using empty strings. - Add 'test_add_before_search' to 'TestSimpleStructMemReader' to verify the fix and ensure 'searcher.search' receives the correct 'info'. - This ensures that memory searches are scoped to the correct user and session. --- src/memos/mem_reader/simple_struct.py | 3 +- tests/mem_reader/test_simple_structure.py | 92 +++++++++++++++++++++++ 2 files changed, 94 insertions(+), 1 deletion(-) diff --git a/src/memos/mem_reader/simple_struct.py b/src/memos/mem_reader/simple_struct.py index 866b6d988..18bad7ab7 100644 --- a/src/memos/mem_reader/simple_struct.py +++ b/src/memos/mem_reader/simple_struct.py @@ -561,6 +561,7 @@ def add_before_search( self, messages: list[dict], memory_list: list[TextualMemoryItem], + info: dict[str, Any], ) -> list[TextualMemoryItem]: # Build input objects with memory text and metadata (timestamps, sources, etc.) template = PROMPT_MAPPING["add_before_search"] @@ -579,7 +580,7 @@ def add_before_search( for idx, mem in enumerate(memory_list): try: related_memories = self.searcher.search( - query=mem.memory, top_k=3, mode="fast", info={"user_id": "", "session_id": ""} + query=mem.memory, top_k=3, mode="fast", info=info ) related_text = "None" if related_memories: diff --git a/tests/mem_reader/test_simple_structure.py b/tests/mem_reader/test_simple_structure.py index fd07fbf41..987ff25ae 100644 --- a/tests/mem_reader/test_simple_structure.py +++ b/tests/mem_reader/test_simple_structure.py @@ -116,6 +116,98 @@ def test_parse_json_result_failure(self): self.assertEqual(result, {}) + def test_add_before_search(self): + """Test add_before_search method.""" + import json + + from memos.memories.textual.item import TextualMemoryItem, TreeNodeTextualMemoryMetadata + + # Mock searcher + self.reader.searcher = MagicMock() + self.reader.searcher.search.return_value = [ + TextualMemoryItem( + memory="Related memory 1", + metadata=TreeNodeTextualMemoryMetadata( + user_id="user1", + session_id="session1", + memory_type="LongTermMemory", + status="activated", + tags=[], + key="key1", + embedding=[0.1], + usage=[], + sources=[], + background="", + confidence=0.99, + type="fact", + info={}, + ), + ) + ] + + # Mock LLM response for filter + # The method expects a JSON response with keep/drop decisions + mock_response = json.dumps( + { + "0": {"keep": True, "reason": "Relevant"}, + "1": {"keep": False, "reason": "Duplicate"}, + } + ) + self.reader.llm.generate.return_value = mock_response + + messages = [{"role": "user", "content": "test message"}] + memory_list = [ + TextualMemoryItem( + memory="Mem 1", + metadata=TreeNodeTextualMemoryMetadata( + user_id="user1", + session_id="session1", + memory_type="LongTermMemory", + status="activated", + tags=[], + key="key1", + embedding=[0.1], + usage=[], + sources=[], + background="", + confidence=0.99, + type="fact", + info={}, + ), + ), + TextualMemoryItem( + memory="Mem 2", + metadata=TreeNodeTextualMemoryMetadata( + user_id="user1", + session_id="session1", + memory_type="LongTermMemory", + status="activated", + tags=[], + key="key2", + embedding=[0.1], + usage=[], + sources=[], + background="", + confidence=0.99, + type="fact", + info={}, + ), + ), + ] + info = {"user_id": "user1", "session_id": "session1"} + + # Call the method + result = self.reader.add_before_search(messages, memory_list, info) + + # Assertions + # Check if searcher.search was called with correct info + self.reader.searcher.search.assert_called_with( + query="Mem 2", top_k=3, mode="fast", info=info + ) + # Check result + self.assertEqual(len(result), 1) + self.assertEqual(result[0].memory, "Mem 1") + if __name__ == "__main__": unittest.main() From 78a43275f5d9550cda6514ea51b05ee64417d979 Mon Sep 17 00:00:00 2001 From: chentang Date: Wed, 24 Dec 2025 21:25:35 +0800 Subject: [PATCH 13/53] refactor add_before_search from mem_reader to SingleCubeView --- src/memos/mem_reader/simple_struct.py | 3 +- src/memos/mem_reader/utils.py | 53 ------------- src/memos/multi_mem_cube/single_cube.py | 101 ++++++++++++++++++++++++ 3 files changed, 103 insertions(+), 54 deletions(-) diff --git a/src/memos/mem_reader/simple_struct.py b/src/memos/mem_reader/simple_struct.py index 18bad7ab7..fdd109079 100644 --- a/src/memos/mem_reader/simple_struct.py +++ b/src/memos/mem_reader/simple_struct.py @@ -561,6 +561,7 @@ def add_before_search( self, messages: list[dict], memory_list: list[TextualMemoryItem], + user_name: str, info: dict[str, Any], ) -> list[TextualMemoryItem]: # Build input objects with memory text and metadata (timestamps, sources, etc.) @@ -580,7 +581,7 @@ def add_before_search( for idx, mem in enumerate(memory_list): try: related_memories = self.searcher.search( - query=mem.memory, top_k=3, mode="fast", info=info + query=mem.memory, top_k=3, mode="fast", user_nam=user_name, info=info ) related_text = "None" if related_memories: diff --git a/src/memos/mem_reader/utils.py b/src/memos/mem_reader/utils.py index 843345ec4..4e5a78af2 100644 --- a/src/memos/mem_reader/utils.py +++ b/src/memos/mem_reader/utils.py @@ -1,16 +1,7 @@ import json -import os import re -from typing import Any - from memos import log -from memos.api.config import APIConfig -from memos.configs.graph_db import GraphDBConfigFactory -from memos.configs.reranker import RerankerConfigFactory -from memos.graph_dbs.factory import GraphStoreFactory -from memos.memories.textual.tree_text_memory.retrieve.searcher import Searcher -from memos.reranker.factory import RerankerFactory logger = log.get_logger(__name__) @@ -164,47 +155,3 @@ def parse_keep_filter_response(text: str) -> tuple[bool, dict[int, dict]]: "reason": reason, } return (len(result) > 0), result - - -def build_graph_db_config(user_id: str = "default") -> dict[str, Any]: - graph_db_backend_map = { - "neo4j-community": APIConfig.get_neo4j_community_config(user_id=user_id), - "neo4j": APIConfig.get_neo4j_config(user_id=user_id), - "nebular": APIConfig.get_nebular_config(user_id=user_id), - "polardb": APIConfig.get_polardb_config(user_id=user_id), - } - - graph_db_backend = os.getenv("NEO4J_BACKEND", "nebular").lower() - return GraphDBConfigFactory.model_validate( - { - "backend": graph_db_backend, - "config": graph_db_backend_map[graph_db_backend], - } - ) - - -def build_reranker_config() -> dict[str, Any]: - return RerankerConfigFactory.model_validate(APIConfig.get_reranker_config()) - - -def init_searcher(llm, embedder) -> Searcher: - """Initialize a Searcher instance for SimpleStructMemReader.""" - - # Build configs - graph_db_config = build_graph_db_config() - reranker_config = build_reranker_config() - - # Create instances - graph_db = GraphStoreFactory.from_config(graph_db_config) - reranker = RerankerFactory.from_config(reranker_config) - - # Create Searcher - searcher = Searcher( - dispatcher_llm=llm, - graph_store=graph_db, - embedder=embedder, - reranker=reranker, - manual_close_internet=os.getenv("ENABLE_INTERNET", "true").lower() == "false", - ) - - return searcher diff --git a/src/memos/multi_mem_cube/single_cube.py b/src/memos/multi_mem_cube/single_cube.py index 57f2cdba1..ab3d0ce03 100644 --- a/src/memos/multi_mem_cube/single_cube.py +++ b/src/memos/multi_mem_cube/single_cube.py @@ -15,6 +15,7 @@ ) from memos.context.context import ContextThreadPoolExecutor from memos.log import get_logger +from memos.mem_reader.utils import parse_keep_filter_response from memos.mem_scheduler.schemas.message_schemas import ScheduleMessageItem from memos.mem_scheduler.schemas.task_schemas import ( ADD_TASK_LABEL, @@ -23,6 +24,7 @@ PREF_ADD_TASK_LABEL, ) from memos.multi_mem_cube.views import MemCubeView +from memos.templates.mem_reader_prompts import PROMPT_MAPPING from memos.types.general_types import ( FINE_STRATEGY, FineStrategy, @@ -41,6 +43,7 @@ from memos.mem_cube.navie import NaiveMemCube from memos.mem_reader.simple_struct import SimpleStructMemReader from memos.mem_scheduler.optimized_scheduler import OptimizedScheduler + from memos.memories.textual.item import TextualMemoryItem @dataclass @@ -631,6 +634,104 @@ def _process_pref_mem( for memory_id, memory in zip(pref_ids_local, pref_memories_local, strict=False) ] + def add_before_search( + self, + messages: list[dict], + memory_list: list[TextualMemoryItem], + user_name: str, + info: dict[str, Any], + ) -> list[TextualMemoryItem]: + # Build input objects with memory text and metadata (timestamps, sources, etc.) + template = PROMPT_MAPPING["add_before_search"] + + if not self.searcher: + self.logger.warning("[add_before_search] Searcher is not initialized, skipping check.") + return memory_list + + # 1. Gather candidates and search for related memories + candidates_data = [] + for idx, mem in enumerate(memory_list): + try: + related_memories = self.searcher.search( + query=mem.memory, top_k=3, mode="fast", user_name=user_name, info=info + ) + related_text = "None" + if related_memories: + related_text = "\n".join([f"- {r.memory}" for r in related_memories]) + + candidates_data.append( + {"idx": idx, "new_memory": mem.memory, "related_memories": related_text} + ) + except Exception as e: + self.logger.error( + f"[add_before_search] Search error for memory '{mem.memory}': {e}" + ) + # If search fails, we can either skip this check or treat related as empty + candidates_data.append( + { + "idx": idx, + "new_memory": mem.memory, + "related_memories": "None (Search Failed)", + } + ) + + if not candidates_data: + return memory_list + + # 2. Build Prompt + messages_inline = "\n".join( + [ + f"- [{message.get('role', 'unknown')}]: {message.get('content', '')}" + for message in messages + ] + ) + + candidates_inline_dict = { + str(item["idx"]): { + "new_memory": item["new_memory"], + "related_memories": item["related_memories"], + } + for item in candidates_data + } + + candidates_inline = json.dumps(candidates_inline_dict, ensure_ascii=False, indent=2) + + prompt = template.format( + messages_inline=messages_inline, candidates_inline=candidates_inline + ) + + # 3. Call LLM + try: + raw = self.mem_reader.llm.generate([{"role": "user", "content": prompt}]) + success, parsed_result = parse_keep_filter_response(raw) + + if not success: + self.logger.warning( + "[add_before_search] Failed to parse LLM response, keeping all." + ) + return memory_list + + # 4. Filter + filtered_list = [] + for idx, mem in enumerate(memory_list): + res = parsed_result.get(idx) + if not res: + filtered_list.append(mem) + continue + + if res.get("keep", True): + filtered_list.append(mem) + else: + self.logger.info( + f"[add_before_search] Dropping memory: '{mem.memory}', reason: '{res.get('reason')}'" + ) + + return filtered_list + + except Exception as e: + self.logger.error(f"[add_before_search] LLM execution error: {e}") + return memory_list + def _process_text_mem( self, add_req: APIADDRequest, From a5fc4c09c94c4ded8d153cf34f5c09dc19cc979a Mon Sep 17 00:00:00 2001 From: chentang Date: Wed, 24 Dec 2025 21:36:07 +0800 Subject: [PATCH 14/53] address bugs --- src/memos/mem_reader/simple_struct.py | 99 ----------------------- tests/mem_reader/test_simple_structure.py | 92 --------------------- 2 files changed, 191 deletions(-) diff --git a/src/memos/mem_reader/simple_struct.py b/src/memos/mem_reader/simple_struct.py index fdd109079..70472958e 100644 --- a/src/memos/mem_reader/simple_struct.py +++ b/src/memos/mem_reader/simple_struct.py @@ -557,105 +557,6 @@ def filter_hallucination_in_memories( return memory_list - def add_before_search( - self, - messages: list[dict], - memory_list: list[TextualMemoryItem], - user_name: str, - info: dict[str, Any], - ) -> list[TextualMemoryItem]: - # Build input objects with memory text and metadata (timestamps, sources, etc.) - template = PROMPT_MAPPING["add_before_search"] - - if not self.searcher: - try: - from memos.mem_reader.utils import init_searcher - - self.searcher = init_searcher(self.llm, self.embedder) - except Exception as e: - logger.error(f"[add_before_search] Failed to init searcher: {e}") - return memory_list - - # 1. Gather candidates and search for related memories - candidates_data = [] - for idx, mem in enumerate(memory_list): - try: - related_memories = self.searcher.search( - query=mem.memory, top_k=3, mode="fast", user_nam=user_name, info=info - ) - related_text = "None" - if related_memories: - related_text = "\n".join([f"- {r.memory}" for r in related_memories]) - - candidates_data.append( - {"idx": idx, "new_memory": mem.memory, "related_memories": related_text} - ) - except Exception as e: - logger.error(f"[add_before_search] Search error for memory '{mem.memory}': {e}") - # If search fails, we can either skip this check or treat related as empty - candidates_data.append( - { - "idx": idx, - "new_memory": mem.memory, - "related_memories": "None (Search Failed)", - } - ) - - if not candidates_data: - return memory_list - - # 2. Build Prompt - messages_inline = "\n".join( - [ - f"- [{message.get('role', 'unknown')}]: {message.get('content', '')}" - for message in messages - ] - ) - - candidates_inline_dict = { - str(item["idx"]): { - "new_memory": item["new_memory"], - "related_memories": item["related_memories"], - } - for item in candidates_data - } - - candidates_inline = json.dumps(candidates_inline_dict, ensure_ascii=False, indent=2) - - prompt = template.format( - messages_inline=messages_inline, candidates_inline=candidates_inline - ) - - # 3. Call LLM - try: - raw = self.llm.generate([{"role": "user", "content": prompt}]) - success, parsed_result = parse_keep_filter_response(raw) - - if not success: - logger.warning("[add_before_search] Failed to parse LLM response, keeping all.") - return memory_list - - # 4. Filter - filtered_list = [] - for idx, mem in enumerate(memory_list): - res = parsed_result.get(idx) - if not res: - filtered_list.append(mem) - continue - - if res.get("keep", True): - filtered_list.append(mem) - else: - logger.info( - f"[add_before_search] Dropping memory: '{mem.memory}', reason: '{res.get('reason')}'" - ) - - return filtered_list - - except Exception as e: - logger.error(f"[add_before_search] LLM execution error: {e}") - return memory_list - def _read_memory( self, messages: list[MessagesType], type: str, info: dict[str, Any], mode: str = "fine" ) -> list[list[TextualMemoryItem]]: diff --git a/tests/mem_reader/test_simple_structure.py b/tests/mem_reader/test_simple_structure.py index 987ff25ae..fd07fbf41 100644 --- a/tests/mem_reader/test_simple_structure.py +++ b/tests/mem_reader/test_simple_structure.py @@ -116,98 +116,6 @@ def test_parse_json_result_failure(self): self.assertEqual(result, {}) - def test_add_before_search(self): - """Test add_before_search method.""" - import json - - from memos.memories.textual.item import TextualMemoryItem, TreeNodeTextualMemoryMetadata - - # Mock searcher - self.reader.searcher = MagicMock() - self.reader.searcher.search.return_value = [ - TextualMemoryItem( - memory="Related memory 1", - metadata=TreeNodeTextualMemoryMetadata( - user_id="user1", - session_id="session1", - memory_type="LongTermMemory", - status="activated", - tags=[], - key="key1", - embedding=[0.1], - usage=[], - sources=[], - background="", - confidence=0.99, - type="fact", - info={}, - ), - ) - ] - - # Mock LLM response for filter - # The method expects a JSON response with keep/drop decisions - mock_response = json.dumps( - { - "0": {"keep": True, "reason": "Relevant"}, - "1": {"keep": False, "reason": "Duplicate"}, - } - ) - self.reader.llm.generate.return_value = mock_response - - messages = [{"role": "user", "content": "test message"}] - memory_list = [ - TextualMemoryItem( - memory="Mem 1", - metadata=TreeNodeTextualMemoryMetadata( - user_id="user1", - session_id="session1", - memory_type="LongTermMemory", - status="activated", - tags=[], - key="key1", - embedding=[0.1], - usage=[], - sources=[], - background="", - confidence=0.99, - type="fact", - info={}, - ), - ), - TextualMemoryItem( - memory="Mem 2", - metadata=TreeNodeTextualMemoryMetadata( - user_id="user1", - session_id="session1", - memory_type="LongTermMemory", - status="activated", - tags=[], - key="key2", - embedding=[0.1], - usage=[], - sources=[], - background="", - confidence=0.99, - type="fact", - info={}, - ), - ), - ] - info = {"user_id": "user1", "session_id": "session1"} - - # Call the method - result = self.reader.add_before_search(messages, memory_list, info) - - # Assertions - # Check if searcher.search was called with correct info - self.reader.searcher.search.assert_called_with( - query="Mem 2", top_k=3, mode="fast", info=info - ) - # Check result - self.assertEqual(len(result), 1) - self.assertEqual(result[0].memory, "Mem 1") - if __name__ == "__main__": unittest.main() From 45224ddb6880fee5dbe6e5580b47357c2bac25d7 Mon Sep 17 00:00:00 2001 From: chentang Date: Thu, 25 Dec 2025 11:45:01 +0800 Subject: [PATCH 15/53] fix: fix the qsize bug of task queue, and accept change from hotfix/scheduler --- src/memos/mem_scheduler/base_scheduler.py | 3 + .../task_schedule_modules/dispatcher.py | 3 - .../task_schedule_modules/local_queue.py | 111 +++++++++++------- 3 files changed, 73 insertions(+), 44 deletions(-) diff --git a/src/memos/mem_scheduler/base_scheduler.py b/src/memos/mem_scheduler/base_scheduler.py index 728203f5b..a2621eefc 100644 --- a/src/memos/mem_scheduler/base_scheduler.py +++ b/src/memos/mem_scheduler/base_scheduler.py @@ -1008,6 +1008,9 @@ def _monitor_loop(self): try: q_sizes = self.memos_message_queue.qsize() + if not isinstance(q_sizes, dict): + continue + for stream_key, queue_length in q_sizes.items(): # Skip aggregate keys like 'total_size' if stream_key == "total_size": diff --git a/src/memos/mem_scheduler/task_schedule_modules/dispatcher.py b/src/memos/mem_scheduler/task_schedule_modules/dispatcher.py index 35df3db64..e2c1621d4 100644 --- a/src/memos/mem_scheduler/task_schedule_modules/dispatcher.py +++ b/src/memos/mem_scheduler/task_schedule_modules/dispatcher.py @@ -128,9 +128,6 @@ def status_tracker(self) -> TaskStatusTracker | None: if self._status_tracker is None: try: self._status_tracker = TaskStatusTracker(self.redis) - # Propagate to submodules when created lazily - if self.dispatcher: - self.dispatcher.status_tracker = self._status_tracker if self.memos_message_queue: self.memos_message_queue.set_status_tracker(self._status_tracker) except Exception as e: diff --git a/src/memos/mem_scheduler/task_schedule_modules/local_queue.py b/src/memos/mem_scheduler/task_schedule_modules/local_queue.py index eae70f8ef..791cedf41 100644 --- a/src/memos/mem_scheduler/task_schedule_modules/local_queue.py +++ b/src/memos/mem_scheduler/task_schedule_modules/local_queue.py @@ -4,9 +4,18 @@ the local memos_message_queue functionality in BaseScheduler. """ +from typing import TYPE_CHECKING + + +if TYPE_CHECKING: + from collections.abc import Callable + from memos.log import get_logger from memos.mem_scheduler.general_modules.misc import AutoDroppingQueue as Queue from memos.mem_scheduler.schemas.message_schemas import ScheduleMessageItem +from memos.mem_scheduler.schemas.task_schemas import DEFAULT_STREAM_KEY_PREFIX +from memos.mem_scheduler.task_schedule_modules.orchestrator import SchedulerOrchestrator +from memos.mem_scheduler.utils.status_tracker import TaskStatusTracker from memos.mem_scheduler.webservice_modules.redis_service import RedisSchedulerModule @@ -16,26 +25,38 @@ class SchedulerLocalQueue(RedisSchedulerModule): def __init__( self, - maxsize: int, + maxsize: int = 0, + stream_key_prefix: str = DEFAULT_STREAM_KEY_PREFIX, + orchestrator: SchedulerOrchestrator | None = None, + status_tracker: TaskStatusTracker | None = None, ): """ Initialize the SchedulerLocalQueue with a maximum queue size limit. + Arguments match SchedulerRedisQueue for compatibility. Args: - maxsize (int): Maximum number of messages allowed - in each individual queue. - If exceeded, subsequent puts will block - or raise an exception based on `block` parameter. + maxsize (int): Maximum number of messages allowed in each individual queue. + stream_key_prefix (str): Prefix for stream keys (simulated). + orchestrator: SchedulerOrchestrator instance (ignored). + status_tracker: TaskStatusTracker instance (ignored). """ super().__init__() - self.stream_key_prefix = "local_queue" + self.stream_key_prefix = stream_key_prefix or "local_queue" self.max_internal_message_queue_size = maxsize + # Dictionary to hold per-stream queues: key = stream_key, value = Queue[ScheduleMessageItem] self.queue_streams: dict[str, Queue[ScheduleMessageItem]] = {} + + self.orchestrator = orchestrator + self.status_tracker = status_tracker + + self._is_listening = False + self._message_handler: Callable[[ScheduleMessageItem], None] | None = None + logger.info( - f"SchedulerLocalQueue initialized with max_internal_message_queue_size={maxsize}" + f"SchedulerLocalQueue initialized with max_internal_message_queue_size={self.max_internal_message_queue_size}" ) def get_stream_key(self, user_id: str, mem_cube_id: str, task_label: str) -> str: @@ -86,7 +107,7 @@ def get( stream_key: str, block: bool = True, timeout: float | None = None, - batch_size: int | None = None, + batch_size: int | None = 1, ) -> list[ScheduleMessageItem]: if batch_size is not None and batch_size <= 0: logger.warning( @@ -99,18 +120,19 @@ def get( logger.error(f"Stream {stream_key} does not exist when trying to get messages.") return [] + # Ensure we always request a batch so we get a list back + effective_batch_size = batch_size if batch_size is not None else 1 + # Note: Assumes custom Queue implementation supports batch_size parameter res = self.queue_streams[stream_key].get( - block=block, timeout=timeout, batch_size=batch_size + block=block, timeout=timeout, batch_size=effective_batch_size ) logger.debug( f"Retrieved {len(res)} messages from queue '{stream_key}'. Current size: {self.queue_streams[stream_key].qsize()}" ) return res - def get_nowait( - self, stream_key: str, batch_size: int | None = None - ) -> list[ScheduleMessageItem]: + def get_nowait(self, stream_key: str, batch_size: int | None = 1) -> list[ScheduleMessageItem]: """ Non-blocking version of get(). Equivalent to get(stream_key, block=False, batch_size=batch_size). @@ -170,35 +192,13 @@ def qsize(self) -> dict: logger.debug(f"Current queue sizes: {sizes}") return sizes - def size(self) -> int: - """ - Get the current size of the queue (total message count). - Compatible with SchedulerRedisQueue. - """ - return self.unfinished_tasks - - def empty(self) -> bool: - """ - Check if the queue is empty. - Compatible with SchedulerRedisQueue. - """ - return self.size() == 0 - - def full(self) -> bool: - """ - Check if the queue is full. - Compatible with SchedulerRedisQueue. - """ - # Local queue limits are per-stream (max_internal_message_queue_size). - # It is considered full only if all streams are full. - if not self.queue_streams: - return False - - return all(queue.full() for queue in self.queue_streams.values()) - - def clear(self) -> None: - for queue in self.queue_streams.values(): - queue.clear() + def clear(self, stream_key: str | None = None) -> None: + if stream_key: + if stream_key in self.queue_streams: + self.queue_streams[stream_key].clear() + else: + for queue in self.queue_streams.values(): + queue.clear() @property def unfinished_tasks(self) -> int: @@ -216,3 +216,32 @@ def unfinished_tasks(self) -> int: total = sum(queue.qsize() for queue in self.queue_streams.values()) logger.debug(f"Total unfinished tasks across all queues: {total}") return total + + def get_stream_keys(self, stream_key_prefix: str | None = None) -> list[str]: + """ + Return list of active stream keys. + """ + prefix = stream_key_prefix or self.stream_key_prefix + return [k for k in self.queue_streams if k.startswith(prefix)] + + def size(self) -> int: + """ + Total size of all queues. + """ + return sum(q.qsize() for q in self.queue_streams.values()) + + def empty(self) -> bool: + """ + Check if all queues are empty. + """ + return self.size() == 0 + + def full(self) -> bool: + """ + Check if any queue is full (approximate). + """ + if self.max_internal_message_queue_size <= 0: + return False + return any( + q.qsize() >= self.max_internal_message_queue_size for q in self.queue_streams.values() + ) From f3c4f6ce4f7dc05686ddd94f98a1832a9bd2e08a Mon Sep 17 00:00:00 2001 From: chentang Date: Fri, 26 Dec 2025 17:33:13 +0800 Subject: [PATCH 16/53] fix: address some issues to run old scheduler example and kv cache example --- .../config/mem_scheduler/mem_cube_config.yaml | 21 ++ .../memos_config_w_scheduler.yaml | 12 +- .../mem_scheduler/quick_start_examples.py | 240 ++++++++++++++++++ src/memos/llms/hf.py | 13 +- src/memos/mem_os/core.py | 6 +- src/memos/mem_os/main.py | 2 +- src/memos/mem_os/utils/format_utils.py | 82 ++++-- src/memos/mem_reader/simple_struct.py | 2 +- src/memos/mem_scheduler/base_scheduler.py | 39 ++- .../general_modules/scheduler_logger.py | 30 ++- src/memos/mem_scheduler/general_scheduler.py | 65 +++-- .../mem_scheduler/monitors/general_monitor.py | 22 +- .../task_schedule_modules/redis_queue.py | 2 +- src/memos/memories/activation/kv.py | 32 ++- 14 files changed, 485 insertions(+), 83 deletions(-) create mode 100644 examples/data/config/mem_scheduler/mem_cube_config.yaml create mode 100644 examples/mem_scheduler/quick_start_examples.py diff --git a/examples/data/config/mem_scheduler/mem_cube_config.yaml b/examples/data/config/mem_scheduler/mem_cube_config.yaml new file mode 100644 index 000000000..398d8dbb3 --- /dev/null +++ b/examples/data/config/mem_scheduler/mem_cube_config.yaml @@ -0,0 +1,21 @@ +user_id: "user_test" +cube_id: "user_test/mem_cube_naive" +text_mem: + backend: "naive_text" + config: + extractor_llm: + backend: "huggingface_singleton" + config: + model_name_or_path: "Qwen/Qwen3-0.6B" + temperature: 0.1 + max_tokens: 1024 +act_mem: + backend: "kv_cache" + config: + memory_filename: "activation_memory.pickle" + extractor_llm: + backend: "huggingface_singleton" + config: + model_name_or_path: "Qwen/Qwen3-0.6B" + temperature: 0.8 + max_tokens: 1024 diff --git a/examples/data/config/mem_scheduler/memos_config_w_scheduler.yaml b/examples/data/config/mem_scheduler/memos_config_w_scheduler.yaml index bd9910300..a5e91dc4e 100644 --- a/examples/data/config/mem_scheduler/memos_config_w_scheduler.yaml +++ b/examples/data/config/mem_scheduler/memos_config_w_scheduler.yaml @@ -10,16 +10,12 @@ mem_reader: backend: "simple_struct" config: llm: - backend: "openai" + backend: "huggingface_singleton" config: - model_name_or_path: "gpt-4o-mini" - temperature: 0.8 - max_tokens: 4096 - top_p: 0.9 - top_k: 50 + model_name_or_path: "Qwen/Qwen3-1.7B" + temperature: 0.1 remove_think_prefix: true - api_key: "sk-xxxxxx" - api_base: "https://api.openai.com/v1" + max_tokens: 4096 embedder: backend: "ollama" config: diff --git a/examples/mem_scheduler/quick_start_examples.py b/examples/mem_scheduler/quick_start_examples.py new file mode 100644 index 000000000..c4142d2cd --- /dev/null +++ b/examples/mem_scheduler/quick_start_examples.py @@ -0,0 +1,240 @@ +import json +import shutil +import sys +import uuid + +from pathlib import Path + +from transformers import DynamicCache + +from memos.configs.mem_cube import GeneralMemCubeConfig +from memos.configs.mem_os import MOSConfig +from memos.configs.memory import MemoryConfigFactory +from memos.mem_cube.general import GeneralMemCube +from memos.mem_os.main import MOS +from memos.mem_scheduler.schemas.message_schemas import ScheduleMessageItem +from memos.mem_scheduler.schemas.task_schemas import ( + ANSWER_TASK_LABEL, + MEM_UPDATE_TASK_LABEL, + QUERY_TASK_LABEL, +) +from memos.mem_scheduler.utils.misc_utils import parse_yaml +from memos.memories.activation.item import KVCacheItem +from memos.memories.factory import MemoryFactory + + +FILE_PATH = Path(__file__).absolute() +BASE_DIR = FILE_PATH.parent.parent.parent +sys.path.insert(0, str(BASE_DIR)) # Enable execution from any working directory + + +def get_cache_info(cache): + if not cache: + return None + + num_layers = 0 + total_size_bytes = 0 + + if hasattr(cache, "layers"): + num_layers = len(cache.layers) + for layer in cache.layers: + if hasattr(layer, "key_cache") and layer.key_cache is not None: + total_size_bytes += layer.key_cache.nelement() * layer.key_cache.element_size() + if hasattr(layer, "value_cache") and layer.value_cache is not None: + total_size_bytes += layer.value_cache.nelement() * layer.value_cache.element_size() + + if hasattr(layer, "keys") and layer.keys is not None: + total_size_bytes += layer.keys.nelement() * layer.keys.element_size() + if hasattr(layer, "values") and layer.values is not None: + total_size_bytes += layer.values.nelement() * layer.values.element_size() + + elif hasattr(cache, "key_cache") and hasattr(cache, "value_cache"): + num_layers = len(cache.key_cache) + for k, v in zip(cache.key_cache, cache.value_cache, strict=False): + if k is not None: + total_size_bytes += k.nelement() * k.element_size() + if v is not None: + total_size_bytes += v.nelement() * v.element_size() + + return { + "num_layers": num_layers, + "size_bytes": total_size_bytes, + "size_mb": f"{total_size_bytes / (1024 * 1024):.2f} MB", + } + + +def serialize_item(obj): + if isinstance(obj, list): + return [serialize_item(x) for x in obj] + + if isinstance(obj, KVCacheItem): + return { + "id": obj.id, + "metadata": obj.metadata, + "records": obj.records.model_dump() + if hasattr(obj.records, "model_dump") + else obj.records, + "memory": get_cache_info(obj.memory), + } + + if isinstance(obj, DynamicCache): + return get_cache_info(obj) + + return str(obj) + + +def kv_cache_only(): + # 为 KVCacheMemory(HuggingFace 后端)创建配置 + config = MemoryConfigFactory( + backend="kv_cache", + config={ + "extractor_llm": { + "backend": "huggingface", + "config": { + "model_name_or_path": "Qwen/Qwen3-0.6B", + "max_tokens": 32, + "add_generation_prompt": True, + "remove_think_prefix": True, + }, + }, + }, + ) + + # 实例化 KVCacheMemory + kv_mem = MemoryFactory.from_config(config) + + # 提取一个 KVCacheItem(DynamicCache) + prompt = [ + {"role": "user", "content": "What is MemOS?"}, + {"role": "assistant", "content": "MemOS is a memory operating system for LLMs."}, + ] + print("===== Extract KVCacheItem =====") + cache_item = kv_mem.extract(prompt) + print(json.dumps(serialize_item(cache_item), indent=2, default=str)) + + # 将缓存添加到内存中 + kv_mem.add([cache_item]) + print("All caches:") + print(json.dumps(serialize_item(kv_mem.get_all()), indent=2, default=str)) + + # 通过 ID 获取 + retrieved = kv_mem.get(cache_item.id) + print("Retrieved:") + print(json.dumps(serialize_item(retrieved), indent=2, default=str)) + + # 合并缓存 + item2 = kv_mem.extract([{"role": "user", "content": "Tell me a joke."}]) + kv_mem.add([item2]) + merged = kv_mem.get_cache([cache_item.id, item2.id]) + print("Merged cache:") + print(json.dumps(serialize_item(merged), indent=2, default=str)) + + # 删除其中一个 + kv_mem.delete([cache_item.id]) + print("After delete:") + print(json.dumps(serialize_item(kv_mem.get_all()), indent=2, default=str)) + + # 导出和加载缓存 + kv_mem.dump("tmp/kv_mem") + print("Dumped to tmp/kv_mem") + kv_mem.delete_all() + kv_mem.load("tmp/kv_mem") + print("Loaded caches:") + print(json.dumps(serialize_item(kv_mem.get_all()), indent=2, default=str)) + + +def run_scheduler_example(): + # 使用 MemScheduler 加载主 MOS 配置 + config = parse_yaml( + f"{BASE_DIR}/examples/data/config/mem_scheduler/memos_config_w_scheduler.yaml" + ) + mos_config = MOSConfig(**config) + mos = MOS(mos_config) + + # 创建动态用户 ID + user_id = str(uuid.uuid4()) + mos.create_user(user_id=user_id) + + # 创建 MemCube 配置并导出 + config = GeneralMemCubeConfig.from_yaml_file( + f"{BASE_DIR}/examples/data/config/mem_scheduler/mem_cube_config.yaml" + ) + mem_cube_id = "mem_cube_5" + mem_cube_name_or_path = f"{BASE_DIR}/outputs/mem_scheduler/{user_id}/{mem_cube_id}" + + # 若存在旧目录则删除 + if Path(mem_cube_name_or_path).exists(): + shutil.rmtree(mem_cube_name_or_path) + print(f"{mem_cube_name_or_path} is not empty, and has been removed.") + + # 导出新的 MemCube + mem_cube = GeneralMemCube(config) + mem_cube.dump(mem_cube_name_or_path) + + # 为该用户注册 MemCube + mos.register_mem_cube( + mem_cube_name_or_path=mem_cube_name_or_path, mem_cube_id=mem_cube_id, user_id=user_id + ) + + # Define custom scheduler handlers + def custom_query_handler(messages: list[ScheduleMessageItem]): + for msg in messages: + print(f"\n[scheduler] 用户输入了query: {msg.content}") + # Trigger mem_update manually + new_msg = msg.model_copy(update={"label": MEM_UPDATE_TASK_LABEL}) + mos.mem_scheduler.submit_messages([new_msg]) + + def custom_answer_handler(messages: list[ScheduleMessageItem]): + for msg in messages: + print(f"\n[scheduler] LLM回复了answer:{msg.content}") + + def custom_mem_update_handler(messages: list[ScheduleMessageItem]): + for msg in messages: + mem_cube = mos.mem_cubes.get(msg.mem_cube_id) + if mem_cube and mem_cube.text_mem: + results = mem_cube.text_mem.search(msg.content, top_k=3) + for mem in results: + print( + f"\n[scheduler] transform {mem.metadata.type} to working memory: {mem.memory} " + ) + + # Register custom handlers + mos.mem_scheduler.dispatcher.register_handlers( + { + QUERY_TASK_LABEL: custom_query_handler, + ANSWER_TASK_LABEL: custom_answer_handler, + MEM_UPDATE_TASK_LABEL: custom_mem_update_handler, + } + ) + + # 添加消息 + messages = [ + {"role": "user", "content": "I like playing football."}, + {"role": "assistant", "content": "I like playing football too."}, + ] + mos.add(messages, user_id=user_id, mem_cube_id=mem_cube_id) + + # 聊天循环: 展示 TreeTextMemory 节点 + KVCache + while True: + user_input = input("👤 [You] ").strip() + print() + response = mos.chat(user_input, user_id=user_id) + retrieved_memories = mos.get_all(mem_cube_id=mem_cube_id, user_id=user_id) + + print(f"🤖 [Assistant] {response}") + + # 展示 TreeTextMemory 中的各类型节点 + text_memories = retrieved_memories["text_mem"][0]["memories"] + # Handle different memory structures (NaiveTextMemory returns list, TreeTextMemory returns dict with nodes) + if isinstance(text_memories, dict) and "nodes" in text_memories: + for node in text_memories["nodes"]: + mem_type = node["metadata"].get("memory_type", "Unknown") + print(f"[{mem_type}] {node['memory']}") + elif isinstance(text_memories, list): + for mem in text_memories: + # Naive memory items might not have memory_type metadata, or it might be different + print(f"[TextMemory] {mem.memory if hasattr(mem, 'memory') else mem}") + + +if __name__ == "__main__": + run_scheduler_example() diff --git a/src/memos/llms/hf.py b/src/memos/llms/hf.py index d46db7c9e..7dcf09940 100644 --- a/src/memos/llms/hf.py +++ b/src/memos/llms/hf.py @@ -1,6 +1,8 @@ from collections.abc import Generator from typing import Any +import torch + from transformers import ( AutoModelForCausalLM, AutoTokenizer, @@ -37,9 +39,14 @@ def __init__(self, config: HFLLMConfig): self.config.model_name_or_path = "Qwen/Qwen3-1.7B" # Initialize hf model - self.model = AutoModelForCausalLM.from_pretrained( - self.config.model_name_or_path, torch_dtype="auto", device_map="auto" - ) + if torch.backends.mps.is_available(): + self.model = AutoModelForCausalLM.from_pretrained( + self.config.model_name_or_path, torch_dtype="auto" + ).to("mps") + else: + self.model = AutoModelForCausalLM.from_pretrained( + self.config.model_name_or_path, torch_dtype="auto", device_map="auto" + ) self.tokenizer = AutoTokenizer.from_pretrained( self.config.model_name_or_path, use_fast=True ) diff --git a/src/memos/mem_os/core.py b/src/memos/mem_os/core.py index 1a88fa831..e7f01ec3e 100644 --- a/src/memos/mem_os/core.py +++ b/src/memos/mem_os/core.py @@ -311,7 +311,7 @@ def chat(self, query: str, user_id: str | None = None, base_prompt: str | None = past_key_values = None if self.config.enable_activation_memory: - if self.config.chat_model.backend != "huggingface": + if self.config.chat_model.backend not in ["huggingface", "huggingface_singleton"]: logger.error( "Activation memory only used for huggingface backend. Skipping activation memory." ) @@ -498,7 +498,9 @@ def register_mem_cube( existing_cube = self.user_manager.get_cube(mem_cube_id) # check the embedder is it consistent with MOSConfig - if self.config.mem_reader.config.embedder != ( + if hasattr( + self.mem_cubes[mem_cube_id].text_mem.config, "embedder" + ) and self.config.mem_reader.config.embedder != ( cube_embedder := self.mem_cubes[mem_cube_id].text_mem.config.embedder ): logger.warning( diff --git a/src/memos/mem_os/main.py b/src/memos/mem_os/main.py index 0114fc0da..0dc6ab209 100644 --- a/src/memos/mem_os/main.py +++ b/src/memos/mem_os/main.py @@ -310,7 +310,7 @@ def _generate_enhanced_response_with_context( # Handle activation memory if enabled (same as core method) past_key_values = None if self.config.enable_activation_memory: - if self.config.chat_model.backend != "huggingface": + if self.config.chat_model.backend not in ["huggingface", "huggingface_singleton"]: logger.error( "Activation memory only used for huggingface backend. Skipping activation memory." ) diff --git a/src/memos/mem_os/utils/format_utils.py b/src/memos/mem_os/utils/format_utils.py index 5fdb59058..f6e33bb31 100644 --- a/src/memos/mem_os/utils/format_utils.py +++ b/src/memos/mem_os/utils/format_utils.py @@ -1087,38 +1087,64 @@ def convert_activation_memory_to_serializable( serializable_items = [] for item in act_mem_items: + key_layers = 0 + val_layers = 0 + device = "unknown" + dtype = "unknown" + key_shapes = [] + value_shapes = [] + + if item.memory: + if hasattr(item.memory, "layers"): + key_layers = len(item.memory.layers) + val_layers = len(item.memory.layers) + if key_layers > 0: + l0 = item.memory.layers[0] + k0 = getattr(l0, "key_cache", getattr(l0, "keys", None)) + if k0 is not None: + device = str(k0.device) + dtype = str(k0.dtype) + + for i, layer in enumerate(item.memory.layers): + k = getattr(layer, "key_cache", getattr(layer, "keys", None)) + v = getattr(layer, "value_cache", getattr(layer, "values", None)) + if k is not None: + key_shapes.append({"layer": i, "shape": list(k.shape)}) + if v is not None: + value_shapes.append({"layer": i, "shape": list(v.shape)}) + + elif hasattr(item.memory, "key_cache"): + key_layers = len(item.memory.key_cache) + val_layers = len(item.memory.value_cache) + if key_layers > 0 and item.memory.key_cache[0] is not None: + device = str(item.memory.key_cache[0].device) + dtype = str(item.memory.key_cache[0].dtype) + + for i, key_tensor in enumerate(item.memory.key_cache): + if key_tensor is not None: + key_shapes.append({"layer": i, "shape": list(key_tensor.shape)}) + + for i, val_tensor in enumerate(item.memory.value_cache): + if val_tensor is not None: + value_shapes.append({"layer": i, "shape": list(val_tensor.shape)}) + # Extract basic information that can be serialized serializable_item = { "id": item.id, "metadata": item.metadata, "memory_info": { "type": "DynamicCache", - "key_cache_layers": len(item.memory.key_cache) if item.memory else 0, - "value_cache_layers": len(item.memory.value_cache) if item.memory else 0, - "device": str(item.memory.key_cache[0].device) - if item.memory and item.memory.key_cache - else "unknown", - "dtype": str(item.memory.key_cache[0].dtype) - if item.memory and item.memory.key_cache - else "unknown", + "key_cache_layers": key_layers, + "value_cache_layers": val_layers, + "device": device, + "dtype": dtype, }, } # Add tensor shape information if available - if item.memory and item.memory.key_cache: - key_shapes = [] - value_shapes = [] - - for i, key_tensor in enumerate(item.memory.key_cache): - if key_tensor is not None: - key_shapes.append({"layer": i, "shape": list(key_tensor.shape)}) - - if i < len(item.memory.value_cache) and item.memory.value_cache[i] is not None: - value_shapes.append( - {"layer": i, "shape": list(item.memory.value_cache[i].shape)} - ) - + if key_shapes: serializable_item["memory_info"]["key_shapes"] = key_shapes + if value_shapes: serializable_item["memory_info"]["value_shapes"] = value_shapes serializable_items.append(serializable_item) @@ -1144,7 +1170,19 @@ def convert_activation_memory_summary(act_mem_items: list[KVCacheItem]) -> dict[ total_parameters = 0 for item in act_mem_items: - if item.memory and item.memory.key_cache: + if not item.memory: + continue + + if hasattr(item.memory, "layers"): + total_layers += len(item.memory.layers) + for layer in item.memory.layers: + k = getattr(layer, "key_cache", getattr(layer, "keys", None)) + v = getattr(layer, "value_cache", getattr(layer, "values", None)) + if k is not None: + total_parameters += k.numel() + if v is not None: + total_parameters += v.numel() + elif hasattr(item.memory, "key_cache"): total_layers += len(item.memory.key_cache) # Calculate approximate parameter count diff --git a/src/memos/mem_reader/simple_struct.py b/src/memos/mem_reader/simple_struct.py index 70472958e..61a7d2b6d 100644 --- a/src/memos/mem_reader/simple_struct.py +++ b/src/memos/mem_reader/simple_struct.py @@ -618,7 +618,7 @@ def _read_memory( messages=combined_messages, memory_list=original_memory_group, user_only=os.getenv("SIMPLE_STRUCT_REWRITE_USER_ONLY", "true").lower() - == "true", + == "false", ) serialized_revised_memories = json.dumps( [one.memory for one in revised_memory_list], indent=2 diff --git a/src/memos/mem_scheduler/base_scheduler.py b/src/memos/mem_scheduler/base_scheduler.py index a2621eefc..3f5c90b67 100644 --- a/src/memos/mem_scheduler/base_scheduler.py +++ b/src/memos/mem_scheduler/base_scheduler.py @@ -74,6 +74,7 @@ from memos.mem_scheduler.webservice_modules.redis_service import RedisSchedulerModule from memos.memories.activation.kv import KVCacheMemory from memos.memories.activation.vllmkv import VLLMKVCacheItem, VLLMKVCacheMemory +from memos.memories.textual.naive import NaiveTextMemory from memos.memories.textual.tree import TextualMemoryItem, TreeTextMemory from memos.memories.textual.tree_text_memory.retrieve.searcher import Searcher from memos.templates.mem_scheduler_prompts import MEMORY_ASSEMBLY_TEMPLATE @@ -198,13 +199,16 @@ def init_mem_cube( logger.error("mem_cube is None, cannot initialize", stack_info=True) self.mem_cube = mem_cube self.text_mem: TreeTextMemory = self.mem_cube.text_mem - self.reranker: HTTPBGEReranker = self.text_mem.reranker + self.reranker: HTTPBGEReranker = getattr(self.text_mem, "reranker", None) if searcher is None: - self.searcher: Searcher = self.text_mem.get_searcher( - manual_close_internet=os.getenv("ENABLE_INTERNET", "true").lower() == "false", - moscube=False, - process_llm=self.process_llm, - ) + if hasattr(self.text_mem, "get_searcher"): + self.searcher: Searcher = self.text_mem.get_searcher( + manual_close_internet=os.getenv("ENABLE_INTERNET", "true").lower() == "false", + moscube=False, + process_llm=self.process_llm, + ) + else: + self.searcher = None else: self.searcher = searcher self.feedback_server = feedback_server @@ -540,6 +544,29 @@ def replace_working_memory( mem_cube=mem_cube, log_func_callback=self._submit_web_logs, ) + elif isinstance(text_mem_base, NaiveTextMemory): + # For NaiveTextMemory, we populate the monitors with the new candidates so activation memory can pick them up + logger.info( + f"NaiveTextMemory: Updating working memory monitors with {len(new_memory)} candidates." + ) + + # Use query keywords if available, otherwise just basic monitoring + query_db_manager = self.monitor.query_monitors[user_id][mem_cube_id] + query_db_manager.sync_with_orm() + query_keywords = query_db_manager.obj.get_keywords_collections() + + new_working_memory_monitors = self.transform_working_memories_to_monitors( + query_keywords=query_keywords, + memories=new_memory, + ) + + self.monitor.update_working_memory_monitors( + new_working_memory_monitors=new_working_memory_monitors, + user_id=user_id, + mem_cube_id=mem_cube_id, + mem_cube=mem_cube, + ) + memories_with_new_order = new_memory else: logger.error("memory_base is not supported") memories_with_new_order = new_memory diff --git a/src/memos/mem_scheduler/general_modules/scheduler_logger.py b/src/memos/mem_scheduler/general_modules/scheduler_logger.py index 57d78676f..fd83ec86f 100644 --- a/src/memos/mem_scheduler/general_modules/scheduler_logger.py +++ b/src/memos/mem_scheduler/general_modules/scheduler_logger.py @@ -55,7 +55,11 @@ def create_autofilled_log_item( "mem_cube is None — this should not happen in production!", stack_info=True ) text_mem_base: TreeTextMemory = mem_cube.text_mem - current_memory_sizes = text_mem_base.get_current_memory_size(user_name=mem_cube_id) + + current_memory_sizes = {} + if hasattr(text_mem_base, "get_current_memory_size"): + current_memory_sizes = text_mem_base.get_current_memory_size(user_name=mem_cube_id) + current_memory_sizes = { "long_term_memory_size": current_memory_sizes.get("LongTermMemory", 0), "user_memory_size": current_memory_sizes.get("UserMemory", 0), @@ -63,14 +67,32 @@ def create_autofilled_log_item( "transformed_act_memory_size": NOT_INITIALIZED, "parameter_memory_size": NOT_INITIALIZED, } + memory_capacities = { - "long_term_memory_capacity": text_mem_base.memory_manager.memory_size["LongTermMemory"], - "user_memory_capacity": text_mem_base.memory_manager.memory_size["UserMemory"], - "working_memory_capacity": text_mem_base.memory_manager.memory_size["WorkingMemory"], + "long_term_memory_capacity": 0, + "user_memory_capacity": 0, + "working_memory_capacity": 0, "transformed_act_memory_capacity": NOT_INITIALIZED, "parameter_memory_capacity": NOT_INITIALIZED, } + if hasattr(text_mem_base, "memory_manager") and hasattr( + text_mem_base.memory_manager, "memory_size" + ): + memory_capacities.update( + { + "long_term_memory_capacity": text_mem_base.memory_manager.memory_size.get( + "LongTermMemory", 0 + ), + "user_memory_capacity": text_mem_base.memory_manager.memory_size.get( + "UserMemory", 0 + ), + "working_memory_capacity": text_mem_base.memory_manager.memory_size.get( + "WorkingMemory", 0 + ), + } + ) + if hasattr(self, "monitor"): if ( user_id in self.monitor.activation_memory_monitors diff --git a/src/memos/mem_scheduler/general_scheduler.py b/src/memos/mem_scheduler/general_scheduler.py index 86066f346..9b19e9ecb 100644 --- a/src/memos/mem_scheduler/general_scheduler.py +++ b/src/memos/mem_scheduler/general_scheduler.py @@ -34,6 +34,7 @@ is_cloud_env, ) from memos.memories.textual.item import TextualMemoryItem +from memos.memories.textual.naive import NaiveTextMemory from memos.memories.textual.preference import PreferenceTextMemory from memos.memories.textual.tree import TreeTextMemory from memos.types import ( @@ -846,7 +847,9 @@ def _process_memories_with_reader( memory_item = text_mem.get(mem_id, user_name=user_name) memory_items.append(memory_item) except Exception as e: - logger.warning(f"Failed to get memory {mem_id}: {e}") + logger.warning( + f"[_process_memories_with_reader] Failed to get memory {mem_id}: {e}" + ) continue if not memory_items: @@ -1364,22 +1367,31 @@ def process_session_turn( text_mem_base = mem_cube.text_mem if not isinstance(text_mem_base, TreeTextMemory): - logger.error( - f"Not implemented! Expected TreeTextMemory but got {type(text_mem_base).__name__} " - f"for mem_cube_id={mem_cube_id}, user_id={user_id}. " - f"text_mem_base value: {text_mem_base}", - exc_info=True, + if isinstance(text_mem_base, NaiveTextMemory): + logger.debug( + f"NaiveTextMemory used for mem_cube_id={mem_cube_id}, processing session turn with simple search." + ) + # Treat NaiveTextMemory similar to TreeTextMemory but with simpler logic + # We will perform retrieval to get "working memory" candidates for activation memory + # But we won't have a distinct "current working memory" + cur_working_memory = [] + else: + logger.warning( + f"Not implemented! Expected TreeTextMemory but got {type(text_mem_base).__name__} " + f"for mem_cube_id={mem_cube_id}, user_id={user_id}. " + f"text_mem_base value: {text_mem_base}" + ) + return [], [] + else: + cur_working_memory: list[TextualMemoryItem] = text_mem_base.get_working_memory( + user_name=mem_cube_id ) - return + cur_working_memory = cur_working_memory[:top_k] logger.info( f"[process_session_turn] Processing {len(queries)} queries for user_id={user_id}, mem_cube_id={mem_cube_id}" ) - cur_working_memory: list[TextualMemoryItem] = text_mem_base.get_working_memory( - user_name=mem_cube_id - ) - cur_working_memory = cur_working_memory[:top_k] text_working_memory: list[str] = [w_m.memory for w_m in cur_working_memory] intent_result = self.monitor.detect_intent( q_list=queries, text_working_memory=text_working_memory @@ -1419,15 +1431,28 @@ def process_session_turn( ) search_args = {} - results: list[TextualMemoryItem] = self.retriever.search( - query=item, - user_id=user_id, - mem_cube_id=mem_cube_id, - mem_cube=mem_cube, - top_k=k_per_evidence, - method=self.search_method, - search_args=search_args, - ) + if isinstance(text_mem_base, NaiveTextMemory): + # NaiveTextMemory doesn't support complex search args usually, but let's see + # self.retriever.search calls mem_cube.text_mem.search + # NaiveTextMemory.search takes query and top_k + # SchedulerRetriever.search handles method dispatch + # For NaiveTextMemory, we might need to bypass retriever or extend it + # But let's try calling naive memory directly if retriever fails or doesn't support it + try: + results = text_mem_base.search(query=item, top_k=k_per_evidence) + except Exception as e: + logger.warning(f"NaiveTextMemory search failed: {e}") + results = [] + else: + results: list[TextualMemoryItem] = self.retriever.search( + query=item, + user_id=user_id, + mem_cube_id=mem_cube_id, + mem_cube=mem_cube, + top_k=k_per_evidence, + method=self.search_method, + search_args=search_args, + ) logger.info( f"[process_session_turn] Search results for missing evidence '{item}': " diff --git a/src/memos/mem_scheduler/monitors/general_monitor.py b/src/memos/mem_scheduler/monitors/general_monitor.py index b097b1e2d..d75d6ee75 100644 --- a/src/memos/mem_scheduler/monitors/general_monitor.py +++ b/src/memos/mem_scheduler/monitors/general_monitor.py @@ -200,15 +200,19 @@ def update_working_memory_monitors( mem_cube_id: str, mem_cube: GeneralMemCube, ): - text_mem_base: TreeTextMemory = mem_cube.text_mem - assert isinstance(text_mem_base, TreeTextMemory) - self.working_mem_monitor_capacity = min( - DEFAULT_WORKING_MEM_MONITOR_SIZE_LIMIT, - ( - int(text_mem_base.memory_manager.memory_size["WorkingMemory"]) - + self.partial_retention_number - ), - ) + text_mem_base = mem_cube.text_mem + + if isinstance(text_mem_base, TreeTextMemory): + self.working_mem_monitor_capacity = min( + DEFAULT_WORKING_MEM_MONITOR_SIZE_LIMIT, + ( + int(text_mem_base.memory_manager.memory_size["WorkingMemory"]) + + self.partial_retention_number + ), + ) + else: + # Fallback for NaiveTextMemory and others + self.working_mem_monitor_capacity = DEFAULT_WORKING_MEM_MONITOR_SIZE_LIMIT # register monitors self.register_memory_manager_if_not_exists( diff --git a/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py b/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py index 2f4318003..941c52164 100644 --- a/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py +++ b/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py @@ -787,7 +787,7 @@ def qsize(self) -> dict: Total number of messages across all matching streams. """ if not self._redis_conn: - return 0 + return {} total_size = 0 try: diff --git a/src/memos/memories/activation/kv.py b/src/memos/memories/activation/kv.py index 98d611dbf..1981b958f 100644 --- a/src/memos/memories/activation/kv.py +++ b/src/memos/memories/activation/kv.py @@ -2,9 +2,7 @@ import pickle from datetime import datetime -from importlib.metadata import version -from packaging.version import Version from transformers import DynamicCache from memos.configs.memory import KVCacheMemoryConfig @@ -211,10 +209,24 @@ def _concat_caches(self, caches: list[DynamicCache]) -> DynamicCache: return caches[0] merged = DynamicCache() - num_layers = len(caches[0].key_cache) - if Version(version("transformers")) >= Version("4.54.0"): - merged.append_new_layers(num_layers - 1) + # Check for new structure (layers) + if hasattr(caches[0], "layers"): + num_layers = len(caches[0].layers) + + # Ensure merged has layers attribute and populate it + if not hasattr(merged, "layers"): + merged.layers = [] + + if num_layers > 0: + # Get the class of the layer from the first cache + # We assume all caches use the same layer class + layer_cls = type(caches[0].layers[0]) + + # Populate merged.layers + while len(merged.layers) < num_layers: + merged.layers.append(layer_cls()) + for layer in range(num_layers): # gather all K and V for this layer keys = [c.layers[layer].keys for c in caches] @@ -223,7 +235,10 @@ def _concat_caches(self, caches: list[DynamicCache]) -> DynamicCache: merged.layers[layer].keys = torch.cat(keys, dim=-2) merged.layers[layer].values = torch.cat(vals, dim=-2) - else: + # Check for old structure (key_cache) + elif hasattr(caches[0], "key_cache"): + num_layers = len(caches[0].key_cache) + for layer in range(num_layers): # gather all K and V for this layer keys = [c.key_cache[layer] for c in caches] @@ -232,6 +247,11 @@ def _concat_caches(self, caches: list[DynamicCache]) -> DynamicCache: merged.key_cache.append(torch.cat(keys, dim=-2)) merged.value_cache.append(torch.cat(vals, dim=-2)) + else: + raise AttributeError( + "DynamicCache object has neither 'layers' nor 'key_cache' attributes" + ) + return merged From e9b60db165c98e6a8f70602e2c838bdf004adc78 Mon Sep 17 00:00:00 2001 From: chentang Date: Fri, 26 Dec 2025 17:57:04 +0800 Subject: [PATCH 17/53] fix: address the issue of Top-level import of unavailable module 'torch' --- src/memos/llms/hf.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/memos/llms/hf.py b/src/memos/llms/hf.py index 7dcf09940..b5fc4ba13 100644 --- a/src/memos/llms/hf.py +++ b/src/memos/llms/hf.py @@ -1,16 +1,8 @@ from collections.abc import Generator from typing import Any -import torch - from transformers import ( - AutoModelForCausalLM, - AutoTokenizer, DynamicCache, - LogitsProcessorList, - TemperatureLogitsWarper, - TopKLogitsWarper, - TopPLogitsWarper, ) from memos.configs.llm import HFLLMConfig @@ -32,6 +24,17 @@ def __init__(self, config: HFLLMConfig): """ Initialize the HFLLM model and tokenizer, and set up logits processors for sampling. """ + import torch + + from transformers import ( + AutoModelForCausalLM, + AutoTokenizer, + LogitsProcessorList, + TemperatureLogitsWarper, + TopKLogitsWarper, + TopPLogitsWarper, + ) + self.config = config # Default model if not specified @@ -362,6 +365,7 @@ def build_kv_cache(self, messages) -> DynamicCache: DynamicCache: The constructed KV cache object. """ import torch + import transformers # Accept multiple input types and convert to standard chat messages if isinstance(messages, str): @@ -398,7 +402,7 @@ def build_kv_cache(self, messages) -> DynamicCache: # Convert from legacy tuple format to DynamicCache if needed if isinstance(kv, tuple): - kv = DynamicCache.from_legacy_cache(kv) + kv = transformers.DynamicCache.from_legacy_cache(kv) # Handle compatibility between old and new transformers versions # In newer versions, DynamicCache uses 'layers' attribute From c6bdb22e14a13481b85cc96166d06d630dfc3c39 Mon Sep 17 00:00:00 2001 From: chentang Date: Fri, 26 Dec 2025 18:13:47 +0800 Subject: [PATCH 18/53] fix: resolve linting errors and make optional dependencies lazy loaded - Fix ambiguous characters and commented-out code in examples/mem_scheduler/quick_start_examples.py - Fix nested if statements in src/memos/mem_os/core.py - Move torch and transformers imports to method scope in src/memos/llms/hf.py to support optional dependencies - Update tests/llms/test_hf.py to patch transformers module directly --- tests/llms/test_hf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/llms/test_hf.py b/tests/llms/test_hf.py index 595995ad1..375bf2247 100644 --- a/tests/llms/test_hf.py +++ b/tests/llms/test_hf.py @@ -11,8 +11,8 @@ from memos.llms.hf import HFLLM -@patch("memos.llms.hf.AutoModelForCausalLM", MagicMock()) -@patch("memos.llms.hf.AutoTokenizer", MagicMock()) +@patch("transformers.AutoModelForCausalLM", MagicMock()) +@patch("transformers.AutoTokenizer", MagicMock()) class TestHFLLM(unittest.TestCase): def setUp(self): self.mock_inputs = MagicMock() From ad3620aaceb240403c5831a0d729222b1708669f Mon Sep 17 00:00:00 2001 From: chentang Date: Mon, 29 Dec 2025 20:51:19 +0800 Subject: [PATCH 19/53] refactor: revise the rewrite prompt to make it better --- src/memos/templates/mem_reader_prompts.py | 35 ++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/memos/templates/mem_reader_prompts.py b/src/memos/templates/mem_reader_prompts.py index 40971c77e..26795a2b1 100644 --- a/src/memos/templates/mem_reader_prompts.py +++ b/src/memos/templates/mem_reader_prompts.py @@ -622,7 +622,7 @@ 专注于从图像中提取事实性、可观察的信息。除非与用户记忆明显相关,否则避免推测。""" -SIMPLE_STRUCT_REWRITE_MEMORY_PROMPT = """ +SIMPLE_STRUCT_REWRITE_MEMORY_PROMPT_BACKUP = """ You are a strict, language-preserving memory validator and rewriter. Your task is to eliminate hallucinations and tighten memories by grounding them strictly in the user’s explicit messages. Memories must be factual, unambiguous, and free of any inferred or speculative content. @@ -655,6 +655,39 @@ Important: Output **only** the JSON. No extra text, explanations, markdown, or fields. """ +SIMPLE_STRUCT_REWRITE_MEMORY_PROMPT = """ +You are a strict, language-preserving memory validator and rewriter. + +Your task is to eliminate hallucinations and tighten memories by grounding them strictly in the user’s explicit messages. Memories must be factual, unambiguous, and free of any inferred or speculative content. + +Rules: +1. **Language Consistency**: Keep the exact original language of each memory—no translation or language switching. +2. **Strict Factual Grounding**: Include only what is explicitly stated by the user in messages marked as [user]. Remove or flag anything not directly present in the user’s utterances—no assumptions, interpretations, predictions, generalizations, or content originating solely from [assistant]. +3. **Source Attribution Requirement**: + - Every memory must be clearly traceable to its source: + - If a fact appears **only in [assistant] messages** and **is not affirmed by [user]**, label it as “[assistant] memory”. + - If [assistant] states something and [user] explicitly contradicts or denies it, label it as “[assistant] memory, but [user] [brief quote or summary of denial]”. + - If a fact is stated by [user] —whether or not [assistant] also mentions it— it is attributed to “[user]” and may be retained without qualification. +4. **Timestamp Exception**: Memories may include timestamps (e.g., "On December 19, 2026") derived from conversation metadata. If such a date likely reflects the conversation time (even if not in the `messages` list), do NOT treat it as hallucinated—but still attribute it to “[user]” only if the user mentioned or confirmed the date. + +Inputs: +messages: +{messages_inline} + +memories: +{memories_inline} + +Output Format: +- Return a JSON object with string keys ("0", "1", "2", ...) matching input memory indices. +- Each value must be: {{ "need_rewrite": boolean, "rewritten": string, "reason": string }} +- The "reason" must be brief and precise, e.g.: + - "contains unsupported inference from [assistant]" + - "[assistant] memory, but [user] said 'I don't have a dog'" + - "fully grounded in [user]" + +Important: Output **only** the JSON. No extra text, explanations, markdown, or fields. +""" + SIMPLE_STRUCT_REWRITE_MEMORY_USER_ONLY_PROMPT = """ You are a strict, language-preserving memory validator and rewriter. From 24752864e4870961fdc43fc814713725acec7432 Mon Sep 17 00:00:00 2001 From: chentang Date: Tue, 30 Dec 2025 10:57:35 +0800 Subject: [PATCH 20/53] refactor: update examples --- .../mem_scheduler/quick_start_examples.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/examples/mem_scheduler/quick_start_examples.py b/examples/mem_scheduler/quick_start_examples.py index c4142d2cd..c71869e76 100644 --- a/examples/mem_scheduler/quick_start_examples.py +++ b/examples/mem_scheduler/quick_start_examples.py @@ -18,6 +18,7 @@ MEM_UPDATE_TASK_LABEL, QUERY_TASK_LABEL, ) +from memos.mem_scheduler.utils.db_utils import get_utc_now from memos.mem_scheduler.utils.misc_utils import parse_yaml from memos.memories.activation.item import KVCacheItem from memos.memories.factory import MemoryFactory @@ -186,17 +187,27 @@ def custom_query_handler(messages: list[ScheduleMessageItem]): def custom_answer_handler(messages: list[ScheduleMessageItem]): for msg in messages: + mem_cube = mos.mem_cubes.get(msg.mem_cube_id) + kv_mem = mem_cube.act_mem + for cache_item in kv_mem.get_all(): + print( + f"[scheduler] act memory: {get_cache_info(cache_item.memory)} ({cache_item.records})" + ) print(f"\n[scheduler] LLM回复了answer:{msg.content}") def custom_mem_update_handler(messages: list[ScheduleMessageItem]): for msg in messages: mem_cube = mos.mem_cubes.get(msg.mem_cube_id) + kv_mem = mem_cube.act_mem if mem_cube and mem_cube.text_mem: results = mem_cube.text_mem.search(msg.content, top_k=3) for mem in results: - print( - f"\n[scheduler] transform {mem.metadata.type} to working memory: {mem.memory} " - ) + print(f"\n[scheduler] searched memories: {mem.memory}") + + cache_item = kv_mem.extract(mem.memory) + cache_item.records.text_memories = [mem.memory] + cache_item.records.timestamp = get_utc_now() + kv_mem.add([cache_item]) # Register custom handlers mos.mem_scheduler.dispatcher.register_handlers( @@ -237,4 +248,6 @@ def custom_mem_update_handler(messages: list[ScheduleMessageItem]): if __name__ == "__main__": + kv_cache_only() + run_scheduler_example() From a196dcbc0eb1b9da7ed21231cc0f2a048ab0d86b Mon Sep 17 00:00:00 2001 From: chentang Date: Tue, 30 Dec 2025 15:12:40 +0800 Subject: [PATCH 21/53] refactor: update examples for scheduler --- .../mem_scheduler/quick_start_examples.py | 139 ++++++++++++------ 1 file changed, 98 insertions(+), 41 deletions(-) diff --git a/examples/mem_scheduler/quick_start_examples.py b/examples/mem_scheduler/quick_start_examples.py index c71869e76..fbfef4d76 100644 --- a/examples/mem_scheduler/quick_start_examples.py +++ b/examples/mem_scheduler/quick_start_examples.py @@ -145,106 +145,163 @@ def kv_cache_only(): def run_scheduler_example(): - # 使用 MemScheduler 加载主 MOS 配置 - config = parse_yaml( - f"{BASE_DIR}/examples/data/config/mem_scheduler/memos_config_w_scheduler.yaml" - ) + # 使用 MemScheduler 加载主 MOS(Memory-Oriented System)配置文件 + config = parse_yaml("./examples/data/config/mem_scheduler/memos_config_w_scheduler.yaml") + # 将解析出的配置字典传入 MOSConfig 构造器, 构建配置对象 mos_config = MOSConfig(**config) + # 使用配置对象初始化 MOS 系统实例 mos = MOS(mos_config) - # 创建动态用户 ID + # 生成一个唯一的动态用户 ID(使用 UUID4) user_id = str(uuid.uuid4()) + # 在 MOS 系统中为该用户创建账户 mos.create_user(user_id=user_id) - # 创建 MemCube 配置并导出 + # 从 YAML 文件加载 MemCube(记忆立方体)的通用配置 config = GeneralMemCubeConfig.from_yaml_file( - f"{BASE_DIR}/examples/data/config/mem_scheduler/mem_cube_config.yaml" + "./examples/data/config/mem_scheduler/mem_cube_config.yaml" ) + # 定义 MemCube 的唯一标识符 mem_cube_id = "mem_cube_5" - mem_cube_name_or_path = f"{BASE_DIR}/outputs/mem_scheduler/{user_id}/{mem_cube_id}" + # 定义 MemCube 的本地存储路径(路径中包含用户 ID 和 MemCube ID) + mem_cube_name_or_path = f"./outputs/mem_scheduler/{user_id}/{mem_cube_id}" - # 若存在旧目录则删除 + # 如果该路径已存在, 则先删除旧目录 if Path(mem_cube_name_or_path).exists(): shutil.rmtree(mem_cube_name_or_path) - print(f"{mem_cube_name_or_path} is not empty, and has been removed.") + print(f"{mem_cube_name_or_path} 目录非空,已被删除。") - # 导出新的 MemCube + # 根据加载的配置创建一个新的 MemCube 实例 mem_cube = GeneralMemCube(config) + # 将该 MemCube 实例序列化并保存到指定路径 mem_cube.dump(mem_cube_name_or_path) - # 为该用户注册 MemCube + # 在 MOS 系统中为当前用户注册这个 MemCube mos.register_mem_cube( mem_cube_name_or_path=mem_cube_name_or_path, mem_cube_id=mem_cube_id, user_id=user_id ) - # Define custom scheduler handlers + # 定义一个辅助函数, 用于获取缓存(如 KV Cache)的内存信息 + def get_cache_info(cache): + # 如果缓存为空, 则直接返回 None + if not cache: + return None + + num_layers = 0 # 记录缓存的层数 + total_size_bytes = 0 # 记录总字节数 + + # 情况一: 缓存结构包含 layers 属性(如 HuggingFace 的缓存格式) + if hasattr(cache, "layers"): + num_layers = len(cache.layers) + for layer in cache.layers: + # 统计 key_cache 的内存占用(如果存在) + if hasattr(layer, "key_cache") and layer.key_cache is not None: + total_size_bytes += layer.key_cache.nelement() * layer.key_cache.element_size() + # 统计 value_cache 的内存占用(如果存在) + if hasattr(layer, "value_cache") and layer.value_cache is not None: + total_size_bytes += ( + layer.value_cache.nelement() * layer.value_cache.element_size() + ) + + # 兼容其他可能的缓存命名方式(如 keys/values) + if hasattr(layer, "keys") and layer.keys is not None: + total_size_bytes += layer.keys.nelement() * layer.keys.element_size() + if hasattr(layer, "values") and layer.values is not None: + total_size_bytes += layer.values.nelement() * layer.values.element_size() + + # 情况二: 缓存结构直接包含 key_cache 和 value_cache 列表(如某些自定义格式) + elif hasattr(cache, "key_cache") and hasattr(cache, "value_cache"): + num_layers = len(cache.key_cache) + for k, v in zip(cache.key_cache, cache.value_cache, strict=False): + if k is not None: + total_size_bytes += k.nelement() * k.element_size() + if v is not None: + total_size_bytes += v.nelement() * v.element_size() + + # 返回结构化的缓存信息, 包括层数, 字节数和以 MB 为单位的可读格式 + return { + "num_layers": num_layers, + "size_bytes": total_size_bytes, + "size_mb": f"{total_size_bytes / (1024 * 1024):.2f} MB", + } + + # 定义自定义的查询(query)处理函数 def custom_query_handler(messages: list[ScheduleMessageItem]): for msg in messages: - print(f"\n[scheduler] 用户输入了query: {msg.content}") - # Trigger mem_update manually + # 打印用户输入内容 + print(f"\n[scheduler] 用户输入了查询:{msg.content}") + # 手动构造一个带有 MEM_UPDATE 标签的新消息, 用于触发记忆更新 new_msg = msg.model_copy(update={"label": MEM_UPDATE_TASK_LABEL}) + # 将该消息提交给调度器处理 mos.mem_scheduler.submit_messages([new_msg]) + # 定义自定义的回答(answer)处理函数 def custom_answer_handler(messages: list[ScheduleMessageItem]): for msg in messages: - mem_cube = mos.mem_cubes.get(msg.mem_cube_id) - kv_mem = mem_cube.act_mem - for cache_item in kv_mem.get_all(): - print( - f"[scheduler] act memory: {get_cache_info(cache_item.memory)} ({cache_item.records})" - ) - print(f"\n[scheduler] LLM回复了answer:{msg.content}") + # 打印 LLM 的回复内容 + print(f"\n[scheduler] LLM 回复了答案:{msg.content}") + # 定义自定义的记忆更新(mem_update)处理函数 def custom_mem_update_handler(messages: list[ScheduleMessageItem]): for msg in messages: mem_cube = mos.mem_cubes.get(msg.mem_cube_id) kv_mem = mem_cube.act_mem + # 如果该 MemCube 配置了文本记忆(TreeTextMemory / NaiveTextMemory) if mem_cube and mem_cube.text_mem: + # 在文本记忆中搜索与当前内容相关的记忆(返回 top_k=3 条) results = mem_cube.text_mem.search(msg.content, top_k=3) for mem in results: - print(f"\n[scheduler] searched memories: {mem.memory}") - + print(f"\n[scheduler] 检索到的记忆:{mem.memory}") + print("\n[scheduler] 转换为激活记忆......") + # 从文本记忆中提取对应的 KV 缓存项 cache_item = kv_mem.extract(mem.memory) + # 附加元信息 cache_item.records.text_memories = [mem.memory] cache_item.records.timestamp = get_utc_now() + # 将该缓存项添加到激活记忆中 kv_mem.add([cache_item]) + print("\n[scheduler] 完成!") - # Register custom handlers + # 将上述三个自定义处理器注册到调度器的分发器中, 分别对应不同任务标签 mos.mem_scheduler.dispatcher.register_handlers( { - QUERY_TASK_LABEL: custom_query_handler, - ANSWER_TASK_LABEL: custom_answer_handler, - MEM_UPDATE_TASK_LABEL: custom_mem_update_handler, + QUERY_TASK_LABEL: custom_query_handler, # 查询任务 + ANSWER_TASK_LABEL: custom_answer_handler, # 回答任务 + MEM_UPDATE_TASK_LABEL: custom_mem_update_handler, # 记忆更新任务 } ) - # 添加消息 + # 初始添加两条测试消息(用户和助手的对话)到系统中 messages = [ {"role": "user", "content": "I like playing football."}, {"role": "assistant", "content": "I like playing football too."}, ] mos.add(messages, user_id=user_id, mem_cube_id=mem_cube_id) - # 聊天循环: 展示 TreeTextMemory 节点 + KVCache + # 进入聊天循环: 展示 TreeTextMemory 的记忆节点结构 + KV Cache 的状态 while True: + # 获取用户输入并去除首尾空格 user_input = input("👤 [You] ").strip() print() + # 调用 MOS 系统进行聊天响应 response = mos.chat(user_input, user_id=user_id) + # 获取该用户当前 MemCube 中的所有记忆内容 retrieved_memories = mos.get_all(mem_cube_id=mem_cube_id, user_id=user_id) + # 打印助手的回复 print(f"🤖 [Assistant] {response}") - # 展示 TreeTextMemory 中的各类型节点 - text_memories = retrieved_memories["text_mem"][0]["memories"] - # Handle different memory structures (NaiveTextMemory returns list, TreeTextMemory returns dict with nodes) - if isinstance(text_memories, dict) and "nodes" in text_memories: - for node in text_memories["nodes"]: - mem_type = node["metadata"].get("memory_type", "Unknown") - print(f"[{mem_type}] {node['memory']}") - elif isinstance(text_memories, list): - for mem in text_memories: - # Naive memory items might not have memory_type metadata, or it might be different - print(f"[TextMemory] {mem.memory if hasattr(mem, 'memory') else mem}") + # 获取文本记忆部分 - TreeTextMemory + memories = retrieved_memories["text_mem"][0]["memories"] + for mem in memories: + print(f"[文本记忆] {mem.memory}") + + # 获取对应的 MemCube 和其激活记忆(KV Cache) + mem_cube = mos.mem_scheduler.mem_cube + kv_mem = mem_cube.act_mem + # 遍历所有激活记忆项, 打印其缓存信息和记录 + for cache_item in kv_mem.get_all(): + print(f"[激活记忆] {get_cache_info(cache_item.memory)} (记录:{cache_item.records})") if __name__ == "__main__": From 6139af87d0101e73b33ee1160aef3af4c0a2c9d2 Mon Sep 17 00:00:00 2001 From: chentang Date: Tue, 6 Jan 2026 10:48:44 +0800 Subject: [PATCH 22/53] fix bugs: address the unsupported xautoclaim command when redis version larger than 6.2.0 via adding a new feature of manul auto claim with the combination of xpending + xclaim --- .../task_schedule_modules/redis_queue.py | 270 ++++++++++++++---- 1 file changed, 222 insertions(+), 48 deletions(-) diff --git a/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py b/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py index 941c52164..3d233cfa4 100644 --- a/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py +++ b/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py @@ -81,6 +81,7 @@ def __init__( # Consumer state self._is_listening = False self._message_handler: Callable[[ScheduleMessageItem], None] | None = None + self.supports_xautoclaim = False # Connection state self._is_connected = False @@ -105,6 +106,7 @@ def __init__( # Auto-initialize Redis connection if self.auto_initialize_redis(): self._is_connected = True + self._check_xautoclaim_support() self.seen_streams = set() @@ -143,6 +145,33 @@ def __init__( logger.debug(f"Initial stream keys refresh failed: {e}") self._start_stream_keys_refresh_thread() + def _check_xautoclaim_support(self): + """Check if the Redis server supports xautoclaim (v6.2+).""" + if not self._redis_conn: + return + + try: + info = self._redis_conn.info("server") + version_str = info.get("redis_version", "0.0.0") + # Simple version parsing + parts = [int(p) for p in version_str.split(".") if p.isdigit()] + while len(parts) < 3: + parts.append(0) + + major, minor, _ = parts[:3] + if major > 6 or (major == 6 and minor >= 2): + self.supports_xautoclaim = True + else: + self.supports_xautoclaim = False + + logger.info( + f"[REDIS_QUEUE] Redis version {version_str}. " + f"Supports xautoclaim: {self.supports_xautoclaim}" + ) + except Exception as e: + logger.warning(f"Failed to check Redis version: {e}") + self.supports_xautoclaim = False + def get_stream_key(self, user_id: str, mem_cube_id: str, task_label: str) -> str: stream_key = f"{self.stream_key_prefix}:{user_id}:{mem_cube_id}:{task_label}" return stream_key @@ -623,41 +652,58 @@ def _compute_pending_need( need_pending = max(0, batch_size - new_count) return need_pending if need_pending > 0 else 0 + def _manual_xautoclaim( + self, stream_key: str, min_idle_time: int, count: int + ) -> tuple[str, list[tuple[str, dict]], list[str]]: + """ + Simulate xautoclaim using xpending and xclaim for compatibility with older Redis versions. + """ + # 1. Get pending entries (fetch slightly more to increase chance of finding idle ones) + fetch_count = count * 3 + pending_entries = self._redis_conn.xpending_range( + stream_key, self.consumer_group, "-", "+", fetch_count + ) + + if not pending_entries: + return "0-0", [], [] + + claim_ids = [] + for entry in pending_entries: + # entry structure depends on redis-py version/decoding + # Assuming list of dicts: {'message_id': '...', 'time_since_delivered': ms, ...} + # or list of tuples + msg_id = entry.get("message_id") if isinstance(entry, dict) else entry[0] + idle_time = entry.get("time_since_delivered") if isinstance(entry, dict) else entry[2] + + if idle_time >= min_idle_time: + claim_ids.append(msg_id) + if len(claim_ids) >= count: + break + + if not claim_ids: + return "0-0", [], [] + + # 2. Claim messages + claimed_messages = self._redis_conn.xclaim( + stream_key, self.consumer_group, self.consumer_name, min_idle_time, claim_ids + ) + + return "0-0", claimed_messages, [] + def _claim_pending_messages( self, stream_key: str, need_pending_count: int, task_label: str ) -> list[tuple[str, list[tuple[str, dict]]]]: """Claim pending messages exceeding idle threshold, with group existence handling.""" - try: - claimed_result = self._redis_conn.xautoclaim( - name=stream_key, - groupname=self.consumer_group, - consumername=self.consumer_name, - min_idle_time=self.orchestrator.get_task_idle_min(task_label=task_label), - start_id="0-0", - count=need_pending_count, - justid=False, - ) - if len(claimed_result) == 2: - next_id, claimed = claimed_result - deleted_ids = [] - elif len(claimed_result) == 3: - next_id, claimed, deleted_ids = claimed_result - else: - raise ValueError(f"Unexpected xautoclaim response length: {len(claimed_result)}") + min_idle = self.orchestrator.get_task_idle_min(task_label=task_label) - return [(stream_key, claimed)] if claimed else [] - except Exception as read_err: - err_msg = str(read_err).lower() - if "nogroup" in err_msg or "no such key" in err_msg: - logger.warning( - f"Consumer group or stream missing for '{stream_key}/{self.consumer_group}'. Attempting to create and retry (xautoclaim)." - ) - self._ensure_consumer_group(stream_key=stream_key) + # Use native xautoclaim if supported (Redis 6.2+) + if self.supports_xautoclaim: + try: claimed_result = self._redis_conn.xautoclaim( name=stream_key, groupname=self.consumer_group, consumername=self.consumer_name, - min_idle_time=self.orchestrator.get_task_idle_min(task_label=task_label), + min_idle_time=min_idle, start_id="0-0", count=need_pending_count, justid=False, @@ -670,25 +716,64 @@ def _claim_pending_messages( else: raise ValueError( f"Unexpected xautoclaim response length: {len(claimed_result)}" - ) from read_err + ) return [(stream_key, claimed)] if claimed else [] - return [] - - def _batch_claim_pending_messages( - self, claims_spec: list[tuple[str, int, str]] - ) -> list[tuple[str, list[tuple[str, dict]]]]: - """Batch-claim pending messages across multiple streams. + except Exception as read_err: + err_msg = str(read_err).lower() + if "nogroup" in err_msg or "no such key" in err_msg: + logger.warning( + f"Consumer group or stream missing for '{stream_key}/{self.consumer_group}'. Attempting to create and retry (xautoclaim)." + ) + self._ensure_consumer_group(stream_key=stream_key) + claimed_result = self._redis_conn.xautoclaim( + name=stream_key, + groupname=self.consumer_group, + consumername=self.consumer_name, + min_idle_time=min_idle, + start_id="0-0", + count=need_pending_count, + justid=False, + ) + if len(claimed_result) == 2: + next_id, claimed = claimed_result + deleted_ids = [] + elif len(claimed_result) == 3: + next_id, claimed, deleted_ids = claimed_result + else: + raise ValueError( + f"Unexpected xautoclaim response length: {len(claimed_result)}" + ) from read_err - Args: - claims_spec: List of tuples (stream_key, need_pending_count, task_label) + return [(stream_key, claimed)] if claimed else [] + return [] - Returns: - A list of (stream_key, claimed_entries) pairs for all successful claims. - """ - if not self._redis_conn or not claims_spec: + # Fallback to manual xautoclaim for older Redis versions + try: + _next, claimed, _deleted = self._manual_xautoclaim( + stream_key, min_idle, need_pending_count + ) + return [(stream_key, claimed)] if claimed else [] + except Exception as read_err: + err_msg = str(read_err).lower() + if "nogroup" in err_msg or "no such key" in err_msg: + logger.warning( + f"Consumer group or stream missing for '{stream_key}/{self.consumer_group}'. Attempting to create and retry (manual xautoclaim)." + ) + self._ensure_consumer_group(stream_key=stream_key) + try: + _next, claimed, _deleted = self._manual_xautoclaim( + stream_key, min_idle, need_pending_count + ) + return [(stream_key, claimed)] if claimed else [] + except Exception: + return [] return [] + def _batch_claim_native( + self, claims_spec: list[tuple[str, int, str]] + ) -> list[tuple[str, list[tuple[str, dict]]]]: + """Batch-claim pending messages using Redis xautoclaim pipeline (Redis 6.2+).""" pipe = self._redis_conn.pipeline(transaction=False) for stream_key, need_count, label in claims_spec: pipe.xautoclaim( @@ -702,14 +787,11 @@ def _batch_claim_pending_messages( ) try: - # Execute with raise_on_error=False so we get exceptions in the results list - # instead of aborting the whole batch. results = pipe.execute(raise_on_error=False) except Exception as e: logger.error(f"Pipeline execution critical failure: {e}") results = [e] * len(claims_spec) - # Handle individual failures (e.g. NOGROUP) by retrying just that stream final_results = [] for i, res in enumerate(results): if isinstance(res, Exception): @@ -736,12 +818,8 @@ def _batch_claim_pending_messages( else: final_results.append(res) - results = final_results - - claimed_pairs: list[tuple[str, list[tuple[str, dict]]]] = [] - for (stream_key, _need_count, _label), claimed_result in zip( - claims_spec, results, strict=False - ): + claimed_pairs = [] + for (stream_key, _, _), claimed_result in zip(claims_spec, final_results, strict=False): try: if not claimed_result: continue @@ -760,6 +838,101 @@ def _batch_claim_pending_messages( return claimed_pairs + def _batch_claim_manual( + self, claims_spec: list[tuple[str, int, str]] + ) -> list[tuple[str, list[tuple[str, dict]]]]: + """Batch-claim pending messages using 2-phase pipeline (Redis < 6.2).""" + # Phase 1: Fetch pending messages for all streams + pending_pipe = self._redis_conn.pipeline(transaction=False) + for stream_key, need_count, _label in claims_spec: + fetch_count = need_count * 3 + pending_pipe.xpending_range(stream_key, self.consumer_group, "-", "+", fetch_count) + + try: + pending_results = pending_pipe.execute(raise_on_error=False) + except Exception as e: + logger.error(f"Pending fetch pipeline failed: {e}") + return [] + + # Phase 2: Filter and prepare claim pipeline + claim_pipe = self._redis_conn.pipeline(transaction=False) + streams_to_claim_indices = [] + claimed_pairs: list[tuple[str, list[tuple[str, dict]]]] = [] + + for i, (stream_key, need_count, label) in enumerate(claims_spec): + pending_res = pending_results[i] + min_idle = self.orchestrator.get_task_idle_min(task_label=label) + + if isinstance(pending_res, Exception): + err_msg = str(pending_res).lower() + if "nogroup" in err_msg or "no such key" in err_msg: + try: + self._ensure_consumer_group(stream_key) + _next, claimed, _ = self._manual_xautoclaim( + stream_key, min_idle, need_count + ) + if claimed: + claimed_pairs.append((stream_key, claimed)) + except Exception as retry_err: + logger.warning(f"Retry manual claim failed for {stream_key}: {retry_err}") + continue + + if not pending_res: + continue + + claim_ids = [] + for entry in pending_res: + msg_id = entry.get("message_id") if isinstance(entry, dict) else entry[0] + idle_time = ( + entry.get("time_since_delivered") if isinstance(entry, dict) else entry[2] + ) + if idle_time >= min_idle: + claim_ids.append(msg_id) + if len(claim_ids) >= need_count: + break + + if claim_ids: + claim_pipe.xclaim( + stream_key, + self.consumer_group, + self.consumer_name, + min_idle, + claim_ids, + ) + streams_to_claim_indices.append(i) + + if streams_to_claim_indices: + try: + claim_results = claim_pipe.execute(raise_on_error=False) + for idx_in_results, original_idx in enumerate(streams_to_claim_indices): + res = claim_results[idx_in_results] + stream_key = claims_spec[original_idx][0] + if isinstance(res, list) and res: + claimed_pairs.append((stream_key, res)) + except Exception as e: + logger.error(f"Claim pipeline failed: {e}") + + return claimed_pairs + + def _batch_claim_pending_messages( + self, claims_spec: list[tuple[str, int, str]] + ) -> list[tuple[str, list[tuple[str, dict]]]]: + """Batch-claim pending messages across multiple streams. + + Args: + claims_spec: List of tuples (stream_key, need_pending_count, task_label) + + Returns: + A list of (stream_key, claimed_entries) pairs for all successful claims. + """ + if not self._redis_conn or not claims_spec: + return [] + + if self.supports_xautoclaim: + return self._batch_claim_native(claims_spec) + + return self._batch_claim_manual(claims_spec) + def _convert_messages( self, messages: list[tuple[str, list[tuple[str, dict]]]] ) -> list[ScheduleMessageItem]: @@ -994,6 +1167,7 @@ def connect(self) -> None: # Test the connection self._redis_conn.ping() self._is_connected = True + self._check_xautoclaim_support() logger.debug("Redis connection established successfully") # Start stream keys refresher when connected self._start_stream_keys_refresh_thread() From 686d7c1182b176bd07760588fe0b5a6c25576a29 Mon Sep 17 00:00:00 2001 From: chentang Date: Wed, 7 Jan 2026 20:31:17 +0800 Subject: [PATCH 23/53] refactor: review settings --- .gitignore | 1 + docker/.env.example | 1 + 2 files changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 8319a4d2f..ac31eb41a 100644 --- a/.gitignore +++ b/.gitignore @@ -204,6 +204,7 @@ cython_debug/ # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. .idea/ +.trae # VSCode .vscode* diff --git a/docker/.env.example b/docker/.env.example index dc4252133..204e8d06f 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -92,6 +92,7 @@ MOS_SCHEDULER_ENABLE_ACTIVATION_MEMORY=false API_SCHEDULER_ON=true API_SEARCH_WINDOW_SIZE=5 API_SEARCH_HISTORY_TURNS=5 +MEMSCHEDULER_USE_REDIS_QUEUE=false ## Graph / vector stores NEO4J_BACKEND=neo4j-community # neo4j-community | neo4j | nebular | polardb From 3dd506801659fb8e5817eaa30690641e8e139f1b Mon Sep 17 00:00:00 2001 From: chentang Date: Wed, 7 Jan 2026 20:34:10 +0800 Subject: [PATCH 24/53] refactor: adjust examples to make it run better for code debugging --- examples/mem_scheduler/quick_start_examples.py | 8 +++++--- examples/mem_scheduler/scheduler_for_async_tasks.py | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/examples/mem_scheduler/quick_start_examples.py b/examples/mem_scheduler/quick_start_examples.py index fbfef4d76..724663be6 100644 --- a/examples/mem_scheduler/quick_start_examples.py +++ b/examples/mem_scheduler/quick_start_examples.py @@ -146,7 +146,9 @@ def kv_cache_only(): def run_scheduler_example(): # 使用 MemScheduler 加载主 MOS(Memory-Oriented System)配置文件 - config = parse_yaml("./examples/data/config/mem_scheduler/memos_config_w_scheduler.yaml") + config = parse_yaml( + f"{BASE_DIR}/examples/data/config/mem_scheduler/memos_config_w_scheduler.yaml" + ) # 将解析出的配置字典传入 MOSConfig 构造器, 构建配置对象 mos_config = MOSConfig(**config) # 使用配置对象初始化 MOS 系统实例 @@ -159,12 +161,12 @@ def run_scheduler_example(): # 从 YAML 文件加载 MemCube(记忆立方体)的通用配置 config = GeneralMemCubeConfig.from_yaml_file( - "./examples/data/config/mem_scheduler/mem_cube_config.yaml" + f"{BASE_DIR}/examples/data/config/mem_scheduler/mem_cube_config.yaml" ) # 定义 MemCube 的唯一标识符 mem_cube_id = "mem_cube_5" # 定义 MemCube 的本地存储路径(路径中包含用户 ID 和 MemCube ID) - mem_cube_name_or_path = f"./outputs/mem_scheduler/{user_id}/{mem_cube_id}" + mem_cube_name_or_path = f"{BASE_DIR}/outputs/mem_scheduler/{user_id}/{mem_cube_id}" # 如果该路径已存在, 则先删除旧目录 if Path(mem_cube_name_or_path).exists(): diff --git a/examples/mem_scheduler/scheduler_for_async_tasks.py b/examples/mem_scheduler/scheduler_for_async_tasks.py index a767b57c4..7f544c3da 100644 --- a/examples/mem_scheduler/scheduler_for_async_tasks.py +++ b/examples/mem_scheduler/scheduler_for_async_tasks.py @@ -57,7 +57,7 @@ def submit_tasks(): TEST_HANDLER_LABEL = "test_handler" mem_scheduler.register_handlers({TEST_HANDLER_LABEL: my_test_handler}) -# 10s to restart +# 5s to restart mem_scheduler.orchestrator.tasks_min_idle_ms[TEST_HANDLER_LABEL] = 5_000 tmp_dir = Path("./tmp") From 211b4dc204e0b1ce0d5899a4cee4e101ac0a26ba Mon Sep 17 00:00:00 2001 From: chentang Date: Wed, 7 Jan 2026 20:42:56 +0800 Subject: [PATCH 25/53] refactor: review slow add apis to get a better performance on Halumen --- src/memos/mem_reader/simple_struct.py | 4 +- src/memos/templates/mem_reader_prompts.py | 79 ++++++++++++----------- 2 files changed, 43 insertions(+), 40 deletions(-) diff --git a/src/memos/mem_reader/simple_struct.py b/src/memos/mem_reader/simple_struct.py index 61a7d2b6d..fa72bd063 100644 --- a/src/memos/mem_reader/simple_struct.py +++ b/src/memos/mem_reader/simple_struct.py @@ -614,11 +614,9 @@ def _read_memory( serialized_origin_memories = json.dumps( [one.memory for one in original_memory_group], indent=2 ) - revised_memory_list = self.rewrite_memories( + revised_memory_list = self.filter_hallucination_in_memories( messages=combined_messages, memory_list=original_memory_group, - user_only=os.getenv("SIMPLE_STRUCT_REWRITE_USER_ONLY", "true").lower() - == "false", ) serialized_revised_memories = json.dumps( [one.memory for one in revised_memory_list], indent=2 diff --git a/src/memos/templates/mem_reader_prompts.py b/src/memos/templates/mem_reader_prompts.py index 26795a2b1..0fa39b588 100644 --- a/src/memos/templates/mem_reader_prompts.py +++ b/src/memos/templates/mem_reader_prompts.py @@ -757,43 +757,48 @@ """ SIMPLE_STRUCT_HALLUCINATION_FILTER_PROMPT = """ -You are a strict memory validator. -Your task is to identify and delete hallucinated memories that are not explicitly stated by the user in the provided messages. - -Rules: -1. **User-Only Origin**: Verify facts against USER messages ONLY. If the Assistant repeats a User fact, it is VALID. If the Assistant introduces a new detail (e.g., 'philanthropy') that the User did not explicitly confirm, it is INVALID. -2. **No Inference Allowed**: Do NOT keep memories based on implication, emotion, preference, or generalization. Only verbatim or direct restatements of user-provided facts are valid. However, minor formatting corrections (e.g., adding missing spaces between names, fixing obvious typos) are ALLOWED. -3. **Hallucination = Deletion**: If a memory contains any detail not directly expressed by the user, mark it for deletion. -4. **Timestamp Exception**: Memories may include timestamps (e.g., dates like "On December 19, 2026") derived from conversation metadata. If the date in the memory is likely the conversation time (even if not shown in the `messages` list), do NOT treat it as a hallucination or require a rewrite. - -Examples: -Messages: -- [user]: I love coding in Python. -- [assistant]: That's great! I assume you also contribute to open source projects? -Memory: User enjoys Python and contributes to open source. -Result: {{"keep": false, "reason": "User never stated they contribute to open source; this came from Assistant's assumption."}} - -Messages: -- [user]: I am tired. -- [assistant]: I hear you are tired. Rest is important. -Memory: User stated they are tired. -Result: {{"keep": true, "reason": "Direct restatement of user input, even if Assistant repeated it."}} - -Inputs: -messages: -{messages_inline} - -memories: -{memories_inline} - -Output Format: -- Return a JSON object with string keys ("0", "1", "2", ...) matching the input memory indices. -- Each value must be: {{ "keep": boolean, "reason": string }} -- "keep": true only if the memory is a direct reflection of the user's explicit words. -- "reason": brief, factual, and cites missing or unsupported content. - -Important: Output **only** the JSON. No extra text, explanations, markdown, or fields. -""" + You are a strict memory validator. + Your task is to identify and delete hallucinated memories that are not explicitly stated by the user in the provided messages. + + Rules: + 1. **Explicit Denial & Inconsistency**: If a memory claims something that the user explicitly denied or is clearly inconsistent with the user's statements, mark it for deletion. + 2. **Timestamp Exception**: Memories may include timestamps (e.g., dates like "On December 19, 2026") derived from conversation metadata. If the date in the memory is likely the conversation time (even if not shown in the `messages` list), do NOT treat it as a hallucination or require a rewrite. + + Example: + Messages: + [user]: I'm planning a trip to Japan next month for about a week. + [assistant]: That sounds great! Are you planning to visit Tokyo Disneyland? + [user]: No, I won't be going to Tokyo this time. I plan to stay in Kyoto and Osaka to avoid crowds. + + Memories: + {{ + "0": "User plans to travel to Japan for a week next month.", + "1": "User intends to visit Tokyo Disneyland.", + "2": "User plans to stay in Kyoto and Osaka." + }} + + Output: + {{ + "0": {{ "keep": true, "reason": "Explicitly stated by user." }}, + "1": {{ "keep": false, "reason": "User explicitly denied visiting Tokyo." }}, + "2": {{ "keep": true, "reason": "Explicitly stated by user." }} + }} + + Inputs: + Messages: + {messages_inline} + + Memories: + {memories_inline} + + Output Format: + - Return a JSON object with string keys ("0", "1", "2", ...) matching the input memory indices. + - Each value must be: {{ "keep": boolean, "reason": string }} + - "keep": true only if the memory is a direct reflection of the user's explicit words. + - "reason": brief, factual, and cites missing or unsupported content. + + Important: Output **only** the JSON. No extra text, explanations, markdown, or fields. + """ SIMPLE_STRUCT_ADD_BEFORE_SEARCH_PROMPT = """ From f0a9c1388d2b9168e31d09160b9b59e75f24631f Mon Sep 17 00:00:00 2001 From: chentang Date: Wed, 7 Jan 2026 21:13:01 +0800 Subject: [PATCH 26/53] fix bugs: address the issue when set user_redis_queue to false, the status_tracker is still using --- src/memos/mem_scheduler/base_scheduler.py | 20 ++++++------- .../task_schedule_modules/dispatcher.py | 30 ------------------- 2 files changed, 9 insertions(+), 41 deletions(-) diff --git a/src/memos/mem_scheduler/base_scheduler.py b/src/memos/mem_scheduler/base_scheduler.py index 3f5c90b67..130ad98da 100644 --- a/src/memos/mem_scheduler/base_scheduler.py +++ b/src/memos/mem_scheduler/base_scheduler.py @@ -225,7 +225,7 @@ def initialize_modules( process_llm = chat_llm try: - if redis_client: + if redis_client and self.use_redis_queue: self.status_tracker = TaskStatusTracker(redis_client) if self.dispatcher: self.dispatcher.status_tracker = self.status_tracker @@ -305,16 +305,14 @@ def status_tracker(self) -> TaskStatusTracker | None: available via RedisSchedulerModule. This mirrors the lazy pattern used by `mem_cube` so downstream modules can safely access the tracker. """ - if self._status_tracker is None: - try: - self._status_tracker = TaskStatusTracker(self.redis) - # Propagate to submodules when created lazily - if self.dispatcher: - self.dispatcher.status_tracker = self._status_tracker - if self.memos_message_queue: - self.memos_message_queue.set_status_tracker(self._status_tracker) - except Exception as e: - logger.warning(f"Failed to lazily initialize status_tracker: {e}", exc_info=True) + if self._status_tracker is None and self.use_redis_queue: + self._status_tracker = TaskStatusTracker(self.redis) + # Propagate to submodules when created lazily + if self.dispatcher: + self.dispatcher.status_tracker = self._status_tracker + if self.memos_message_queue: + self.memos_message_queue.set_status_tracker(self._status_tracker) + return self._status_tracker @status_tracker.setter diff --git a/src/memos/mem_scheduler/task_schedule_modules/dispatcher.py b/src/memos/mem_scheduler/task_schedule_modules/dispatcher.py index e2c1621d4..2099da5a1 100644 --- a/src/memos/mem_scheduler/task_schedule_modules/dispatcher.py +++ b/src/memos/mem_scheduler/task_schedule_modules/dispatcher.py @@ -108,8 +108,6 @@ def __init__( ) self.metrics = metrics - self._status_tracker: TaskStatusTracker | None = None - # Use setter to allow propagation and keep a single source of truth self.status_tracker = status_tracker self.submit_web_logs = submit_web_logs # ADDED @@ -118,34 +116,6 @@ def on_messages_enqueued(self, msgs: list[ScheduleMessageItem]) -> None: return # This is handled in BaseScheduler now - @property - def status_tracker(self) -> TaskStatusTracker | None: - """Lazy-initialized status tracker for the dispatcher. - - If the tracker is None, attempt to initialize from the Redis-backed - components available to the dispatcher (queue or orchestrator). - """ - if self._status_tracker is None: - try: - self._status_tracker = TaskStatusTracker(self.redis) - if self.memos_message_queue: - self.memos_message_queue.set_status_tracker(self._status_tracker) - except Exception as e: - logger.warning(f"Failed to lazily initialize status_tracker: {e}", exc_info=True) - return self._status_tracker - - @status_tracker.setter - def status_tracker(self, value: TaskStatusTracker | None) -> None: - self._status_tracker = value - # Propagate to the queue if possible - try: - if self.memos_message_queue and hasattr(self.memos_message_queue, "status_tracker"): - self.memos_message_queue.status_tracker = value - except Exception as e: - logger.warning( - f"Failed to propagate dispatcher status_tracker to queue: {e}", exc_info=True - ) - def _create_task_wrapper(self, handler: Callable, task_item: RunningTaskItem): """ Create a wrapper around the handler to track task execution and capture results. From 079a3e39582f2678d49637d574e1696863de50e0 Mon Sep 17 00:00:00 2001 From: chentang Date: Thu, 8 Jan 2026 11:06:47 +0800 Subject: [PATCH 27/53] refactor: allow the code to run without rabbitmq --- src/memos/mem_scheduler/base_scheduler.py | 2 ++ .../webservice_modules/rabbitmq_service.py | 17 ++++++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/memos/mem_scheduler/base_scheduler.py b/src/memos/mem_scheduler/base_scheduler.py index 130ad98da..e2658abc4 100644 --- a/src/memos/mem_scheduler/base_scheduler.py +++ b/src/memos/mem_scheduler/base_scheduler.py @@ -867,6 +867,8 @@ def _submit_web_logs( messages = [messages] # transform single message to list for message in messages: + if self.rabbitmq_config is None: + return try: # Always call publish; the publisher now caches when offline and flushes after reconnect logger.info( diff --git a/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py b/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py index 46b2ad3d1..f3508124a 100644 --- a/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py +++ b/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py @@ -103,13 +103,16 @@ def initialize_rabbitmq( from pika.adapters.select_connection import SelectConnection if config is None: - if config_path is None and AuthConfig.default_config_exists(): - auth_config = AuthConfig.from_local_config() - elif Path(config_path).exists(): - auth_config = AuthConfig.from_local_config(config_path=config_path) + if self.auth_config_path is not None and Path(self.auth_config_path).exists(): + self.auth_config = AuthConfig.from_local_config( + config_path=self.auth_config_path + ) + elif AuthConfig.default_config_exists(): + self.auth_config = AuthConfig.from_local_config() else: - auth_config = AuthConfig.from_local_env() - self.rabbitmq_config = auth_config.rabbitmq + self.auth_config = AuthConfig.from_local_env() + self.rabbitmq_config = self.auth_config.rabbitmq + elif isinstance(config, RabbitMQConfig): self.rabbitmq_config = config elif isinstance(config, dict): @@ -148,7 +151,7 @@ def initialize_rabbitmq( self._io_loop_thread.start() logger.info("RabbitMQ connection process started") except Exception: - logger.error("Fail to initialize auth_config", exc_info=True) + logger.debug("Fail to initialize auth_config", exc_info=True) finally: with self._rabbitmq_lock: self._rabbitmq_initializing = False From d2e6c68999ade2cce236f04d5a1ad9de77b32287 Mon Sep 17 00:00:00 2001 From: chentang Date: Thu, 8 Jan 2026 20:55:35 +0800 Subject: [PATCH 28/53] refactor: create a _parse_pending_entry for redis queue --- .../task_schedule_modules/redis_queue.py | 18 ++++++--- .../webservice_modules/rabbitmq_service.py | 37 ++++++++++++------- 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py b/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py index 06fbce4dc..1c9683542 100644 --- a/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py +++ b/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py @@ -652,6 +652,16 @@ def _compute_pending_need( need_pending = max(0, batch_size - new_count) return need_pending if need_pending > 0 else 0 + def _parse_pending_entry(self, entry) -> tuple[str, int]: + """Extract message_id and idle_time from a pending entry (dict, tuple, or object).""" + if isinstance(entry, dict): + return entry.get("message_id"), entry.get("time_since_delivered") + elif isinstance(entry, tuple | list): + return entry[0], entry[2] + else: + # Assume object (redis-py 5.x+ PendingMessage) + return getattr(entry, "message_id", None), getattr(entry, "time_since_delivered", 0) + def _manual_xautoclaim( self, stream_key: str, min_idle_time: int, count: int ) -> tuple[str, list[tuple[str, dict]], list[str]]: @@ -672,8 +682,7 @@ def _manual_xautoclaim( # entry structure depends on redis-py version/decoding # Assuming list of dicts: {'message_id': '...', 'time_since_delivered': ms, ...} # or list of tuples - msg_id = entry.get("message_id") if isinstance(entry, dict) else entry[0] - idle_time = entry.get("time_since_delivered") if isinstance(entry, dict) else entry[2] + msg_id, idle_time = self._parse_pending_entry(entry) if idle_time >= min_idle_time: claim_ids.append(msg_id) @@ -882,10 +891,7 @@ def _batch_claim_manual( claim_ids = [] for entry in pending_res: - msg_id = entry.get("message_id") if isinstance(entry, dict) else entry[0] - idle_time = ( - entry.get("time_since_delivered") if isinstance(entry, dict) else entry[2] - ) + msg_id, idle_time = self._parse_pending_entry(entry) if idle_time >= min_idle: claim_ids.append(msg_id) if len(claim_ids) >= need_count: diff --git a/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py b/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py index 8aac18522..a07934b8e 100644 --- a/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py +++ b/src/memos/mem_scheduler/webservice_modules/rabbitmq_service.py @@ -30,6 +30,7 @@ def __init__(self): Initialize RabbitMQ connection settings. """ super().__init__() + self.auth_config = None # RabbitMQ settings self.rabbitmq_config: RabbitMQConfig | None = None @@ -99,25 +100,35 @@ def initialize_rabbitmq( ) return + if self.is_rabbitmq_connected(): + logger.warning("RabbitMQ is already connected. Skipping initialization.") + return + from pika.adapters.select_connection import SelectConnection - if config is None: - if self.auth_config_path is not None and Path(self.auth_config_path).exists(): - self.auth_config = AuthConfig.from_local_config( - config_path=self.auth_config_path - ) + if config is not None: + if isinstance(config, RabbitMQConfig): + self.rabbitmq_config = config + elif isinstance(config, dict): + self.rabbitmq_config = AuthConfig.from_dict(config).rabbitmq + else: + logger.error(f"Unsupported config type: {type(config)}") + return + + else: + if config_path is not None and Path(config_path).exists(): + self.auth_config = AuthConfig.from_local_config(config_path=config_path) elif AuthConfig.default_config_exists(): self.auth_config = AuthConfig.from_local_config() else: self.auth_config = AuthConfig.from_local_env() self.rabbitmq_config = self.auth_config.rabbitmq - elif isinstance(config, RabbitMQConfig): - self.rabbitmq_config = config - elif isinstance(config, dict): - self.rabbitmq_config = AuthConfig.from_dict(config).rabbitmq - else: - logger.error("Not implemented") + if self.rabbitmq_config is None: + logger.error( + "Failed to load RabbitMQ configuration. Please check your config file or environment variables." + ) + return # Load exchange configuration from config if self.rabbitmq_config: @@ -143,7 +154,7 @@ def initialize_rabbitmq( self.rabbitmq_exchange_type = env_exchange_type logger.info(f"Using env exchange type override: {self.rabbitmq_exchange_type}") - # Start connection process + # Start connection process parameters = self.get_rabbitmq_connection_param() self.rabbitmq_connection = SelectConnection( parameters, @@ -159,7 +170,7 @@ def initialize_rabbitmq( self._io_loop_thread.start() logger.info("RabbitMQ connection process started") except Exception: - logger.debug("Fail to initialize auth_config", exc_info=True) + logger.error("Failed to initialize RabbitMQ connection", exc_info=True) finally: with self._rabbitmq_lock: self._rabbitmq_initializing = False From 412b05a0dcdaf3fb9899d32d95fba5235f729bc1 Mon Sep 17 00:00:00 2001 From: chentang Date: Thu, 8 Jan 2026 21:04:00 +0800 Subject: [PATCH 29/53] refactor: add a try/catch for status_tracker --- src/memos/mem_scheduler/base_scheduler.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/memos/mem_scheduler/base_scheduler.py b/src/memos/mem_scheduler/base_scheduler.py index e2658abc4..4c9310cbb 100644 --- a/src/memos/mem_scheduler/base_scheduler.py +++ b/src/memos/mem_scheduler/base_scheduler.py @@ -306,12 +306,15 @@ def status_tracker(self) -> TaskStatusTracker | None: by `mem_cube` so downstream modules can safely access the tracker. """ if self._status_tracker is None and self.use_redis_queue: - self._status_tracker = TaskStatusTracker(self.redis) - # Propagate to submodules when created lazily - if self.dispatcher: - self.dispatcher.status_tracker = self._status_tracker - if self.memos_message_queue: - self.memos_message_queue.set_status_tracker(self._status_tracker) + try: + self._status_tracker = TaskStatusTracker(self.redis) + # Propagate to submodules when created lazily + if self.dispatcher: + self.dispatcher.status_tracker = self._status_tracker + if self.memos_message_queue: + self.memos_message_queue.set_status_tracker(self._status_tracker) + except Exception as e: + logger.warning(f"Failed to lazy-initialize status_tracker: {e}", exc_info=True) return self._status_tracker From 1f1a81dc345db3e8dc1c8b4e39ed0c8a657595bb Mon Sep 17 00:00:00 2001 From: chentang Date: Fri, 9 Jan 2026 17:20:35 +0800 Subject: [PATCH 30/53] fix: revise examples of textual memories to run normally --- .../core_memories/general_textual_memory.py | 61 ++++++++++---- .../core_memories/naive_textual_memory.py | 79 +++++++++++++------ 2 files changed, 102 insertions(+), 38 deletions(-) diff --git a/examples/core_memories/general_textual_memory.py b/examples/core_memories/general_textual_memory.py index f71e2ef2e..d5c765b01 100644 --- a/examples/core_memories/general_textual_memory.py +++ b/examples/core_memories/general_textual_memory.py @@ -1,14 +1,25 @@ +import os +import pprint + from memos.configs.memory import MemoryConfigFactory from memos.memories.factory import MemoryFactory +# Initialize the memory configuration +# This configuration specifies the extractor, vector database, and embedder backend. +# Here we use OpenAI for extraction, Qdrant for vector storage, and Ollama for embedding. config = MemoryConfigFactory( backend="general_text", config={ "extractor_llm": { - "backend": "ollama", + "backend": "openai", "config": { - "model_name_or_path": "qwen3:0.6b", + "model_name_or_path": "gpt-4o-mini", + "api_key": os.environ.get("OPENAI_API_KEY"), + "api_base": os.environ.get( + "OPENAI_BASE_URL", + os.environ.get("OPENAI_API_BASE", "https://api.openai.com/v1"), + ), "temperature": 0.0, "remove_think_prefix": True, "max_tokens": 8192, @@ -30,6 +41,8 @@ }, }, ) + +# Create the memory instance from the configuration m = MemoryFactory.from_config(config) example_memories = [ @@ -52,20 +65,25 @@ }, }, ] + example_id = "a19b6caa-5d59-42ad-8c8a-e4f7118435b4" print("===== Extract memories =====") +# Extract memories from a conversation +# The extractor LLM processes the conversation to identify relevant information. memories = m.extract( [ {"role": "user", "content": "I love tomatoes."}, {"role": "assistant", "content": "Great! Tomatoes are delicious."}, ] ) -print(memories) +pprint.pprint(memories) print() print("==== Add memories ====") +# Add the extracted memories to the memory store m.add(memories) +# Add a manually created memory item m.add( [ { @@ -80,19 +98,27 @@ } ] ) -print(m.get_all()) +print("All memories after addition:") +pprint.pprint(m.get_all()) print() + print("==== Search memories ====") +# Search for memories related to a query search_results = m.search("Tell me more about the user", top_k=2) -print(search_results) +pprint.pprint(search_results) print() print("==== Get memories ====") -print(m.get(example_id)) -print(m.get_by_ids([example_id])) +# Retrieve a specific memory by its ID +print(f"Memory with ID {example_id}:") +pprint.pprint(m.get(example_id)) +# Retrieve multiple memories by IDs +print(f"Memories by IDs [{example_id}]:") +pprint.pprint(m.get_by_ids([example_id])) print() print("==== Update memories ====") +# Update an existing memory m.update( example_id, { @@ -106,19 +132,26 @@ }, }, ) -print(m.get(example_id)) +print(f"Memory after update (ID {example_id}):") +pprint.pprint(m.get(example_id)) +print() + +print("==== Dump memory ====") +# Dump the current state of memory to a file +m.dump("tmp/general_mem") +print("Memory dumped to 'tmp/general_mem'.") print() print("==== Delete memories ====") +# Delete a memory by its ID m.delete([example_id]) -print(m.get_all()) +print("All memories after deletion:") +pprint.pprint(m.get_all()) print() print("==== Delete all memories ====") +# Clear all memories from the store m.delete_all() -print(m.get_all()) +print("All memories after delete_all:") +pprint.pprint(m.get_all()) print() - -print("==== Dump memory ====") -m.dump("tmp/mem") -print("Memory dumped to 'tmp/mem'.") diff --git a/examples/core_memories/naive_textual_memory.py b/examples/core_memories/naive_textual_memory.py index ff61334dc..ab73060c7 100644 --- a/examples/core_memories/naive_textual_memory.py +++ b/examples/core_memories/naive_textual_memory.py @@ -1,53 +1,77 @@ +import json +import os import uuid from memos.configs.memory import MemoryConfigFactory from memos.memories.factory import MemoryFactory +def print_result(title, result): + """Helper function: Pretty print the result.""" + print(f"\n{'=' * 10} {title} {'=' * 10}") + if isinstance(result, list | dict): + print(json.dumps(result, indent=2, ensure_ascii=False, default=str)) + else: + print(result) + + +# Configure memory backend with OpenAI extractor config = MemoryConfigFactory( backend="naive_text", config={ "extractor_llm": { - "backend": "ollama", + "backend": "openai", "config": { - "model_name_or_path": "qwen3:0.6b", + "model_name_or_path": "gpt-4o-mini", + "api_key": os.environ.get("OPENAI_API_KEY"), + "api_base": os.environ.get( + "OPENAI_BASE_URL", + os.environ.get("OPENAI_API_BASE", "https://api.openai.com/v1"), + ), "temperature": 0.0, "remove_think_prefix": True, }, } }, ) + +# Create memory instance m = MemoryFactory.from_config(config) -print("===== Extract memories =====") +# Extract memories from a simulated conversation memories = m.extract( [ {"role": "user", "content": "I love tomatoes."}, {"role": "assistant", "content": "Great! Tomatoes are delicious."}, ] ) -print(memories) -print() +print_result("Extract memories", memories) + -print("==== Add memories ====") +# Add the extracted memories to storage m.add(memories) + +# Manually create a memory item and add it example_id = str(uuid.uuid4()) -m.add([{"id": example_id, "memory": "User is Chinese.", "metadata": {"type": "opinion"}}]) -print(m.get_all()) -print() +manual_memory = [{"id": example_id, "memory": "User is Chinese.", "metadata": {"type": "opinion"}}] +m.add(manual_memory) + +# Print all current memories +print_result("Add memories (Check all after adding)", m.get_all()) -print("==== Search memories ====") + +# Search for relevant memories based on the query search_results = m.search("Tell me more about the user", top_k=2) -print(search_results) -print() +print_result("Search memories", search_results) + + +# Get specific memory item by ID +memory_item = m.get(example_id) +print_result("Get memory", memory_item) -print("==== Get memories ====") -memories = m.get(example_id) -print(memories) -print() -print("==== Update memories ====") +# Update the memory content for the specified ID m.update( example_id, { @@ -56,15 +80,22 @@ "metadata": {"type": "opinion", "confidence": 85}, }, ) -print(m.get(example_id)) +updated_memory = m.get(example_id) +print_result("Update memory", updated_memory) + + +print("==== Dump memory ====") +# Dump the current state of memory to a file +m.dump("tmp/naive_mem") +print("Memory dumped to 'tmp/naive_mem'.") print() -print("==== Delete memories ====") + +# Delete memory with the specified ID m.delete([example_id]) -print(m.get_all()) -print() +print_result("Delete memory (Check all after deleting)", m.get_all()) -print("==== Delete all memories ====") + +# Delete all memories in storage m.delete_all() -print(m.get_all()) -print() +print_result("Delete all", m.get_all()) From 5c85fc9cd06d5419d1e5fecf2ac4833b2486c157 Mon Sep 17 00:00:00 2001 From: Zehao Lin Date: Wed, 14 Jan 2026 14:10:03 +0800 Subject: [PATCH 31/53] feat: improve MemCube examples with View architecture (#859) * feat: improve MemCube examples with View architecture - Add load_cube.py: demonstrate loading MemCube and using SingleCubeView - Add dump_cube.py: demonstrate persisting MemCube to disk - Deprecate old examples: move load_from_folder.py, load_from_remote.py, load_lazily.py to _deprecated/ - Add _deprecated/README.md with migration guide - All code in English with ruff check and format passed - Use 80-char separator lines consistent with server_router_api.py style * feat: improve MemCube examples with SingleCubeView - dump_cube.py: export cube data via graph_store.export_graph() - load_cube.py: import and display graph data - Add example data in examples/data/mem_cube_tree/ --------- Co-authored-by: glin1993@outlook.com <> --- .../data/mem_cube_tree/textual_memory.json | 4219 +++++++++++++++++ examples/mem_cube/_deprecated/README.md | 81 + .../{ => _deprecated}/load_from_folder.py | 0 .../{ => _deprecated}/load_from_remote.py | 0 .../mem_cube/{ => _deprecated}/load_lazily.py | 0 examples/mem_cube/dump_cube.py | 137 + examples/mem_cube/load_cube.py | 137 + 7 files changed, 4574 insertions(+) create mode 100644 examples/data/mem_cube_tree/textual_memory.json create mode 100644 examples/mem_cube/_deprecated/README.md rename examples/mem_cube/{ => _deprecated}/load_from_folder.py (100%) rename examples/mem_cube/{ => _deprecated}/load_from_remote.py (100%) rename examples/mem_cube/{ => _deprecated}/load_lazily.py (100%) create mode 100644 examples/mem_cube/dump_cube.py create mode 100644 examples/mem_cube/load_cube.py diff --git a/examples/data/mem_cube_tree/textual_memory.json b/examples/data/mem_cube_tree/textual_memory.json new file mode 100644 index 000000000..91f426ca2 --- /dev/null +++ b/examples/data/mem_cube_tree/textual_memory.json @@ -0,0 +1,4219 @@ +{ + "nodes": [ + { + "id": "c1e2bfb3-4dd7-40f9-a347-a25a72223b2c", + "memory": "On January 13, 2026, at 8:51 PM, the user added another memory to demonstrate the concept of persistence.", + "metadata": { + "sources": [ + "\"{\\\"type\\\": \\\"chat\\\", \\\"role\\\": \\\"user\\\", \\\"chat_time\\\": \\\"08:51 PM on 13 January, 2026\\\", \\\"content\\\": \\\"This is a test memory for dump example\\\", \\\"lang\\\": \\\"en\\\"}\"", + "\"{\\\"type\\\": \\\"chat\\\", \\\"role\\\": \\\"user\\\", \\\"chat_time\\\": \\\"08:51 PM on 13 January, 2026\\\", \\\"content\\\": \\\"Another memory to demonstrate persistence\\\", \\\"lang\\\": \\\"en\\\"}\"" + ], + "confidence": 0.99, + "usage": [], + "created_at": "2026-01-13T20:51:42.394870000+00:00", + "session_id": "default_session", + "memory_type": "UserMemory", + "type": "fact", + "tags": [ + "persistence", + "memory", + "demonstration" + ], + "updated_at": "2026-01-13T20:51:42.396309000+00:00", + "user_id": "example_user", + "background": "On January 13, 2026, at 8:51 PM, the user engaged in a memory demonstration by creating a test memory example and another memory to illustrate the concept of persistence. These actions reflect the user's interest in exploring and demonstrating memory-related concepts.", + "file_ids": [], + "embedding": [ + -0.022425159811973572, + 0.01004026923328638, + 0.013415387831628323, + -0.013093948364257812, + -0.04768655076622963, + -0.047837819904088974, + 0.02147974818944931, + 0.019097311422228813, + 0.005332120228558779, + -0.005180854815989733, + 0.0216499213129282, + -0.006977136246860027, + -0.014067722484469414, + 0.014010997489094734, + -0.01164746843278408, + 0.037948813289403915, + 0.049539558589458466, + -0.028778323903679848, + -0.0363227054476738, + -0.006282258778810501, + 0.03201163187623024, + -0.043678008019924164, + 0.06640569865703583, + 0.04734620451927185, + -0.03552856296300888, + 0.008948319591581821, + -0.018199170008301735, + 0.015788370743393898, + 0.08047342300415039, + 0.04632515832781792, + -0.01887986622750759, + 0.00966683216392994, + -0.02516685239970684, + -0.00974719226360321, + -0.01631780155003071, + -0.01085332315415144, + 0.0284947007894516, + 0.012914320454001427, + -0.02427816577255726, + 0.006589517462998629, + -0.013954272493720055, + -0.0017856458434835076, + 0.004043997265398502, + -0.004202353768050671, + 0.032805778086185455, + -0.00395891023799777, + -0.002543156733736396, + -0.018889321014285088, + -0.02066669426858425, + -0.006225534249097109, + 0.008262895978987217, + 0.0266795102506876, + 0.055325478315353394, + -0.019683465361595154, + -0.013576108030974865, + 0.015372389927506447, + -0.05816170945763588, + -0.00842361617833376, + -0.009548655711114407, + -0.0019262757850810885, + -0.047535285353660583, + 0.026603877544403076, + -0.0035098399966955185, + -0.030290981754660606, + -0.015334573574364185, + 0.04798908531665802, + 0.028400158509612083, + -0.00544084282591939, + 0.008106903173029423, + -0.03639834001660347, + 0.011515110731124878, + 0.042278800159692764, + -0.07343956083059311, + -0.02628243714570999, + -0.08886867761611938, + 0.02773837186396122, + -0.0017962816637009382, + -0.007761827670037746, + -0.011363845318555832, + 0.031860366463661194, + 0.017783189192414284, + -0.026849685236811638, + 0.04144683852791786, + -0.00212244875729084, + 0.03042333945631981, + 0.026755142956972122, + -0.04500158503651619, + 0.03989636152982712, + 0.04318639263510704, + -0.03339193016290665, + 0.025412660092115402, + -0.01126930397003889, + 0.027587104588747025, + -0.03471550717949867, + -0.006041178945451975, + -0.007709830068051815, + -0.02686859294772148, + 0.0020196351688355207, + 0.05143038183450699, + 0.029402295127511024, + 0.059598736464977264, + 0.01989145576953888, + 0.013944818638265133, + -0.010550791397690773, + 0.011004588566720486, + -0.02439161390066147, + 0.05952310189604759, + -0.0021389934699982405, + -0.011723102070391178, + 0.007941455580294132, + 0.010248259641230106, + 0.029893908649683, + 0.033032674342393875, + 0.008130538277328014, + 0.025242485105991364, + -0.009198852814733982, + 0.04307294636964798, + 0.005294303875416517, + -0.030272074043750763, + -0.004263805691152811, + 0.04027452692389488, + 0.017197033390402794, + 0.06016598269343376, + -0.025620650500059128, + -0.02253860794007778, + -0.015088766813278198, + -0.007000771816819906, + -0.018870411440730095, + -0.015325118787586689, + -0.0027582377661019564, + 0.025734098628163338, + -0.017972271889448166, + 0.014824051409959793, + -0.025072310119867325, + -0.05165728181600571, + -0.00673132948577404, + 0.004667968954890966, + 0.03293813392519951, + 0.02083686739206314, + -0.03785427287220955, + 0.013188489712774754, + -0.02533702552318573, + 0.002592790871858597, + -0.03611471503973007, + 0.022084811702370644, + -0.007724011316895485, + 0.0028811413794755936, + 0.007497112732380629, + 0.026755142956972122, + 0.014861867763102055, + -0.012413252145051956, + 0.014880775474011898, + -0.03142547607421875, + -0.03377009555697441, + -0.024202533066272736, + 0.0020539062097668648, + 0.02323821373283863, + 0.09204525500535965, + -0.03365664556622505, + -0.031633466482162476, + -0.005308485124260187, + -0.06735111027956009, + -0.06126265972852707, + 0.04545538127422333, + 0.03220071271061897, + 0.028343435376882553, + 0.010843869298696518, + 0.02891068160533905, + -0.034488607197999954, + 0.006887322291731834, + -0.0065280660055577755, + -0.003923457581549883, + 0.02036416158080101, + 0.008220352232456207, + 0.0012183990329504013, + 0.0293266624212265, + 0.04390490800142288, + 0.01639343425631523, + -0.0038076445925980806, + -0.04159810394048691, + -0.057556647807359695, + -0.01890822872519493, + 0.04326202720403671, + -0.025355935096740723, + -0.045379746705293655, + -0.014578244648873806, + -0.0410686731338501, + 0.03469659760594368, + 0.01117476262152195, + 0.036190349608659744, + 0.020439794287085533, + -0.013093948364257812, + -0.03879968449473381, + 0.005251760594546795, + -0.028040902689099312, + -0.028229985386133194, + 0.005209216848015785, + -0.00709531269967556, + -0.029875000938773155, + 0.0010895866435021162, + -0.012006725184619427, + 0.07343956083059311, + 0.010541337542235851, + 0.02246297523379326, + -0.02633916214108467, + -0.020401978865265846, + -0.01178928092122078, + 0.025715190917253494, + 0.01966455765068531, + -0.07551946491003036, + -0.02388109266757965, + 0.005265941843390465, + -0.0036445611622184515, + -0.004528520628809929, + 0.018482793122529984, + -0.04511503502726555, + 0.012120174244046211, + 0.010635878890752792, + -0.008995589800179005, + -0.01553311012685299, + -0.030158624053001404, + 0.060014717280864716, + -0.056913767009973526, + 0.004339438397437334, + 0.032975949347019196, + -0.008612697944045067, + 0.0023138944525271654, + 0.03199272230267525, + 0.004360710270702839, + -0.008277077227830887, + 0.018066812306642532, + 0.02879723161458969, + 0.02745474874973297, + -0.010200989432632923, + 0.022746598348021507, + -0.03348647430539131, + -0.04084177315235138, + -0.006783327087759972, + 0.005696103908121586, + 0.0018281893571838737, + -0.01589236594736576, + -0.03482895717024803, + 0.0062491693533957005, + 0.0023871639277786016, + -0.034091535955667496, + -0.03195490688085556, + -0.014294620603322983, + 0.01899331621825695, + 0.017537381500005722, + 0.006069541443139315, + 0.03144438564777374, + 0.02019398845732212, + -0.06375854462385178, + -0.032087262719869614, + 0.005927729420363903, + 0.02123394049704075, + 0.034091535955667496, + -0.010465704835951328, + 0.041219938546419144, + 0.03170910105109215, + 0.03439406678080559, + -0.024996677413582802, + -0.0038998222444206476, + 0.03887531906366348, + 0.041219938546419144, + -0.01626107655465603, + -0.01804790459573269, + -0.0051997629925608635, + 0.023502927273511887, + -0.026547152549028397, + 0.029572470113635063, + -0.03140656650066376, + -0.023105856031179428, + 0.017924999818205833, + -0.005507021676748991, + -0.010134810581803322, + -0.024315981194376945, + -0.007908366620540619, + -0.024259258061647415, + 0.0360390841960907, + 0.02802199497818947, + -0.03195490688085556, + 0.023200396448373795, + -0.018123537302017212, + 0.022576425224542618, + -0.0413333885371685, + -0.03955601528286934, + 5.5653712479397655e-05, + 0.0209503173828125, + -0.04159810394048691, + -0.024070175364613533, + 0.02679296024143696, + 0.06493085622787476, + -0.033789005130529404, + -0.01567492075264454, + -0.02656606025993824, + -0.005653560161590576, + -0.16155190765857697, + 0.010730419307947159, + -0.021025950089097023, + 0.028532516211271286, + -0.010900593362748623, + -0.008319620974361897, + -0.03637943044304848, + -0.01583564095199108, + -0.04239225015044212, + 0.07003607600927353, + -0.03594454377889633, + -0.04863196238875389, + 0.027360206469893456, + 0.021252848207950592, + -0.02497776970267296, + -0.004530884325504303, + -0.02703876607120037, + -0.019815823063254356, + -0.03985854610800743, + -0.030877137556672096, + 0.012186353094875813, + -0.01614762656390667, + 0.03165237605571747, + -0.035131487995386124, + -0.008636333048343658, + 0.008645787835121155, + 0.002212262712419033, + -0.009577018208801746, + -0.055438924580812454, + 0.006929865572601557, + -0.010834414511919022, + 0.03229525312781334, + -0.011987816542387009, + -0.015410206280648708, + 0.02745474874973297, + 0.05207326263189316, + 0.009000317193567753, + -0.01176091842353344, + 0.023068038746714592, + -0.030971677973866463, + 0.026849685236811638, + 0.05237579345703125, + -0.024561788886785507, + 0.0284947007894516, + 0.020874684676527977, + -0.02405126579105854, + -0.020685601979494095, + 0.0006671059527434409, + -0.049653008580207825, + -0.010815506801009178, + -0.02312476374208927, + -0.028475793078541756, + -0.01626107655465603, + -0.008579608984291553, + -0.02042088657617569, + 0.011486749164760113, + -0.0293266624212265, + 0.013538291677832603, + -0.035377293825149536, + 0.009870095178484917, + -0.012413252145051956, + 0.00476250983774662, + -0.0022571696899831295, + 0.006447705905884504, + -0.04447215422987938, + 0.016828322783112526, + 0.033505380153656006, + -0.04341329261660576, + 7.6445379818324e-05, + -0.034791141748428345, + 0.05759446322917938, + -0.006835324689745903, + 0.002079905243590474, + -0.01290486566722393, + 0.010768236592411995, + 0.07635142654180527, + -0.011609652079641819, + -0.04632515832781792, + 0.01966455765068531, + -0.10089430958032608, + 0.019929273054003716, + 0.050711870193481445, + -0.0033467565663158894, + 0.00785164162516594, + -0.03653069585561752, + 0.022368434816598892, + 0.006537519861012697, + 0.004381982143968344, + 0.03955601528286934, + 0.2114696353673935, + 0.031690191477537155, + -0.05438006669282913, + 0.013112856075167656, + 0.041219938546419144, + -0.005327393300831318, + -0.01223362423479557, + 0.025242485105991364, + -0.056270889937877655, + -0.046552058309316635, + 0.015154944732785225, + -0.016459612175822258, + 0.00955338217318058, + 0.013727374374866486, + 0.03424280136823654, + 0.004329984541982412, + -0.024675238877534866, + 0.015438568778336048, + 0.08584335446357727, + 0.012999407015740871, + 0.016686512157320976, + -0.009118493646383286, + -0.004190536215901375, + 0.005601562559604645, + -0.034318435937166214, + -0.01955110765993595, + -0.004864141810685396, + 0.045606646686792374, + 0.02949683740735054, + 0.053396835923194885, + -0.01936202682554722, + 0.030688054859638214, + -0.002644788473844528, + 0.0024911591317504644, + -0.0174617487937212, + -0.014861867763102055, + -0.025488292798399925, + -0.06754019111394882, + -0.011590744368731976, + 0.018123537302017212, + 0.02720894105732441, + -0.009737737476825714, + 0.0340726263821125, + 0.0259799063205719, + -0.01553311012685299, + -0.011316575109958649, + 0.017471203580498695, + -0.03048006445169449, + -0.04371582344174385, + -0.022954588755965233, + -0.022028086706995964, + 0.024372706189751625, + 0.02620680443942547, + -0.023086946457624435, + 0.019967088475823402, + -0.03685213625431061, + -0.005171400494873524, + -0.010541337542235851, + 0.0012302165850996971, + 0.06027943268418312, + 0.029875000938773155, + 0.03199272230267525, + -0.0051146759651601315, + 0.03204944729804993, + -0.0076814680360257626, + 0.0007687376928515732, + 0.029515745118260384, + -0.02446724846959114, + 0.03348647430539131, + 0.02340838685631752, + 0.03902658447623253, + 0.013377571478486061, + 0.01896495372056961, + 0.020515428856015205, + 0.010938410647213459, + -0.0005574973183684051, + 0.02427816577255726, + 0.021876821294426918, + 0.016128718852996826, + 0.05600617453455925, + -0.011921637691557407, + -0.02773837186396122, + -0.07733465731143951, + 0.007166218478232622, + 0.020969225093722343, + -0.04950174316763878, + -0.04844288155436516, + 0.07752373814582825, + -0.0036587421782314777, + -0.03898876905441284, + -0.01647852174937725, + 0.049010127782821655, + -0.0048286886885762215, + -0.019626740366220474, + 0.05732974782586098, + -0.020628876984119415, + 0.07241851836442947, + 0.0036209258250892162, + -0.036549605429172516, + -0.016610879451036453, + -0.0497286394238472, + -0.026225712150335312, + 0.01734829880297184, + -0.0354718379676342, + -0.026433704420924187, + -0.005355755798518658, + -0.023673102259635925, + -0.0011675831628963351, + -0.0009330029133707285, + 0.005828461609780788, + 0.01135439146310091, + 0.011278758756816387, + -0.059371836483478546, + 0.010787144303321838, + 0.01670541986823082, + 0.008470886386930943, + -0.005596835631877184, + 0.005970273166894913, + -0.016270531341433525, + 0.026055539026856422, + 0.014701147563755512, + 0.004741238430142403, + 0.02008053846657276, + 0.05604398995637894, + 0.004296895116567612, + -0.002104722196236253, + 0.016043631359934807, + -0.019182397052645683, + -0.009676286019384861, + -0.01740502379834652, + 0.02580973133444786, + -0.019570017233490944, + 0.04764873534440994, + -0.022746598348021507, + 0.04935047775506973, + -0.009510839357972145, + 0.014578244648873806, + 0.017660286277532578, + -0.0019392751855775714, + 0.02645261213183403, + 0.008243987336754799, + -0.06999826431274414, + -0.00033325751428492367, + 0.010739874094724655, + 0.013169581070542336, + 0.03482895717024803, + -0.0050059533677995205, + -0.01709303818643093, + -0.021971361711621284, + 0.016941772773861885, + 0.0410686731338501, + 0.026698417961597443, + 0.04243006557226181, + -0.049426108598709106, + -0.03530166298151016, + -0.021631013602018356, + -0.038648419082164764, + 0.022860048338770866, + 0.02896740660071373, + -0.0329570434987545, + 0.0008916411316022277, + 0.025677373632788658, + 0.05101440101861954, + 0.0709436759352684, + 0.057443197816610336, + -0.0075018396601080894, + -0.019702374935150146, + 0.008073813281953335, + -0.02323821373283863, + 0.0043016220442950726, + 0.005232852417975664, + -0.018671875819563866, + -0.01896495372056961, + 0.012696875259280205, + -0.003824189305305481, + -0.021498655900359154, + -0.040463607758283615, + 0.06292658299207687, + -0.008726147934794426, + 0.00958174467086792, + 0.008849050849676132, + -0.021044857800006866, + -0.025355935096740723, + -0.02193354442715645, + 0.041219938546419144, + 0.03013971634209156, + 0.03628489002585411, + -0.03866732865571976, + 0.03148220106959343, + -0.006480795331299305, + -0.06251060217618942, + 0.0854651927947998, + 0.028248893097043037, + -0.01910676434636116, + 0.02620680443942547, + -0.05116566643118858, + 0.019380934536457062, + 0.021555380895733833, + 0.0031009495723992586, + -0.0020385433454066515, + -0.021801186725497246, + 0.013935364782810211, + -0.015400752425193787, + -0.0027086036279797554, + -0.001123857800848782, + 0.022028086706995964, + 0.01639343425631523, + 0.01609090156853199, + -0.016998497769236565, + -0.02265205793082714, + -0.0029922272078692913, + -0.04299731180071831, + -0.021460838615894318, + 0.017282120883464813, + -0.04364019259810448, + -0.019475474953651428, + 0.06614098697900772, + 0.03450751677155495, + -1.5242912922985852e-05, + -0.016941772773861885, + 0.0027251483406871557, + 0.03061242215335369, + 0.03271123394370079, + -0.051695097237825394, + -0.011023497208952904, + 0.017527928575873375, + 0.027133308351039886, + -0.027757279574871063, + 0.023313846439123154, + 0.017887184396386147, + -0.01006863173097372, + -0.030536789447069168, + -0.022084811702370644, + -0.0037651010788977146, + 0.04095522314310074, + -0.06035506725311279, + 0.015485838986933231, + 0.014285166747868061, + 0.0011563563020899892, + -0.02253860794007778, + -0.005549564957618713, + -0.015079312026500702, + 0.0031553106382489204, + 0.012895411811769009, + 0.03948038071393967, + 0.04492595046758652, + -0.006863687187433243, + -0.02352183684706688, + 0.018331527709960938, + 0.0300262663513422, + 0.004287440795451403, + 0.004887776914983988, + -0.0340726263821125, + -0.024958861991763115, + 0.0438670888543129, + 0.03278686851263046, + 0.020742326974868774, + -0.013519383035600185, + -0.06307785212993622, + -0.04855633154511452, + -0.004703422077000141, + 0.036133624613285065, + -0.03594454377889633, + 0.0012633060105144978, + -0.06288877129554749, + -0.0413333885371685, + 0.01810462959110737, + -0.06330475211143494, + 0.000763419724535197, + -0.027171123772859573, + 0.0096384696662426, + -0.009543928317725658, + -0.012971044518053532, + -0.03136875107884407, + 0.058426424860954285, + 0.03386463597416878, + -0.007010225672274828, + -0.05173291265964508, + 0.05850205942988396, + 0.03488568216562271, + -0.011751463636755943, + 0.046438608318567276, + 0.039934176951646805, + 0.04927484318614006, + -0.043980538845062256, + -0.00198654574342072, + 0.01614762656390667, + 0.0009625470265746117, + 0.03339193016290665, + -0.0865996852517128, + 0.021252848207950592, + 0.007208762224763632, + -0.03583109378814697, + 0.04904794320464134, + 0.006003362592309713, + 0.008792325854301453, + -0.0311418529599905, + 0.01097622700035572, + -0.02458069659769535, + 0.018085720017552376, + -0.017669739201664925, + -0.011430024169385433, + -0.039820730686187744, + -0.04084177315235138, + -0.005908821243792772, + -0.003512203460559249, + -0.00965265091508627, + -0.0047388747334480286, + 0.0592205710709095, + -0.0059135486371815205, + -0.021517563611268997, + -0.04401835426688194, + 0.04284604638814926, + 0.04632515832781792, + -0.011458386667072773, + -0.018482793122529984, + 0.027927452698349953, + -0.06493085622787476, + 0.0351882129907608, + 0.0034814774990081787, + 0.03804335743188858, + 0.025885364040732384, + -0.04159810394048691, + 0.008589062839746475, + -0.0035500198137015104, + -0.008442523889243603, + 0.005483386106789112, + -0.026320254430174828, + 0.008669422939419746, + -0.027492564171552658, + -0.012148536741733551, + -0.015495292842388153, + -0.029648102819919586, + -0.006665150634944439, + 0.05721629783511162, + 0.026603877544403076, + 0.015240032225847244, + -0.024429431185126305, + 0.04295949637889862, + -0.04927484318614006, + -0.05165728181600571, + -0.036719780415296555, + 0.036833230406045914, + -0.04791345074772835, + -0.02650933712720871, + 0.020855776965618134, + -0.0036776503548026085, + 0.006182990502566099, + -0.029893908649683, + 0.007118948269635439, + 0.0009324120474047959, + 0.04556883126497269, + -0.024202533066272736, + -0.07865823060274124, + -0.004027452785521746, + -0.004242533817887306, + -0.03898876905441284, + -0.006078995298594236, + 0.033618830144405365, + -0.013245213776826859, + -0.01378409843891859, + 0.01681886985898018, + -0.014842959120869637, + 0.0032687599305063486, + -0.04700585454702377, + 0.009071222506463528, + 0.026471519842743874, + 0.030045175924897194, + 0.006863687187433243, + -0.03429952636361122, + 0.018842048943042755, + -0.01849224790930748, + 0.004533248022198677, + -0.021574288606643677, + -0.023673102259635925, + -0.010730419307947159, + 0.012243078090250492, + -0.03978291153907776, + 0.03781645745038986, + 0.047724369913339615, + -0.03592563420534134, + -0.021215032786130905, + 0.014757872559130192, + -0.040652692317962646, + 0.004173991270363331, + -0.04352674260735512, + -0.028116535395383835, + -0.009619561024010181, + 0.011836551129817963, + 0.022897865623235703, + -0.05528765916824341, + -0.025355935096740723, + -0.017442841082811356, + 0.017111947759985924, + -0.16896392405033112, + 0.029856093227863312, + 0.016194898635149002, + 0.016866140067577362, + -0.04326202720403671, + -0.013509929180145264, + -0.05611962080001831, + 0.006154628470540047, + 0.014616061002016068, + -0.021290665492415428, + 0.0066131530329585075, + -0.04564446210861206, + 0.06096012890338898, + -0.03384573012590408, + -0.027416931465268135, + 0.010229351930320263, + 0.006901503540575504, + 0.057027217000722885, + -0.05388845130801201, + 0.06186772510409355, + 0.009699921123683453, + -0.01977800764143467, + -0.0142473503947258, + -0.0002583632303867489, + -0.017244303598999977, + -0.01770755648612976, + 0.019796915352344513, + 0.03055569715797901, + -0.030158624053001404, + 0.05131693184375763, + 0.0026967860758304596, + 0.02441052347421646, + 0.019182397052645683, + 0.041749369353055954, + 0.03246542811393738, + 0.0048452336341142654, + -0.0012266712728887796, + -0.03808117285370827, + -0.0015800188994035125, + -0.01989145576953888, + -0.021044857800006866, + 0.02153647318482399, + -0.01650688424706459, + -0.01559928897768259, + 0.004192899446934462, + 0.09136456251144409, + -0.028929589316248894, + -0.003526384709402919, + -0.02592318132519722, + 0.03384573012590408, + 0.015240032225847244, + 0.03781645745038986, + 0.009520293213427067, + 0.011524565517902374, + -0.017631923779845238, + -0.005559019278734922, + 0.01158128958195448, + -0.019031131640076637, + -0.024032358080148697, + 0.014776780270040035, + 0.014086630195379257, + -0.019314754754304886, + -0.03161455690860748, + -0.0729101300239563, + -0.017074130475521088, + 0.006750237662345171, + -0.07007389515638351, + -0.007246578577905893, + -0.025091219693422318, + -0.013349208980798721, + -0.025885364040732384, + 0.029950633645057678, + 0.026887500658631325, + -0.0005920638795942068, + -0.012838686816394329, + 0.048064716160297394, + 0.03757065162062645, + 0.01751847378909588, + -0.013821914792060852, + -0.026244621723890305, + -0.027019858360290527, + -0.011808188632130623, + -0.0006871959194540977, + -0.03278686851263046, + 0.035377293825149536, + 0.013056132011115551, + -0.025960998609662056, + -0.012469977140426636, + -0.0031482200138270855, + -0.0007728738128207624, + -0.08077595382928848, + 0.015088766813278198, + 0.056497786194086075, + 0.01623271405696869, + -0.009293394163250923, + 0.06659477949142456, + -0.01989145576953888, + -0.008598516695201397, + -0.015192762017250061, + -0.0026802413631230593, + 0.00839525368064642, + -0.001349574769847095, + 0.02866487391293049, + 0.005842642392963171, + -0.025942089036107063, + 0.0029638647101819515, + -0.024240348488092422, + -0.03524493798613548, + 0.021876821294426918, + -0.010720965452492237, + -0.005984454415738583, + -0.025771915912628174, + -0.04863196238875389, + 0.008239260874688625, + -0.06856123358011246, + -0.03305158391594887, + -0.032162897288799286, + 0.03318393975496292, + -0.0441318042576313, + -0.02000490576028824, + 0.03225743770599365, + 0.03131202608346939, + 0.048896677792072296, + -0.03499913215637207, + 0.024297073483467102, + 0.000977909890934825, + 0.030101899057626724, + 0.015882911160588264, + 0.018000634387135506, + -0.006197171751409769, + -0.006892049219459295, + -0.00835270993411541, + 0.02195245400071144, + 0.039593830704689026, + -0.010238805785775185, + 0.00586627796292305, + 0.0156465582549572, + 0.005800099112093449, + -0.015230578370392323, + -0.031690191477537155, + 0.006849505938589573, + -0.028986314311623573, + 0.02253860794007778, + -0.01421898789703846, + -0.014795688912272453, + -0.019872548058629036, + 0.018331527709960938, + -0.01570328325033188, + -0.019116219133138657, + -0.011864913627505302, + 0.002848051954060793, + 0.00756329158321023, + 0.032919224351644516, + 0.06387199461460114, + -0.01949438452720642, + -0.013112856075167656, + 0.004374891519546509, + 0.022311709821224213, + 0.01765083149075508, + 0.02304913103580475, + -0.034564241766929626, + -0.00717094587162137, + -0.05332120507955551, + -0.05154383182525635, + -0.003493295283988118, + 0.022444067522883415, + 0.037589557468891144, + -0.0087970532476902, + -0.06220807135105133, + 0.004157446790486574, + 0.009151582606136799, + 0.06288877129554749, + -0.030820412561297417, + 0.011902729980647564, + 0.003717830404639244, + -0.056157439947128296, + 0.024883229285478592, + 0.0030016812961548567, + 0.02505340240895748, + -0.026717327535152435, + 0.025185760110616684, + -0.01331139262765646, + 0.005445569753646851, + 0.02475087158381939, + 0.024202533066272736, + 0.036833230406045914, + -0.002345802029594779, + 0.023427294567227364, + -0.011184217408299446, + -0.01375573594123125, + 0.02312476374208927, + -0.029515745118260384, + -0.05910712108016014, + -0.017631923779845238, + 0.01743338629603386, + -0.024486156180500984, + -0.0026613331865519285, + 0.01509822066873312, + -0.011042405851185322, + 0.03392136096954346, + -0.036247074604034424, + -0.04787563532590866, + 0.030064083635807037, + -0.022670965641736984, + 0.005308485124260187, + 0.014786235056817532, + -0.027284573763608932, + 0.009671558625996113, + -0.0360390841960907, + 0.02153647318482399, + -0.05188417807221413, + -0.008995589800179005, + 0.011051859706640244, + -0.0006470159278251231, + -0.020269621163606644, + 0.02229280211031437, + 0.011108584702014923, + -0.013736828230321407, + -0.009841732680797577, + 0.034148260951042175, + -0.0014807506231591105, + -0.0018388251774013042, + 0.013500475324690342, + -0.026849685236811638, + -0.060014717280864716, + -0.008404707536101341, + 0.011212579905986786, + 0.02047761157155037, + -0.0016426523216068745, + 0.0483294315636158, + 0.022444067522883415, + 0.036719780415296555, + -0.03861060366034508, + 0.037362661212682724, + -0.006286986172199249, + -0.02773837186396122, + 0.033448655158281326, + 0.019985998049378395, + -0.03745720162987709, + -0.005204489920288324, + 0.016487974673509598, + -0.019314754754304886, + -0.0555901937186718, + -0.008636333048343658 + ], + "key": "Persistence Demonstration", + "status": "activated" + } + }, + { + "id": "76374204-35a7-49af-a437-29410ae353e3", + "memory": "On January 13, 2026, at 8:51 PM, the user added another memory to demonstrate the concept of persistence.", + "metadata": { + "sources": [ + "\"{\\\"type\\\": \\\"chat\\\", \\\"role\\\": \\\"user\\\", \\\"chat_time\\\": \\\"08:51 PM on 13 January, 2026\\\", \\\"content\\\": \\\"This is a test memory for dump example\\\", \\\"lang\\\": \\\"en\\\"}\"", + "\"{\\\"type\\\": \\\"chat\\\", \\\"role\\\": \\\"user\\\", \\\"chat_time\\\": \\\"08:51 PM on 13 January, 2026\\\", \\\"content\\\": \\\"Another memory to demonstrate persistence\\\", \\\"lang\\\": \\\"en\\\"}\"" + ], + "confidence": 0.99, + "usage": [], + "created_at": "2026-01-13T20:51:42.394870000+00:00", + "session_id": "default_session", + "memory_type": "WorkingMemory", + "type": "fact", + "tags": [ + "persistence", + "memory", + "demonstration" + ], + "updated_at": "2026-01-13T20:51:42.396281000+00:00", + "user_id": "example_user", + "background": "On January 13, 2026, at 8:51 PM, the user engaged in a memory demonstration by creating a test memory example and another memory to illustrate the concept of persistence. These actions reflect the user's interest in exploring and demonstrating memory-related concepts.", + "file_ids": [], + "embedding": [ + -0.022425159811973572, + 0.01004026923328638, + 0.013415387831628323, + -0.013093948364257812, + -0.04768655076622963, + -0.047837819904088974, + 0.02147974818944931, + 0.019097311422228813, + 0.005332120228558779, + -0.005180854815989733, + 0.0216499213129282, + -0.006977136246860027, + -0.014067722484469414, + 0.014010997489094734, + -0.01164746843278408, + 0.037948813289403915, + 0.049539558589458466, + -0.028778323903679848, + -0.0363227054476738, + -0.006282258778810501, + 0.03201163187623024, + -0.043678008019924164, + 0.06640569865703583, + 0.04734620451927185, + -0.03552856296300888, + 0.008948319591581821, + -0.018199170008301735, + 0.015788370743393898, + 0.08047342300415039, + 0.04632515832781792, + -0.01887986622750759, + 0.00966683216392994, + -0.02516685239970684, + -0.00974719226360321, + -0.01631780155003071, + -0.01085332315415144, + 0.0284947007894516, + 0.012914320454001427, + -0.02427816577255726, + 0.006589517462998629, + -0.013954272493720055, + -0.0017856458434835076, + 0.004043997265398502, + -0.004202353768050671, + 0.032805778086185455, + -0.00395891023799777, + -0.002543156733736396, + -0.018889321014285088, + -0.02066669426858425, + -0.006225534249097109, + 0.008262895978987217, + 0.0266795102506876, + 0.055325478315353394, + -0.019683465361595154, + -0.013576108030974865, + 0.015372389927506447, + -0.05816170945763588, + -0.00842361617833376, + -0.009548655711114407, + -0.0019262757850810885, + -0.047535285353660583, + 0.026603877544403076, + -0.0035098399966955185, + -0.030290981754660606, + -0.015334573574364185, + 0.04798908531665802, + 0.028400158509612083, + -0.00544084282591939, + 0.008106903173029423, + -0.03639834001660347, + 0.011515110731124878, + 0.042278800159692764, + -0.07343956083059311, + -0.02628243714570999, + -0.08886867761611938, + 0.02773837186396122, + -0.0017962816637009382, + -0.007761827670037746, + -0.011363845318555832, + 0.031860366463661194, + 0.017783189192414284, + -0.026849685236811638, + 0.04144683852791786, + -0.00212244875729084, + 0.03042333945631981, + 0.026755142956972122, + -0.04500158503651619, + 0.03989636152982712, + 0.04318639263510704, + -0.03339193016290665, + 0.025412660092115402, + -0.01126930397003889, + 0.027587104588747025, + -0.03471550717949867, + -0.006041178945451975, + -0.007709830068051815, + -0.02686859294772148, + 0.0020196351688355207, + 0.05143038183450699, + 0.029402295127511024, + 0.059598736464977264, + 0.01989145576953888, + 0.013944818638265133, + -0.010550791397690773, + 0.011004588566720486, + -0.02439161390066147, + 0.05952310189604759, + -0.0021389934699982405, + -0.011723102070391178, + 0.007941455580294132, + 0.010248259641230106, + 0.029893908649683, + 0.033032674342393875, + 0.008130538277328014, + 0.025242485105991364, + -0.009198852814733982, + 0.04307294636964798, + 0.005294303875416517, + -0.030272074043750763, + -0.004263805691152811, + 0.04027452692389488, + 0.017197033390402794, + 0.06016598269343376, + -0.025620650500059128, + -0.02253860794007778, + -0.015088766813278198, + -0.007000771816819906, + -0.018870411440730095, + -0.015325118787586689, + -0.0027582377661019564, + 0.025734098628163338, + -0.017972271889448166, + 0.014824051409959793, + -0.025072310119867325, + -0.05165728181600571, + -0.00673132948577404, + 0.004667968954890966, + 0.03293813392519951, + 0.02083686739206314, + -0.03785427287220955, + 0.013188489712774754, + -0.02533702552318573, + 0.002592790871858597, + -0.03611471503973007, + 0.022084811702370644, + -0.007724011316895485, + 0.0028811413794755936, + 0.007497112732380629, + 0.026755142956972122, + 0.014861867763102055, + -0.012413252145051956, + 0.014880775474011898, + -0.03142547607421875, + -0.03377009555697441, + -0.024202533066272736, + 0.0020539062097668648, + 0.02323821373283863, + 0.09204525500535965, + -0.03365664556622505, + -0.031633466482162476, + -0.005308485124260187, + -0.06735111027956009, + -0.06126265972852707, + 0.04545538127422333, + 0.03220071271061897, + 0.028343435376882553, + 0.010843869298696518, + 0.02891068160533905, + -0.034488607197999954, + 0.006887322291731834, + -0.0065280660055577755, + -0.003923457581549883, + 0.02036416158080101, + 0.008220352232456207, + 0.0012183990329504013, + 0.0293266624212265, + 0.04390490800142288, + 0.01639343425631523, + -0.0038076445925980806, + -0.04159810394048691, + -0.057556647807359695, + -0.01890822872519493, + 0.04326202720403671, + -0.025355935096740723, + -0.045379746705293655, + -0.014578244648873806, + -0.0410686731338501, + 0.03469659760594368, + 0.01117476262152195, + 0.036190349608659744, + 0.020439794287085533, + -0.013093948364257812, + -0.03879968449473381, + 0.005251760594546795, + -0.028040902689099312, + -0.028229985386133194, + 0.005209216848015785, + -0.00709531269967556, + -0.029875000938773155, + 0.0010895866435021162, + -0.012006725184619427, + 0.07343956083059311, + 0.010541337542235851, + 0.02246297523379326, + -0.02633916214108467, + -0.020401978865265846, + -0.01178928092122078, + 0.025715190917253494, + 0.01966455765068531, + -0.07551946491003036, + -0.02388109266757965, + 0.005265941843390465, + -0.0036445611622184515, + -0.004528520628809929, + 0.018482793122529984, + -0.04511503502726555, + 0.012120174244046211, + 0.010635878890752792, + -0.008995589800179005, + -0.01553311012685299, + -0.030158624053001404, + 0.060014717280864716, + -0.056913767009973526, + 0.004339438397437334, + 0.032975949347019196, + -0.008612697944045067, + 0.0023138944525271654, + 0.03199272230267525, + 0.004360710270702839, + -0.008277077227830887, + 0.018066812306642532, + 0.02879723161458969, + 0.02745474874973297, + -0.010200989432632923, + 0.022746598348021507, + -0.03348647430539131, + -0.04084177315235138, + -0.006783327087759972, + 0.005696103908121586, + 0.0018281893571838737, + -0.01589236594736576, + -0.03482895717024803, + 0.0062491693533957005, + 0.0023871639277786016, + -0.034091535955667496, + -0.03195490688085556, + -0.014294620603322983, + 0.01899331621825695, + 0.017537381500005722, + 0.006069541443139315, + 0.03144438564777374, + 0.02019398845732212, + -0.06375854462385178, + -0.032087262719869614, + 0.005927729420363903, + 0.02123394049704075, + 0.034091535955667496, + -0.010465704835951328, + 0.041219938546419144, + 0.03170910105109215, + 0.03439406678080559, + -0.024996677413582802, + -0.0038998222444206476, + 0.03887531906366348, + 0.041219938546419144, + -0.01626107655465603, + -0.01804790459573269, + -0.0051997629925608635, + 0.023502927273511887, + -0.026547152549028397, + 0.029572470113635063, + -0.03140656650066376, + -0.023105856031179428, + 0.017924999818205833, + -0.005507021676748991, + -0.010134810581803322, + -0.024315981194376945, + -0.007908366620540619, + -0.024259258061647415, + 0.0360390841960907, + 0.02802199497818947, + -0.03195490688085556, + 0.023200396448373795, + -0.018123537302017212, + 0.022576425224542618, + -0.0413333885371685, + -0.03955601528286934, + 5.5653712479397655e-05, + 0.0209503173828125, + -0.04159810394048691, + -0.024070175364613533, + 0.02679296024143696, + 0.06493085622787476, + -0.033789005130529404, + -0.01567492075264454, + -0.02656606025993824, + -0.005653560161590576, + -0.16155190765857697, + 0.010730419307947159, + -0.021025950089097023, + 0.028532516211271286, + -0.010900593362748623, + -0.008319620974361897, + -0.03637943044304848, + -0.01583564095199108, + -0.04239225015044212, + 0.07003607600927353, + -0.03594454377889633, + -0.04863196238875389, + 0.027360206469893456, + 0.021252848207950592, + -0.02497776970267296, + -0.004530884325504303, + -0.02703876607120037, + -0.019815823063254356, + -0.03985854610800743, + -0.030877137556672096, + 0.012186353094875813, + -0.01614762656390667, + 0.03165237605571747, + -0.035131487995386124, + -0.008636333048343658, + 0.008645787835121155, + 0.002212262712419033, + -0.009577018208801746, + -0.055438924580812454, + 0.006929865572601557, + -0.010834414511919022, + 0.03229525312781334, + -0.011987816542387009, + -0.015410206280648708, + 0.02745474874973297, + 0.05207326263189316, + 0.009000317193567753, + -0.01176091842353344, + 0.023068038746714592, + -0.030971677973866463, + 0.026849685236811638, + 0.05237579345703125, + -0.024561788886785507, + 0.0284947007894516, + 0.020874684676527977, + -0.02405126579105854, + -0.020685601979494095, + 0.0006671059527434409, + -0.049653008580207825, + -0.010815506801009178, + -0.02312476374208927, + -0.028475793078541756, + -0.01626107655465603, + -0.008579608984291553, + -0.02042088657617569, + 0.011486749164760113, + -0.0293266624212265, + 0.013538291677832603, + -0.035377293825149536, + 0.009870095178484917, + -0.012413252145051956, + 0.00476250983774662, + -0.0022571696899831295, + 0.006447705905884504, + -0.04447215422987938, + 0.016828322783112526, + 0.033505380153656006, + -0.04341329261660576, + 7.6445379818324e-05, + -0.034791141748428345, + 0.05759446322917938, + -0.006835324689745903, + 0.002079905243590474, + -0.01290486566722393, + 0.010768236592411995, + 0.07635142654180527, + -0.011609652079641819, + -0.04632515832781792, + 0.01966455765068531, + -0.10089430958032608, + 0.019929273054003716, + 0.050711870193481445, + -0.0033467565663158894, + 0.00785164162516594, + -0.03653069585561752, + 0.022368434816598892, + 0.006537519861012697, + 0.004381982143968344, + 0.03955601528286934, + 0.2114696353673935, + 0.031690191477537155, + -0.05438006669282913, + 0.013112856075167656, + 0.041219938546419144, + -0.005327393300831318, + -0.01223362423479557, + 0.025242485105991364, + -0.056270889937877655, + -0.046552058309316635, + 0.015154944732785225, + -0.016459612175822258, + 0.00955338217318058, + 0.013727374374866486, + 0.03424280136823654, + 0.004329984541982412, + -0.024675238877534866, + 0.015438568778336048, + 0.08584335446357727, + 0.012999407015740871, + 0.016686512157320976, + -0.009118493646383286, + -0.004190536215901375, + 0.005601562559604645, + -0.034318435937166214, + -0.01955110765993595, + -0.004864141810685396, + 0.045606646686792374, + 0.02949683740735054, + 0.053396835923194885, + -0.01936202682554722, + 0.030688054859638214, + -0.002644788473844528, + 0.0024911591317504644, + -0.0174617487937212, + -0.014861867763102055, + -0.025488292798399925, + -0.06754019111394882, + -0.011590744368731976, + 0.018123537302017212, + 0.02720894105732441, + -0.009737737476825714, + 0.0340726263821125, + 0.0259799063205719, + -0.01553311012685299, + -0.011316575109958649, + 0.017471203580498695, + -0.03048006445169449, + -0.04371582344174385, + -0.022954588755965233, + -0.022028086706995964, + 0.024372706189751625, + 0.02620680443942547, + -0.023086946457624435, + 0.019967088475823402, + -0.03685213625431061, + -0.005171400494873524, + -0.010541337542235851, + 0.0012302165850996971, + 0.06027943268418312, + 0.029875000938773155, + 0.03199272230267525, + -0.0051146759651601315, + 0.03204944729804993, + -0.0076814680360257626, + 0.0007687376928515732, + 0.029515745118260384, + -0.02446724846959114, + 0.03348647430539131, + 0.02340838685631752, + 0.03902658447623253, + 0.013377571478486061, + 0.01896495372056961, + 0.020515428856015205, + 0.010938410647213459, + -0.0005574973183684051, + 0.02427816577255726, + 0.021876821294426918, + 0.016128718852996826, + 0.05600617453455925, + -0.011921637691557407, + -0.02773837186396122, + -0.07733465731143951, + 0.007166218478232622, + 0.020969225093722343, + -0.04950174316763878, + -0.04844288155436516, + 0.07752373814582825, + -0.0036587421782314777, + -0.03898876905441284, + -0.01647852174937725, + 0.049010127782821655, + -0.0048286886885762215, + -0.019626740366220474, + 0.05732974782586098, + -0.020628876984119415, + 0.07241851836442947, + 0.0036209258250892162, + -0.036549605429172516, + -0.016610879451036453, + -0.0497286394238472, + -0.026225712150335312, + 0.01734829880297184, + -0.0354718379676342, + -0.026433704420924187, + -0.005355755798518658, + -0.023673102259635925, + -0.0011675831628963351, + -0.0009330029133707285, + 0.005828461609780788, + 0.01135439146310091, + 0.011278758756816387, + -0.059371836483478546, + 0.010787144303321838, + 0.01670541986823082, + 0.008470886386930943, + -0.005596835631877184, + 0.005970273166894913, + -0.016270531341433525, + 0.026055539026856422, + 0.014701147563755512, + 0.004741238430142403, + 0.02008053846657276, + 0.05604398995637894, + 0.004296895116567612, + -0.002104722196236253, + 0.016043631359934807, + -0.019182397052645683, + -0.009676286019384861, + -0.01740502379834652, + 0.02580973133444786, + -0.019570017233490944, + 0.04764873534440994, + -0.022746598348021507, + 0.04935047775506973, + -0.009510839357972145, + 0.014578244648873806, + 0.017660286277532578, + -0.0019392751855775714, + 0.02645261213183403, + 0.008243987336754799, + -0.06999826431274414, + -0.00033325751428492367, + 0.010739874094724655, + 0.013169581070542336, + 0.03482895717024803, + -0.0050059533677995205, + -0.01709303818643093, + -0.021971361711621284, + 0.016941772773861885, + 0.0410686731338501, + 0.026698417961597443, + 0.04243006557226181, + -0.049426108598709106, + -0.03530166298151016, + -0.021631013602018356, + -0.038648419082164764, + 0.022860048338770866, + 0.02896740660071373, + -0.0329570434987545, + 0.0008916411316022277, + 0.025677373632788658, + 0.05101440101861954, + 0.0709436759352684, + 0.057443197816610336, + -0.0075018396601080894, + -0.019702374935150146, + 0.008073813281953335, + -0.02323821373283863, + 0.0043016220442950726, + 0.005232852417975664, + -0.018671875819563866, + -0.01896495372056961, + 0.012696875259280205, + -0.003824189305305481, + -0.021498655900359154, + -0.040463607758283615, + 0.06292658299207687, + -0.008726147934794426, + 0.00958174467086792, + 0.008849050849676132, + -0.021044857800006866, + -0.025355935096740723, + -0.02193354442715645, + 0.041219938546419144, + 0.03013971634209156, + 0.03628489002585411, + -0.03866732865571976, + 0.03148220106959343, + -0.006480795331299305, + -0.06251060217618942, + 0.0854651927947998, + 0.028248893097043037, + -0.01910676434636116, + 0.02620680443942547, + -0.05116566643118858, + 0.019380934536457062, + 0.021555380895733833, + 0.0031009495723992586, + -0.0020385433454066515, + -0.021801186725497246, + 0.013935364782810211, + -0.015400752425193787, + -0.0027086036279797554, + -0.001123857800848782, + 0.022028086706995964, + 0.01639343425631523, + 0.01609090156853199, + -0.016998497769236565, + -0.02265205793082714, + -0.0029922272078692913, + -0.04299731180071831, + -0.021460838615894318, + 0.017282120883464813, + -0.04364019259810448, + -0.019475474953651428, + 0.06614098697900772, + 0.03450751677155495, + -1.5242912922985852e-05, + -0.016941772773861885, + 0.0027251483406871557, + 0.03061242215335369, + 0.03271123394370079, + -0.051695097237825394, + -0.011023497208952904, + 0.017527928575873375, + 0.027133308351039886, + -0.027757279574871063, + 0.023313846439123154, + 0.017887184396386147, + -0.01006863173097372, + -0.030536789447069168, + -0.022084811702370644, + -0.0037651010788977146, + 0.04095522314310074, + -0.06035506725311279, + 0.015485838986933231, + 0.014285166747868061, + 0.0011563563020899892, + -0.02253860794007778, + -0.005549564957618713, + -0.015079312026500702, + 0.0031553106382489204, + 0.012895411811769009, + 0.03948038071393967, + 0.04492595046758652, + -0.006863687187433243, + -0.02352183684706688, + 0.018331527709960938, + 0.0300262663513422, + 0.004287440795451403, + 0.004887776914983988, + -0.0340726263821125, + -0.024958861991763115, + 0.0438670888543129, + 0.03278686851263046, + 0.020742326974868774, + -0.013519383035600185, + -0.06307785212993622, + -0.04855633154511452, + -0.004703422077000141, + 0.036133624613285065, + -0.03594454377889633, + 0.0012633060105144978, + -0.06288877129554749, + -0.0413333885371685, + 0.01810462959110737, + -0.06330475211143494, + 0.000763419724535197, + -0.027171123772859573, + 0.0096384696662426, + -0.009543928317725658, + -0.012971044518053532, + -0.03136875107884407, + 0.058426424860954285, + 0.03386463597416878, + -0.007010225672274828, + -0.05173291265964508, + 0.05850205942988396, + 0.03488568216562271, + -0.011751463636755943, + 0.046438608318567276, + 0.039934176951646805, + 0.04927484318614006, + -0.043980538845062256, + -0.00198654574342072, + 0.01614762656390667, + 0.0009625470265746117, + 0.03339193016290665, + -0.0865996852517128, + 0.021252848207950592, + 0.007208762224763632, + -0.03583109378814697, + 0.04904794320464134, + 0.006003362592309713, + 0.008792325854301453, + -0.0311418529599905, + 0.01097622700035572, + -0.02458069659769535, + 0.018085720017552376, + -0.017669739201664925, + -0.011430024169385433, + -0.039820730686187744, + -0.04084177315235138, + -0.005908821243792772, + -0.003512203460559249, + -0.00965265091508627, + -0.0047388747334480286, + 0.0592205710709095, + -0.0059135486371815205, + -0.021517563611268997, + -0.04401835426688194, + 0.04284604638814926, + 0.04632515832781792, + -0.011458386667072773, + -0.018482793122529984, + 0.027927452698349953, + -0.06493085622787476, + 0.0351882129907608, + 0.0034814774990081787, + 0.03804335743188858, + 0.025885364040732384, + -0.04159810394048691, + 0.008589062839746475, + -0.0035500198137015104, + -0.008442523889243603, + 0.005483386106789112, + -0.026320254430174828, + 0.008669422939419746, + -0.027492564171552658, + -0.012148536741733551, + -0.015495292842388153, + -0.029648102819919586, + -0.006665150634944439, + 0.05721629783511162, + 0.026603877544403076, + 0.015240032225847244, + -0.024429431185126305, + 0.04295949637889862, + -0.04927484318614006, + -0.05165728181600571, + -0.036719780415296555, + 0.036833230406045914, + -0.04791345074772835, + -0.02650933712720871, + 0.020855776965618134, + -0.0036776503548026085, + 0.006182990502566099, + -0.029893908649683, + 0.007118948269635439, + 0.0009324120474047959, + 0.04556883126497269, + -0.024202533066272736, + -0.07865823060274124, + -0.004027452785521746, + -0.004242533817887306, + -0.03898876905441284, + -0.006078995298594236, + 0.033618830144405365, + -0.013245213776826859, + -0.01378409843891859, + 0.01681886985898018, + -0.014842959120869637, + 0.0032687599305063486, + -0.04700585454702377, + 0.009071222506463528, + 0.026471519842743874, + 0.030045175924897194, + 0.006863687187433243, + -0.03429952636361122, + 0.018842048943042755, + -0.01849224790930748, + 0.004533248022198677, + -0.021574288606643677, + -0.023673102259635925, + -0.010730419307947159, + 0.012243078090250492, + -0.03978291153907776, + 0.03781645745038986, + 0.047724369913339615, + -0.03592563420534134, + -0.021215032786130905, + 0.014757872559130192, + -0.040652692317962646, + 0.004173991270363331, + -0.04352674260735512, + -0.028116535395383835, + -0.009619561024010181, + 0.011836551129817963, + 0.022897865623235703, + -0.05528765916824341, + -0.025355935096740723, + -0.017442841082811356, + 0.017111947759985924, + -0.16896392405033112, + 0.029856093227863312, + 0.016194898635149002, + 0.016866140067577362, + -0.04326202720403671, + -0.013509929180145264, + -0.05611962080001831, + 0.006154628470540047, + 0.014616061002016068, + -0.021290665492415428, + 0.0066131530329585075, + -0.04564446210861206, + 0.06096012890338898, + -0.03384573012590408, + -0.027416931465268135, + 0.010229351930320263, + 0.006901503540575504, + 0.057027217000722885, + -0.05388845130801201, + 0.06186772510409355, + 0.009699921123683453, + -0.01977800764143467, + -0.0142473503947258, + -0.0002583632303867489, + -0.017244303598999977, + -0.01770755648612976, + 0.019796915352344513, + 0.03055569715797901, + -0.030158624053001404, + 0.05131693184375763, + 0.0026967860758304596, + 0.02441052347421646, + 0.019182397052645683, + 0.041749369353055954, + 0.03246542811393738, + 0.0048452336341142654, + -0.0012266712728887796, + -0.03808117285370827, + -0.0015800188994035125, + -0.01989145576953888, + -0.021044857800006866, + 0.02153647318482399, + -0.01650688424706459, + -0.01559928897768259, + 0.004192899446934462, + 0.09136456251144409, + -0.028929589316248894, + -0.003526384709402919, + -0.02592318132519722, + 0.03384573012590408, + 0.015240032225847244, + 0.03781645745038986, + 0.009520293213427067, + 0.011524565517902374, + -0.017631923779845238, + -0.005559019278734922, + 0.01158128958195448, + -0.019031131640076637, + -0.024032358080148697, + 0.014776780270040035, + 0.014086630195379257, + -0.019314754754304886, + -0.03161455690860748, + -0.0729101300239563, + -0.017074130475521088, + 0.006750237662345171, + -0.07007389515638351, + -0.007246578577905893, + -0.025091219693422318, + -0.013349208980798721, + -0.025885364040732384, + 0.029950633645057678, + 0.026887500658631325, + -0.0005920638795942068, + -0.012838686816394329, + 0.048064716160297394, + 0.03757065162062645, + 0.01751847378909588, + -0.013821914792060852, + -0.026244621723890305, + -0.027019858360290527, + -0.011808188632130623, + -0.0006871959194540977, + -0.03278686851263046, + 0.035377293825149536, + 0.013056132011115551, + -0.025960998609662056, + -0.012469977140426636, + -0.0031482200138270855, + -0.0007728738128207624, + -0.08077595382928848, + 0.015088766813278198, + 0.056497786194086075, + 0.01623271405696869, + -0.009293394163250923, + 0.06659477949142456, + -0.01989145576953888, + -0.008598516695201397, + -0.015192762017250061, + -0.0026802413631230593, + 0.00839525368064642, + -0.001349574769847095, + 0.02866487391293049, + 0.005842642392963171, + -0.025942089036107063, + 0.0029638647101819515, + -0.024240348488092422, + -0.03524493798613548, + 0.021876821294426918, + -0.010720965452492237, + -0.005984454415738583, + -0.025771915912628174, + -0.04863196238875389, + 0.008239260874688625, + -0.06856123358011246, + -0.03305158391594887, + -0.032162897288799286, + 0.03318393975496292, + -0.0441318042576313, + -0.02000490576028824, + 0.03225743770599365, + 0.03131202608346939, + 0.048896677792072296, + -0.03499913215637207, + 0.024297073483467102, + 0.000977909890934825, + 0.030101899057626724, + 0.015882911160588264, + 0.018000634387135506, + -0.006197171751409769, + -0.006892049219459295, + -0.00835270993411541, + 0.02195245400071144, + 0.039593830704689026, + -0.010238805785775185, + 0.00586627796292305, + 0.0156465582549572, + 0.005800099112093449, + -0.015230578370392323, + -0.031690191477537155, + 0.006849505938589573, + -0.028986314311623573, + 0.02253860794007778, + -0.01421898789703846, + -0.014795688912272453, + -0.019872548058629036, + 0.018331527709960938, + -0.01570328325033188, + -0.019116219133138657, + -0.011864913627505302, + 0.002848051954060793, + 0.00756329158321023, + 0.032919224351644516, + 0.06387199461460114, + -0.01949438452720642, + -0.013112856075167656, + 0.004374891519546509, + 0.022311709821224213, + 0.01765083149075508, + 0.02304913103580475, + -0.034564241766929626, + -0.00717094587162137, + -0.05332120507955551, + -0.05154383182525635, + -0.003493295283988118, + 0.022444067522883415, + 0.037589557468891144, + -0.0087970532476902, + -0.06220807135105133, + 0.004157446790486574, + 0.009151582606136799, + 0.06288877129554749, + -0.030820412561297417, + 0.011902729980647564, + 0.003717830404639244, + -0.056157439947128296, + 0.024883229285478592, + 0.0030016812961548567, + 0.02505340240895748, + -0.026717327535152435, + 0.025185760110616684, + -0.01331139262765646, + 0.005445569753646851, + 0.02475087158381939, + 0.024202533066272736, + 0.036833230406045914, + -0.002345802029594779, + 0.023427294567227364, + -0.011184217408299446, + -0.01375573594123125, + 0.02312476374208927, + -0.029515745118260384, + -0.05910712108016014, + -0.017631923779845238, + 0.01743338629603386, + -0.024486156180500984, + -0.0026613331865519285, + 0.01509822066873312, + -0.011042405851185322, + 0.03392136096954346, + -0.036247074604034424, + -0.04787563532590866, + 0.030064083635807037, + -0.022670965641736984, + 0.005308485124260187, + 0.014786235056817532, + -0.027284573763608932, + 0.009671558625996113, + -0.0360390841960907, + 0.02153647318482399, + -0.05188417807221413, + -0.008995589800179005, + 0.011051859706640244, + -0.0006470159278251231, + -0.020269621163606644, + 0.02229280211031437, + 0.011108584702014923, + -0.013736828230321407, + -0.009841732680797577, + 0.034148260951042175, + -0.0014807506231591105, + -0.0018388251774013042, + 0.013500475324690342, + -0.026849685236811638, + -0.060014717280864716, + -0.008404707536101341, + 0.011212579905986786, + 0.02047761157155037, + -0.0016426523216068745, + 0.0483294315636158, + 0.022444067522883415, + 0.036719780415296555, + -0.03861060366034508, + 0.037362661212682724, + -0.006286986172199249, + -0.02773837186396122, + 0.033448655158281326, + 0.019985998049378395, + -0.03745720162987709, + -0.005204489920288324, + 0.016487974673509598, + -0.019314754754304886, + -0.0555901937186718, + -0.008636333048343658 + ], + "key": "Persistence Demonstration", + "status": "activated" + } + }, + { + "id": "6c0c977f-2e75-4e3a-a661-88674da5b14e", + "memory": "On January 13, 2026, at 8:51 PM, the user created a test memory for a demonstration purpose.", + "metadata": { + "sources": [ + "\"{\\\"type\\\": \\\"chat\\\", \\\"role\\\": \\\"user\\\", \\\"chat_time\\\": \\\"08:51 PM on 13 January, 2026\\\", \\\"content\\\": \\\"This is a test memory for dump example\\\", \\\"lang\\\": \\\"en\\\"}\"", + "\"{\\\"type\\\": \\\"chat\\\", \\\"role\\\": \\\"user\\\", \\\"chat_time\\\": \\\"08:51 PM on 13 January, 2026\\\", \\\"content\\\": \\\"Another memory to demonstrate persistence\\\", \\\"lang\\\": \\\"en\\\"}\"" + ], + "confidence": 0.99, + "usage": [], + "created_at": "2026-01-13T20:51:42.359643000+00:00", + "session_id": "default_session", + "memory_type": "UserMemory", + "type": "fact", + "tags": [ + "test", + "memory", + "demonstration" + ], + "updated_at": "2026-01-13T20:51:42.396236000+00:00", + "user_id": "example_user", + "background": "On January 13, 2026, at 8:51 PM, the user engaged in a memory demonstration by creating a test memory example and another memory to illustrate the concept of persistence. These actions reflect the user's interest in exploring and demonstrating memory-related concepts.", + "file_ids": [], + "embedding": [ + -0.023225771263241768, + 0.009711744263768196, + 0.01401975005865097, + -0.023113388568162918, + -0.044953107833862305, + -0.025454696267843246, + 0.004780950024724007, + 0.012184164486825466, + 0.003397237276658416, + 0.006766378879547119, + 0.033059265464544296, + -0.0018625102238729596, + -0.00135678774677217, + -0.0159396231174469, + -0.0017864176770672202, + 0.03302180394530296, + 0.05941302329301834, + -0.013467201963067055, + -0.011341294273734093, + -0.03324656933546066, + 0.01599581353366375, + -0.05263259634375572, + 0.07222465425729752, + 0.022851161658763885, + -0.007220592815428972, + 0.0017969536129385233, + -0.012418295256793499, + 0.013214340433478355, + 0.08645980805158615, + 0.0018215373856946826, + 0.02071589045226574, + -0.028620144352316856, + -0.015490091405808926, + -0.025454696267843246, + -0.04469088092446327, + -0.02105303853750229, + 0.027945848181843758, + 3.424162423470989e-05, + -0.028526492416858673, + -0.019479678943753242, + -0.008882921189069748, + 0.012596234679222107, + 0.015480726025998592, + 0.006949000991880894, + 0.015499456785619259, + 0.014825159683823586, + -0.012549408711493015, + -0.02382514625787735, + -0.025342313572764397, + -0.013364183716475964, + 0.002884491113945842, + 0.03133606165647507, + 0.04525279253721237, + -0.037179965525865555, + 0.027009325101971626, + 0.021689873188734055, + -0.05034748092293739, + -0.043342288583517075, + -0.019816827028989792, + 0.007492184638977051, + -0.03575645014643669, + 0.007862110622227192, + 0.0021774161141365767, + 0.01226845197379589, + -0.013504662550985813, + 0.03937143087387085, + 0.0068834442645311356, + 0.0019292375072836876, + -0.00272059952840209, + -0.023169580847024918, + 0.0013368866639211774, + 0.04581470787525177, + -0.05514247715473175, + -0.01210924331098795, + -0.0809905156493187, + 0.01955460198223591, + 0.0017419328214600682, + -0.015677396208047867, + -0.009426104836165905, + 0.021408917382359505, + 0.03892189636826515, + -0.022476553916931152, + 0.01390736736357212, + -0.0002572511730249971, + 0.047350604087114334, + 0.01260560005903244, + -0.06349626183509827, + 0.057502515614032745, + 0.040345411747694016, + -0.04274291172623634, + 0.028788719326257706, + 0.0003658293280750513, + 0.010807476006448269, + -0.02504262700676918, + 0.004296299535781145, + 0.010404771193861961, + -0.05158368870615959, + 0.003305926453322172, + 0.029069675132632256, + 0.011032241396605968, + 0.05813935026526451, + 0.022532744333148003, + 0.02037874236702919, + -0.017878225073218346, + -0.0010945613030344248, + -0.028788719326257706, + 0.02927570976316929, + 0.014375628903508186, + -0.009627456776797771, + 0.0005191849777474999, + 0.001597942435182631, + 0.04281783476471901, + 0.04918619245290756, + 0.01210924331098795, + 0.04203115403652191, + 0.013766888529062271, + 0.013485931791365147, + -0.01013317983597517, + -0.05083446949720383, + -0.014778333716094494, + 0.017484884709119797, + 0.014703411608934402, + 0.038341253995895386, + -0.03693646937608719, + -0.06076161563396454, + -0.014787699095904827, + -0.01294274814426899, + -0.023019736632704735, + -0.0010770015651360154, + -0.004511700011789799, + 0.016042640432715416, + -0.000730487983673811, + 0.00883141253143549, + -0.008058780804276466, + -0.026971863582730293, + -0.021614952012896538, + 0.011247641406953335, + 0.05281990021467209, + -0.010498423129320145, + -0.03399578854441643, + 0.020341280847787857, + -0.003252076217904687, + -0.008681568317115307, + -0.026859480887651443, + 0.015930257737636566, + -0.02498643472790718, + 0.005469294730573893, + -0.003645415883511305, + 0.02721535973250866, + 0.001160117913968861, + -0.01229654811322689, + 0.019891750067472458, + -0.02288862317800522, + -0.04469088092446327, + -0.022851161658763885, + -0.003551763715222478, + 0.01916126161813736, + 0.06192290410399437, + -0.01468468178063631, + 0.012624330818653107, + -0.0015429217601194978, + -0.048511892557144165, + -0.06076161563396454, + 0.0465264655649662, + 0.02032255008816719, + 0.02860141359269619, + 0.013457836583256721, + 0.025248661637306213, + -0.0460769347846508, + 0.03639328479766846, + 0.002751036547124386, + -0.008306959643959999, + -0.008747125044465065, + -0.008157115429639816, + -0.008611329831182957, + 0.033845942467451096, + 0.038734592497348785, + -0.000227984826778993, + -0.01032984908670187, + -0.0321040116250515, + -0.05158368870615959, + 0.0031490586698055267, + 0.030287155881524086, + 0.013794984668493271, + -0.04135685786604881, + -0.003430015640333295, + -0.012390200048685074, + 0.004427412524819374, + 0.015049925073981285, + 0.01107906736433506, + 0.008161798119544983, + -0.03180432319641113, + -0.000778484798502177, + 0.00315842404961586, + -0.005722155794501305, + -0.027908386662602425, + -0.0014211736852303147, + 0.0008768197149038315, + -0.02448071353137493, + 0.005408420693129301, + -0.011060337536036968, + 0.035737719386816025, + 0.015668030828237534, + 0.02127780392765999, + -0.01746615581214428, + -0.013823079876601696, + -0.01416022889316082, + 0.0026854798197746277, + 0.0031677891965955496, + -0.0812152773141861, + -0.024836590513586998, + 0.0003201738290954381, + -0.016014544293284416, + -0.011032241396605968, + 0.02238290011882782, + -0.013261166401207447, + -0.0022523379884660244, + -0.005698742810636759, + 0.012764809653162956, + -0.015499456785619259, + -0.05371896177530289, + 0.04941095784306526, + -0.017447425052523613, + 0.030343346297740936, + 0.030811607837677002, + -0.01826220005750656, + 0.008536407724022865, + 0.05016017332673073, + 0.02848903089761734, + -0.0326659232378006, + 0.026110263541340828, + 0.018721096217632294, + 0.012015590444207191, + -0.007585836574435234, + 0.03513834625482559, + -0.020847003906965256, + -0.04154416173696518, + 0.0050150807946920395, + 0.02605407126247883, + 0.0016857414739206433, + -0.01627677120268345, + 0.004181575495749712, + 0.01961079239845276, + 0.018365217372775078, + -0.04154416173696518, + -0.026241375133395195, + 0.0030554065015167, + 0.01035794522613287, + 0.02227051742374897, + 0.01488135103136301, + 0.01074191927909851, + 0.007899572141468525, + -0.05918825790286064, + -0.001568676088936627, + 0.01715710200369358, + 0.009051495231688023, + 0.029032215476036072, + -0.006073351949453354, + 0.03877205401659012, + -0.0013439105823636055, + 0.04064510017633438, + -0.03774188086390495, + 0.025810575112700462, + 0.03341514244675636, + 0.022944815456867218, + -0.019854288548231125, + -0.019535871222615242, + -0.013411009684205055, + 0.014591028913855553, + -0.008742442354559898, + 0.02993127703666687, + -0.05525486171245575, + -0.02365657314658165, + 0.03487611934542656, + -0.015705492347478867, + 0.008349102921783924, + -0.02970651164650917, + 5.427992618933786e-06, + -0.020584776997566223, + 0.038846977055072784, + 0.016632650047540665, + -0.026409950107336044, + 0.031298600137233734, + -0.0122216260060668, + 0.0071503533981740475, + -0.017335042357444763, + -0.027796003967523575, + -0.027140438556671143, + 0.03952127322554588, + -0.019704444333910942, + -0.019460948184132576, + 0.01024556253105402, + 0.06357118487358093, + -0.04360451176762581, + -0.018206007778644562, + -0.021952100098133087, + 0.00883141253143549, + -0.15463869273662567, + -0.008232037536799908, + -0.013879271224141121, + -0.0018063188763335347, + -0.014413089491426945, + 0.016632650047540665, + -0.04682615399360657, + -0.0486617386341095, + -0.010479693301022053, + 0.08968144655227661, + -0.005267942324280739, + -0.04244322329759598, + 0.017306946218013763, + 0.026353757828474045, + -0.025866767391562462, + -0.005651916842907667, + -0.03865967318415642, + -0.027908386662602425, + -0.024312138557434082, + -0.011931303888559341, + 0.010030161589384079, + -0.02148383855819702, + 0.05424341559410095, + -0.01921745389699936, + -0.002258191118016839, + -0.00631684809923172, + 0.04941095784306526, + 0.009739839471876621, + -0.020734621211886406, + 0.002176245441660285, + -0.014169593341648579, + 0.04128193482756615, + -0.006579074542969465, + -0.005895412527024746, + -0.008999986574053764, + 0.05971270799636841, + -0.0005150876822881401, + 0.007473453879356384, + 0.011453676968812943, + -0.020416202023625374, + 0.015396438539028168, + 0.066230908036232, + -0.03858475014567375, + 0.045964550226926804, + 0.03455770015716553, + 0.0163891538977623, + -0.004703687038272619, + -0.012184164486825466, + -0.0476502925157547, + -0.011369389481842518, + -0.007332975510507822, + -0.020022863522171974, + -0.015096751973032951, + -0.036505669355392456, + -0.020528584718704224, + -0.013401645235717297, + -0.054955173283815384, + 0.017035353928804398, + -0.08526106178760529, + 0.021614952012896538, + -0.0310363732278347, + -0.05192083865404129, + -0.010760650038719177, + 0.040345411747694016, + -0.02970651164650917, + 0.00763734569773078, + 0.04030795395374298, + -0.06394579261541367, + -0.0025051990523934364, + -0.03637455403804779, + 0.04847443476319313, + -0.018449503928422928, + 0.012736713513731956, + 0.001112121157348156, + 0.021352725103497505, + 0.06166067719459534, + 0.002046302892267704, + -0.03247861936688423, + 0.011013510636985302, + -0.08885730803012848, + -0.027796003967523575, + 0.053681500256061554, + -0.015452630817890167, + -0.03388340398669243, + -0.01715710200369358, + 0.00902808178216219, + -0.01121954619884491, + 0.008096241392195225, + 0.04113209247589111, + 0.20933163166046143, + -0.0004925525863654912, + -0.0620727464556694, + -0.013055131770670414, + 0.03787299245595932, + -0.010076988488435745, + -0.053606580942869186, + 0.01327053178101778, + -0.04233084246516228, + -0.04536517709493637, + 0.020285088568925858, + -0.0007509744027629495, + 0.01352339331060648, + 0.010208101011812687, + 0.0115192336961627, + -0.0243870597332716, + -0.01263369619846344, + -0.007501549553126097, + 0.08908206969499588, + 0.016585823148489, + 0.035793911665678024, + -0.014338168315589428, + -0.001372006256133318, + -0.001101585221476853, + -0.04525279253721237, + -0.02648487128317356, + -0.00762329762801528, + 0.07971683889627457, + -0.012708617374300957, + 0.056565992534160614, + -0.018917765468358994, + 0.011697173118591309, + 0.007997906766831875, + 0.004799680784344673, + 0.023469267413020134, + 0.009664918296039104, + 0.007894889451563358, + -0.04281783476471901, + -0.017569173127412796, + 0.02921951934695244, + 0.040794942528009415, + -0.023787684738636017, + 0.013841810636222363, + 0.04124447703361511, + -0.002535636071115732, + 0.01271798275411129, + 0.011978129856288433, + -0.02232670970261097, + -0.04135685786604881, + -0.002619923325255513, + -0.03480119630694389, + 0.016838684678077698, + 0.0310363732278347, + -0.016005178913474083, + 0.013682601973414421, + -0.006705504842102528, + -0.011097798123955727, + -0.02687821164727211, + 0.002102494239807129, + 0.03644947707653046, + 0.03888443857431412, + 0.0315420962870121, + -0.028751257807016373, + 0.051995761692523956, + -0.014937542378902435, + 0.0018285613041371107, + 0.0020779105834662914, + -0.05240783095359802, + 0.03425801172852516, + 0.026953132823109627, + 0.06267212331295013, + 0.010020796209573746, + 0.03259100392460823, + 0.0234318058937788, + 0.008007272146642208, + 0.012689887546002865, + 0.03985841944813728, + 0.05488025024533272, + 0.021858448162674904, + 0.07214973866939545, + 0.0159115269780159, + -0.020453663542866707, + -0.04027049243450165, + 0.008372516371309757, + 0.005876682233065367, + -0.05701552331447601, + -0.024143563583493233, + 0.052445292472839355, + -0.024518173187971115, + -0.03463262319564819, + -0.0329468809068203, + 0.045739784836769104, + -0.025510888546705246, + -0.027833465486764908, + 0.048174746334552765, + 0.0156586654484272, + 0.04124447703361511, + -0.0003596833848860115, + -0.029743971303105354, + 0.0014972662320360541, + -0.05083446949720383, + -0.02843284048140049, + 0.013663871213793755, + -0.0015663348603993654, + -0.010320483706891537, + -0.03315291553735733, + -0.028414109721779823, + -0.003565811552107334, + 0.008011954836547375, + 0.012764809653162956, + -0.0057455687783658504, + 0.03433293476700783, + -0.07361071556806564, + -0.04446611553430557, + -0.0036758529022336006, + 0.003003897611051798, + -0.014619125053286552, + 0.009084274061024189, + -0.009491661563515663, + 0.047425527125597, + 0.009936509653925896, + 0.00795576348900795, + 0.010620171204209328, + 0.05540470406413078, + 0.009861587546765804, + -0.022364171221852303, + -0.0022628738079220057, + -0.012006225995719433, + 0.004530430305749178, + -0.01372006256133318, + 0.026615984737873077, + -0.036187250167131424, + 0.04094478860497475, + -0.03877205401659012, + 0.02732774242758751, + 0.014862621203064919, + 0.021858448162674904, + 0.01667010970413685, + -0.01502182986587286, + 0.033621177077293396, + 0.0031748132314532995, + -0.09402691572904587, + -0.000989787746220827, + 0.027346473187208176, + 0.025585809722542763, + 0.01667947508394718, + 0.024181025102734566, + -0.02427467703819275, + -0.01249321736395359, + 0.02448071353137493, + 0.03933396935462952, + 0.01710091158747673, + 0.02449944242835045, + -0.05960032716393471, + -0.03335895016789436, + -0.039071742445230484, + -0.04547755792737007, + 0.017475519329309464, + 0.03644947707653046, + -0.04236830398440361, + -0.006752331275492907, + 0.031841784715652466, + 0.03397705778479576, + 0.08226418495178223, + 0.0621851310133934, + -0.04214353859424591, + -0.011397485621273518, + 0.030006198212504387, + 0.0031162805389612913, + -0.023356884717941284, + 0.006532248109579086, + -0.005928190890699625, + -0.016407884657382965, + 0.021184151992201805, + 0.0018777287332341075, + -0.047425527125597, + -0.04903634637594223, + 0.026840750128030777, + -0.021502569317817688, + -0.01077001541852951, + -0.008461485616862774, + -0.02521120011806488, + -0.037685688585042953, + -0.011650347150862217, + 0.02054731547832489, + 0.021090500056743622, + 0.01893649622797966, + -0.028357917442917824, + 0.012689887546002865, + -0.001998306019231677, + -0.08511121571063995, + 0.06967731565237045, + 0.030399538576602936, + -0.015471360646188259, + 0.04203115403652191, + -0.043791819363832474, + 0.02854522317647934, + 0.010301753878593445, + 0.011388120241463184, + 0.022233057767152786, + -0.012661791406571865, + 0.0016037956811487675, + -0.019685715436935425, + -0.01944221928715706, + -0.019292375072836876, + -0.012905287556350231, + 0.009908413514494896, + 0.0161643885076046, + -0.0068834442645311356, + 0.02015397697687149, + -0.018589982762932777, + -0.019966671243309975, + 0.0020123538561165333, + 0.014328802935779095, + -0.050722088664770126, + -0.014890716411173344, + 0.07177512347698212, + 0.044503577053546906, + -0.011921938508749008, + 0.010320483706891537, + -0.014478646218776703, + 0.01338291447609663, + 0.010526519268751144, + -0.01812172122299671, + -0.02142764814198017, + 0.01088239811360836, + 0.00478329136967659, + -0.05225798487663269, + 0.02693440392613411, + 0.022682588547468185, + -0.005764299537986517, + -0.02238290011882782, + -0.024087373167276382, + -0.019311105832457542, + 0.05296974256634712, + -0.0651070848107338, + 0.020809542387723923, + 0.015780413523316383, + -0.024780400097370148, + -0.0027042103465646505, + -0.02914459817111492, + 0.014207054860889912, + 0.020079053938388824, + 0.04768775403499603, + 0.0315982885658741, + 0.03526945784687996, + 0.013439105823636055, + 0.012886556796729565, + 0.007670123595744371, + 0.023974990472197533, + 0.017597267404198647, + 0.007866793312132359, + -0.048174746334552765, + -0.0489988848567009, + 0.040457796305418015, + 0.08016636967658997, + 0.013682601973414421, + -0.018046800047159195, + -0.06683028489351273, + -0.034351665526628494, + -0.006799157243221998, + 0.0028048865497112274, + -0.020341280847787857, + 0.01605200581252575, + -0.04637662321329117, + -0.06993953883647919, + 0.017569173127412796, + -0.06008731946349144, + -0.006916222628206015, + -0.03309672325849533, + -0.027758542448282242, + 0.004675591364502907, + -0.00883141253143549, + -0.03899681940674782, + 0.07012684643268585, + -0.0009002327569760382, + -0.02620391547679901, + -0.025023896247148514, + 0.06802903115749359, + 0.030193503946065903, + -0.00706606637686491, + 0.052332907915115356, + 0.02976270206272602, + 0.03502596169710159, + -0.012886556796729565, + -3.263197504566051e-05, + 0.019179992377758026, + -0.02637248858809471, + 0.017278850078582764, + -0.06031208485364914, + -0.012249721214175224, + 0.00553953368216753, + -0.029182057827711105, + 0.040907327085733414, + -0.010788745246827602, + 0.01755044236779213, + -0.042293380945920944, + 0.02043493278324604, + -0.0234318058937788, + 0.02427467703819275, + -0.030455728992819786, + 0.011584790423512459, + -0.045515019446611404, + -0.015181038528680801, + 0.0005320621421560645, + 0.00795576348900795, + -0.01710091158747673, + 0.017082180827856064, + 0.029687780886888504, + 0.003418309148401022, + 0.020734621211886406, + -0.07994160801172256, + 0.007215910125523806, + 0.022457823157310486, + -0.0006052280077710748, + -0.015817875042557716, + 0.02682201936841011, + -0.058176811784505844, + 0.05413103103637695, + -0.004389951936900616, + 0.03639328479766846, + 0.011172720231115818, + -0.0489988848567009, + -0.005675329826772213, + -0.031111296266317368, + -0.0019268961623311043, + -0.0032825132366269827, + -0.017981242388486862, + 0.036955200135707855, + -0.03377101942896843, + -0.030418269336223602, + 0.003273148089647293, + -0.02464928664267063, + -0.0011630445951595902, + 0.04394166171550751, + 0.020416202023625374, + 0.021034307777881622, + 0.0008352614822797477, + 0.05083446949720383, + -0.03319037705659866, + -0.009290308691561222, + -0.02464928664267063, + 0.04083240404725075, + -0.049785565584897995, + -0.031298600137233734, + 0.02560454048216343, + -0.01760663278400898, + 0.014263246208429337, + -0.01757853850722313, + -0.00598438223823905, + -0.005591042805463076, + 0.02594168856739998, + -0.012867826968431473, + -0.0477626770734787, + 0.033902134746313095, + -0.025061357766389847, + -0.05274497717618942, + 0.031523365527391434, + 0.03970857709646225, + 0.01596771739423275, + 0.013888636603951454, + 0.03877205401659012, + -0.009739839471876621, + -0.009786665439605713, + -0.04761283099651337, + -0.008143068291246891, + 0.032684653997421265, + 0.03822886943817139, + 0.009163877926766872, + -0.028170613572001457, + 0.005843903869390488, + 0.020753350108861923, + -0.007281466852873564, + -0.014216420240700245, + -0.014057210646569729, + -0.006424548104405403, + -0.011172720231115818, + -0.03332148864865303, + 0.03974603861570358, + 0.013757524080574512, + -0.015012464486062527, + 0.0028165930416435003, + 0.01327053178101778, + -0.019910480827093124, + 0.006625900510698557, + -0.022626396268606186, + -0.011912573128938675, + -0.02537977509200573, + -0.024574365466833115, + 0.007300197146832943, + -0.023169580847024918, + -0.047425527125597, + 0.0003184178494848311, + 0.02537977509200573, + -0.16213087737560272, + 0.02176479622721672, + 0.0014211736852303147, + 0.0010805134661495686, + -0.021952100098133087, + -0.02803950011730194, + -0.036280903965234756, + -0.023281963542103767, + 0.028245534747838974, + -0.02571692317724228, + 0.011734633706510067, + -0.03586883470416069, + 0.035793911665678024, + -0.030736686661839485, + -0.02288862317800522, + 0.02682201936841011, + 0.012006225995719433, + 0.04476580023765564, + -0.06004985794425011, + 0.09335261583328247, + -0.005075954832136631, + -0.030418269336223602, + -0.004537454340606928, + 0.005057224538177252, + -0.048624277114868164, + -0.0246118251234293, + 0.031017644330859184, + 0.02798330970108509, + -0.03510088473558426, + 0.03560660779476166, + -0.02120288275182247, + 0.031298600137233734, + 0.02449944242835045, + 0.05858888104557991, + 0.03335895016789436, + -0.01662328466773033, + 0.011725268326699734, + -0.04349213093519211, + -0.015340247191488743, + -0.00708011444658041, + -0.05031001940369606, + 0.01857125200331211, + -0.009627456776797771, + -0.015265326015651226, + 0.03616851940751076, + 0.06383340805768967, + -0.027833465486764908, + 0.009430787526071072, + -0.037685688585042953, + 0.02260766737163067, + -0.012202895246446133, + 0.021614952012896538, + -0.009009351953864098, + -0.009674282744526863, + -0.02116542123258114, + -0.017953146249055862, + -0.01185638178139925, + -0.013869906775653362, + -0.011453676968812943, + 0.016951067373156548, + -0.01976063661277294, + -0.012540043331682682, + -0.0244432520121336, + -0.042068615555763245, + -0.018955226987600327, + 0.011697173118591309, + -0.06926524639129639, + 0.0025239295791834593, + -0.015920892357826233, + 0.009945875033736229, + -0.035119615495204926, + 0.027009325101971626, + 0.02015397697687149, + -0.009777300991117954, + -0.015977082774043083, + 0.05308212712407112, + 0.06327150017023087, + 0.021558761596679688, + 0.017091546207666397, + -0.01766282506287098, + -0.013336088508367538, + 0.005932873580604792, + -0.0006385916494764388, + -0.015649300068616867, + 0.015049925073981285, + 0.03538184240460396, + -0.005164924543350935, + 0.003172471886500716, + -0.03903428092598915, + -0.01271798275411129, + -0.09005605429410934, + -0.008620694279670715, + 0.045664865523576736, + 0.003343387274071574, + -0.0031935435254126787, + 0.08196450024843216, + -0.023019736632704735, + -0.03611232712864876, + -0.037123773247003555, + -0.014216420240700245, + -0.009983335621654987, + 0.02026635967195034, + 0.00901871733367443, + 0.027964578941464424, + 0.009561900049448013, + 0.0246118251234293, + -0.01416022889316082, + -0.039558734744787216, + 0.006003112997859716, + 0.024087373167276382, + -0.036131057888269424, + -0.04008318483829498, + -0.04064510017633438, + -0.01315814908593893, + -0.08001653105020523, + -0.01819664239883423, + -0.020228898152709007, + 0.014759602956473827, + -0.05536724254488945, + -0.021577490493655205, + 0.035962484776973724, + 0.008822047151625156, + 0.01771901547908783, + -0.027908386662602425, + 0.019854288548231125, + 0.01024556253105402, + 0.029800163581967354, + 0.002376427175477147, + -0.007960446178913116, + 0.005197702907025814, + -0.019236182793974876, + 0.000641518272459507, + 0.04941095784306526, + 0.059113334864377975, + -0.0018589982064440846, + -0.006073351949453354, + -0.012024955824017525, + 0.013420375064015388, + -0.05192083865404129, + -0.03547549247741699, + -0.011425580829381943, + -0.008737759664654732, + 0.024836590513586998, + -0.014075941406190395, + -0.008587916381657124, + 0.013195609673857689, + 0.032628461718559265, + 0.003600931027904153, + -0.021633682772517204, + -0.0024490077048540115, + 0.018814748153090477, + -0.010835572145879269, + 0.036730434745550156, + 0.056116461753845215, + -0.047238223254680634, + 0.013729427941143513, + -0.006794474553316832, + 0.02987508475780487, + 0.008246085606515408, + 0.032347507774829865, + -0.04191877320408821, + 0.03465135395526886, + -0.061061304062604904, + -0.030792877078056335, + 0.013111323118209839, + 0.03854728862643242, + 0.03127986937761307, + 0.006546296179294586, + -0.062447357922792435, + 0.021970830857753754, + 0.021408917382359505, + 0.04547755792737007, + -0.034070707857608795, + -0.003069454338401556, + 0.006246608681976795, + -0.03761076554656029, + 0.017119640484452248, + 0.03736726939678192, + 0.018608713522553444, + -0.030774148181080818, + 0.021408917382359505, + -0.015321517363190651, + 0.019704444333910942, + 0.009730474092066288, + 0.02082827314734459, + 0.017110276967287064, + -0.012146703898906708, + 0.018589982762932777, + -0.006349626462906599, + 0.01249321736395359, + 0.025248661637306213, + -0.02309465780854225, + -0.053681500256061554, + -0.03335895016789436, + 0.04158162325620651, + -0.02916332706809044, + -0.02815188281238079, + 0.026110263541340828, + -0.014825159683823586, + 0.06844110786914825, + -0.04536517709493637, + -0.03854728862643242, + 0.013261166401207447, + -0.049785565584897995, + 0.008058780804276466, + 0.020453663542866707, + -0.010535884648561478, + 0.019517140462994576, + -0.04693853482604027, + 0.016342326998710632, + -0.020640967413783073, + -0.01554628275334835, + 0.017896955832839012, + 0.012184164486825466, + -0.02148383855819702, + 0.01065763272345066, + 0.0030835021752864122, + 0.019348565489053726, + -0.02071589045226574, + 0.05364403873682022, + -0.017054084688425064, + -0.004036414436995983, + 0.026335028931498528, + -0.03764822706580162, + -0.0230384673923254, + 0.00017208610370289534, + -0.0007825820939615369, + 0.0464140810072422, + 0.02110922895371914, + 0.048849042505025864, + 0.021633682772517204, + 0.024349600076675415, + -0.02910713665187359, + 0.022982275113463402, + -0.01966698467731476, + -0.011921938508749008, + 0.027065515518188477, + 0.017232025042176247, + -0.03560660779476166, + -0.01119145005941391, + 0.0029125867877155542, + -0.019123800098896027, + -0.04903634637594223, + -0.02921951934695244 + ], + "key": "Test Memory Example", + "status": "activated" + } + }, + { + "id": "3178a22f-4edb-46e1-89fd-a08009b131a1", + "memory": "On January 13, 2026, at 8:51 PM, the user created a test memory for a demonstration purpose.", + "metadata": { + "sources": [ + "\"{\\\"type\\\": \\\"chat\\\", \\\"role\\\": \\\"user\\\", \\\"chat_time\\\": \\\"08:51 PM on 13 January, 2026\\\", \\\"content\\\": \\\"This is a test memory for dump example\\\", \\\"lang\\\": \\\"en\\\"}\"", + "\"{\\\"type\\\": \\\"chat\\\", \\\"role\\\": \\\"user\\\", \\\"chat_time\\\": \\\"08:51 PM on 13 January, 2026\\\", \\\"content\\\": \\\"Another memory to demonstrate persistence\\\", \\\"lang\\\": \\\"en\\\"}\"" + ], + "confidence": 0.99, + "usage": [], + "created_at": "2026-01-13T20:51:42.359643000+00:00", + "session_id": "default_session", + "memory_type": "WorkingMemory", + "type": "fact", + "tags": [ + "test", + "memory", + "demonstration" + ], + "updated_at": "2026-01-13T20:51:42.396195000+00:00", + "user_id": "example_user", + "background": "On January 13, 2026, at 8:51 PM, the user engaged in a memory demonstration by creating a test memory example and another memory to illustrate the concept of persistence. These actions reflect the user's interest in exploring and demonstrating memory-related concepts.", + "file_ids": [], + "embedding": [ + -0.023225771263241768, + 0.009711744263768196, + 0.01401975005865097, + -0.023113388568162918, + -0.044953107833862305, + -0.025454696267843246, + 0.004780950024724007, + 0.012184164486825466, + 0.003397237276658416, + 0.006766378879547119, + 0.033059265464544296, + -0.0018625102238729596, + -0.00135678774677217, + -0.0159396231174469, + -0.0017864176770672202, + 0.03302180394530296, + 0.05941302329301834, + -0.013467201963067055, + -0.011341294273734093, + -0.03324656933546066, + 0.01599581353366375, + -0.05263259634375572, + 0.07222465425729752, + 0.022851161658763885, + -0.007220592815428972, + 0.0017969536129385233, + -0.012418295256793499, + 0.013214340433478355, + 0.08645980805158615, + 0.0018215373856946826, + 0.02071589045226574, + -0.028620144352316856, + -0.015490091405808926, + -0.025454696267843246, + -0.04469088092446327, + -0.02105303853750229, + 0.027945848181843758, + 3.424162423470989e-05, + -0.028526492416858673, + -0.019479678943753242, + -0.008882921189069748, + 0.012596234679222107, + 0.015480726025998592, + 0.006949000991880894, + 0.015499456785619259, + 0.014825159683823586, + -0.012549408711493015, + -0.02382514625787735, + -0.025342313572764397, + -0.013364183716475964, + 0.002884491113945842, + 0.03133606165647507, + 0.04525279253721237, + -0.037179965525865555, + 0.027009325101971626, + 0.021689873188734055, + -0.05034748092293739, + -0.043342288583517075, + -0.019816827028989792, + 0.007492184638977051, + -0.03575645014643669, + 0.007862110622227192, + 0.0021774161141365767, + 0.01226845197379589, + -0.013504662550985813, + 0.03937143087387085, + 0.0068834442645311356, + 0.0019292375072836876, + -0.00272059952840209, + -0.023169580847024918, + 0.0013368866639211774, + 0.04581470787525177, + -0.05514247715473175, + -0.01210924331098795, + -0.0809905156493187, + 0.01955460198223591, + 0.0017419328214600682, + -0.015677396208047867, + -0.009426104836165905, + 0.021408917382359505, + 0.03892189636826515, + -0.022476553916931152, + 0.01390736736357212, + -0.0002572511730249971, + 0.047350604087114334, + 0.01260560005903244, + -0.06349626183509827, + 0.057502515614032745, + 0.040345411747694016, + -0.04274291172623634, + 0.028788719326257706, + 0.0003658293280750513, + 0.010807476006448269, + -0.02504262700676918, + 0.004296299535781145, + 0.010404771193861961, + -0.05158368870615959, + 0.003305926453322172, + 0.029069675132632256, + 0.011032241396605968, + 0.05813935026526451, + 0.022532744333148003, + 0.02037874236702919, + -0.017878225073218346, + -0.0010945613030344248, + -0.028788719326257706, + 0.02927570976316929, + 0.014375628903508186, + -0.009627456776797771, + 0.0005191849777474999, + 0.001597942435182631, + 0.04281783476471901, + 0.04918619245290756, + 0.01210924331098795, + 0.04203115403652191, + 0.013766888529062271, + 0.013485931791365147, + -0.01013317983597517, + -0.05083446949720383, + -0.014778333716094494, + 0.017484884709119797, + 0.014703411608934402, + 0.038341253995895386, + -0.03693646937608719, + -0.06076161563396454, + -0.014787699095904827, + -0.01294274814426899, + -0.023019736632704735, + -0.0010770015651360154, + -0.004511700011789799, + 0.016042640432715416, + -0.000730487983673811, + 0.00883141253143549, + -0.008058780804276466, + -0.026971863582730293, + -0.021614952012896538, + 0.011247641406953335, + 0.05281990021467209, + -0.010498423129320145, + -0.03399578854441643, + 0.020341280847787857, + -0.003252076217904687, + -0.008681568317115307, + -0.026859480887651443, + 0.015930257737636566, + -0.02498643472790718, + 0.005469294730573893, + -0.003645415883511305, + 0.02721535973250866, + 0.001160117913968861, + -0.01229654811322689, + 0.019891750067472458, + -0.02288862317800522, + -0.04469088092446327, + -0.022851161658763885, + -0.003551763715222478, + 0.01916126161813736, + 0.06192290410399437, + -0.01468468178063631, + 0.012624330818653107, + -0.0015429217601194978, + -0.048511892557144165, + -0.06076161563396454, + 0.0465264655649662, + 0.02032255008816719, + 0.02860141359269619, + 0.013457836583256721, + 0.025248661637306213, + -0.0460769347846508, + 0.03639328479766846, + 0.002751036547124386, + -0.008306959643959999, + -0.008747125044465065, + -0.008157115429639816, + -0.008611329831182957, + 0.033845942467451096, + 0.038734592497348785, + -0.000227984826778993, + -0.01032984908670187, + -0.0321040116250515, + -0.05158368870615959, + 0.0031490586698055267, + 0.030287155881524086, + 0.013794984668493271, + -0.04135685786604881, + -0.003430015640333295, + -0.012390200048685074, + 0.004427412524819374, + 0.015049925073981285, + 0.01107906736433506, + 0.008161798119544983, + -0.03180432319641113, + -0.000778484798502177, + 0.00315842404961586, + -0.005722155794501305, + -0.027908386662602425, + -0.0014211736852303147, + 0.0008768197149038315, + -0.02448071353137493, + 0.005408420693129301, + -0.011060337536036968, + 0.035737719386816025, + 0.015668030828237534, + 0.02127780392765999, + -0.01746615581214428, + -0.013823079876601696, + -0.01416022889316082, + 0.0026854798197746277, + 0.0031677891965955496, + -0.0812152773141861, + -0.024836590513586998, + 0.0003201738290954381, + -0.016014544293284416, + -0.011032241396605968, + 0.02238290011882782, + -0.013261166401207447, + -0.0022523379884660244, + -0.005698742810636759, + 0.012764809653162956, + -0.015499456785619259, + -0.05371896177530289, + 0.04941095784306526, + -0.017447425052523613, + 0.030343346297740936, + 0.030811607837677002, + -0.01826220005750656, + 0.008536407724022865, + 0.05016017332673073, + 0.02848903089761734, + -0.0326659232378006, + 0.026110263541340828, + 0.018721096217632294, + 0.012015590444207191, + -0.007585836574435234, + 0.03513834625482559, + -0.020847003906965256, + -0.04154416173696518, + 0.0050150807946920395, + 0.02605407126247883, + 0.0016857414739206433, + -0.01627677120268345, + 0.004181575495749712, + 0.01961079239845276, + 0.018365217372775078, + -0.04154416173696518, + -0.026241375133395195, + 0.0030554065015167, + 0.01035794522613287, + 0.02227051742374897, + 0.01488135103136301, + 0.01074191927909851, + 0.007899572141468525, + -0.05918825790286064, + -0.001568676088936627, + 0.01715710200369358, + 0.009051495231688023, + 0.029032215476036072, + -0.006073351949453354, + 0.03877205401659012, + -0.0013439105823636055, + 0.04064510017633438, + -0.03774188086390495, + 0.025810575112700462, + 0.03341514244675636, + 0.022944815456867218, + -0.019854288548231125, + -0.019535871222615242, + -0.013411009684205055, + 0.014591028913855553, + -0.008742442354559898, + 0.02993127703666687, + -0.05525486171245575, + -0.02365657314658165, + 0.03487611934542656, + -0.015705492347478867, + 0.008349102921783924, + -0.02970651164650917, + 5.427992618933786e-06, + -0.020584776997566223, + 0.038846977055072784, + 0.016632650047540665, + -0.026409950107336044, + 0.031298600137233734, + -0.0122216260060668, + 0.0071503533981740475, + -0.017335042357444763, + -0.027796003967523575, + -0.027140438556671143, + 0.03952127322554588, + -0.019704444333910942, + -0.019460948184132576, + 0.01024556253105402, + 0.06357118487358093, + -0.04360451176762581, + -0.018206007778644562, + -0.021952100098133087, + 0.00883141253143549, + -0.15463869273662567, + -0.008232037536799908, + -0.013879271224141121, + -0.0018063188763335347, + -0.014413089491426945, + 0.016632650047540665, + -0.04682615399360657, + -0.0486617386341095, + -0.010479693301022053, + 0.08968144655227661, + -0.005267942324280739, + -0.04244322329759598, + 0.017306946218013763, + 0.026353757828474045, + -0.025866767391562462, + -0.005651916842907667, + -0.03865967318415642, + -0.027908386662602425, + -0.024312138557434082, + -0.011931303888559341, + 0.010030161589384079, + -0.02148383855819702, + 0.05424341559410095, + -0.01921745389699936, + -0.002258191118016839, + -0.00631684809923172, + 0.04941095784306526, + 0.009739839471876621, + -0.020734621211886406, + 0.002176245441660285, + -0.014169593341648579, + 0.04128193482756615, + -0.006579074542969465, + -0.005895412527024746, + -0.008999986574053764, + 0.05971270799636841, + -0.0005150876822881401, + 0.007473453879356384, + 0.011453676968812943, + -0.020416202023625374, + 0.015396438539028168, + 0.066230908036232, + -0.03858475014567375, + 0.045964550226926804, + 0.03455770015716553, + 0.0163891538977623, + -0.004703687038272619, + -0.012184164486825466, + -0.0476502925157547, + -0.011369389481842518, + -0.007332975510507822, + -0.020022863522171974, + -0.015096751973032951, + -0.036505669355392456, + -0.020528584718704224, + -0.013401645235717297, + -0.054955173283815384, + 0.017035353928804398, + -0.08526106178760529, + 0.021614952012896538, + -0.0310363732278347, + -0.05192083865404129, + -0.010760650038719177, + 0.040345411747694016, + -0.02970651164650917, + 0.00763734569773078, + 0.04030795395374298, + -0.06394579261541367, + -0.0025051990523934364, + -0.03637455403804779, + 0.04847443476319313, + -0.018449503928422928, + 0.012736713513731956, + 0.001112121157348156, + 0.021352725103497505, + 0.06166067719459534, + 0.002046302892267704, + -0.03247861936688423, + 0.011013510636985302, + -0.08885730803012848, + -0.027796003967523575, + 0.053681500256061554, + -0.015452630817890167, + -0.03388340398669243, + -0.01715710200369358, + 0.00902808178216219, + -0.01121954619884491, + 0.008096241392195225, + 0.04113209247589111, + 0.20933163166046143, + -0.0004925525863654912, + -0.0620727464556694, + -0.013055131770670414, + 0.03787299245595932, + -0.010076988488435745, + -0.053606580942869186, + 0.01327053178101778, + -0.04233084246516228, + -0.04536517709493637, + 0.020285088568925858, + -0.0007509744027629495, + 0.01352339331060648, + 0.010208101011812687, + 0.0115192336961627, + -0.0243870597332716, + -0.01263369619846344, + -0.007501549553126097, + 0.08908206969499588, + 0.016585823148489, + 0.035793911665678024, + -0.014338168315589428, + -0.001372006256133318, + -0.001101585221476853, + -0.04525279253721237, + -0.02648487128317356, + -0.00762329762801528, + 0.07971683889627457, + -0.012708617374300957, + 0.056565992534160614, + -0.018917765468358994, + 0.011697173118591309, + 0.007997906766831875, + 0.004799680784344673, + 0.023469267413020134, + 0.009664918296039104, + 0.007894889451563358, + -0.04281783476471901, + -0.017569173127412796, + 0.02921951934695244, + 0.040794942528009415, + -0.023787684738636017, + 0.013841810636222363, + 0.04124447703361511, + -0.002535636071115732, + 0.01271798275411129, + 0.011978129856288433, + -0.02232670970261097, + -0.04135685786604881, + -0.002619923325255513, + -0.03480119630694389, + 0.016838684678077698, + 0.0310363732278347, + -0.016005178913474083, + 0.013682601973414421, + -0.006705504842102528, + -0.011097798123955727, + -0.02687821164727211, + 0.002102494239807129, + 0.03644947707653046, + 0.03888443857431412, + 0.0315420962870121, + -0.028751257807016373, + 0.051995761692523956, + -0.014937542378902435, + 0.0018285613041371107, + 0.0020779105834662914, + -0.05240783095359802, + 0.03425801172852516, + 0.026953132823109627, + 0.06267212331295013, + 0.010020796209573746, + 0.03259100392460823, + 0.0234318058937788, + 0.008007272146642208, + 0.012689887546002865, + 0.03985841944813728, + 0.05488025024533272, + 0.021858448162674904, + 0.07214973866939545, + 0.0159115269780159, + -0.020453663542866707, + -0.04027049243450165, + 0.008372516371309757, + 0.005876682233065367, + -0.05701552331447601, + -0.024143563583493233, + 0.052445292472839355, + -0.024518173187971115, + -0.03463262319564819, + -0.0329468809068203, + 0.045739784836769104, + -0.025510888546705246, + -0.027833465486764908, + 0.048174746334552765, + 0.0156586654484272, + 0.04124447703361511, + -0.0003596833848860115, + -0.029743971303105354, + 0.0014972662320360541, + -0.05083446949720383, + -0.02843284048140049, + 0.013663871213793755, + -0.0015663348603993654, + -0.010320483706891537, + -0.03315291553735733, + -0.028414109721779823, + -0.003565811552107334, + 0.008011954836547375, + 0.012764809653162956, + -0.0057455687783658504, + 0.03433293476700783, + -0.07361071556806564, + -0.04446611553430557, + -0.0036758529022336006, + 0.003003897611051798, + -0.014619125053286552, + 0.009084274061024189, + -0.009491661563515663, + 0.047425527125597, + 0.009936509653925896, + 0.00795576348900795, + 0.010620171204209328, + 0.05540470406413078, + 0.009861587546765804, + -0.022364171221852303, + -0.0022628738079220057, + -0.012006225995719433, + 0.004530430305749178, + -0.01372006256133318, + 0.026615984737873077, + -0.036187250167131424, + 0.04094478860497475, + -0.03877205401659012, + 0.02732774242758751, + 0.014862621203064919, + 0.021858448162674904, + 0.01667010970413685, + -0.01502182986587286, + 0.033621177077293396, + 0.0031748132314532995, + -0.09402691572904587, + -0.000989787746220827, + 0.027346473187208176, + 0.025585809722542763, + 0.01667947508394718, + 0.024181025102734566, + -0.02427467703819275, + -0.01249321736395359, + 0.02448071353137493, + 0.03933396935462952, + 0.01710091158747673, + 0.02449944242835045, + -0.05960032716393471, + -0.03335895016789436, + -0.039071742445230484, + -0.04547755792737007, + 0.017475519329309464, + 0.03644947707653046, + -0.04236830398440361, + -0.006752331275492907, + 0.031841784715652466, + 0.03397705778479576, + 0.08226418495178223, + 0.0621851310133934, + -0.04214353859424591, + -0.011397485621273518, + 0.030006198212504387, + 0.0031162805389612913, + -0.023356884717941284, + 0.006532248109579086, + -0.005928190890699625, + -0.016407884657382965, + 0.021184151992201805, + 0.0018777287332341075, + -0.047425527125597, + -0.04903634637594223, + 0.026840750128030777, + -0.021502569317817688, + -0.01077001541852951, + -0.008461485616862774, + -0.02521120011806488, + -0.037685688585042953, + -0.011650347150862217, + 0.02054731547832489, + 0.021090500056743622, + 0.01893649622797966, + -0.028357917442917824, + 0.012689887546002865, + -0.001998306019231677, + -0.08511121571063995, + 0.06967731565237045, + 0.030399538576602936, + -0.015471360646188259, + 0.04203115403652191, + -0.043791819363832474, + 0.02854522317647934, + 0.010301753878593445, + 0.011388120241463184, + 0.022233057767152786, + -0.012661791406571865, + 0.0016037956811487675, + -0.019685715436935425, + -0.01944221928715706, + -0.019292375072836876, + -0.012905287556350231, + 0.009908413514494896, + 0.0161643885076046, + -0.0068834442645311356, + 0.02015397697687149, + -0.018589982762932777, + -0.019966671243309975, + 0.0020123538561165333, + 0.014328802935779095, + -0.050722088664770126, + -0.014890716411173344, + 0.07177512347698212, + 0.044503577053546906, + -0.011921938508749008, + 0.010320483706891537, + -0.014478646218776703, + 0.01338291447609663, + 0.010526519268751144, + -0.01812172122299671, + -0.02142764814198017, + 0.01088239811360836, + 0.00478329136967659, + -0.05225798487663269, + 0.02693440392613411, + 0.022682588547468185, + -0.005764299537986517, + -0.02238290011882782, + -0.024087373167276382, + -0.019311105832457542, + 0.05296974256634712, + -0.0651070848107338, + 0.020809542387723923, + 0.015780413523316383, + -0.024780400097370148, + -0.0027042103465646505, + -0.02914459817111492, + 0.014207054860889912, + 0.020079053938388824, + 0.04768775403499603, + 0.0315982885658741, + 0.03526945784687996, + 0.013439105823636055, + 0.012886556796729565, + 0.007670123595744371, + 0.023974990472197533, + 0.017597267404198647, + 0.007866793312132359, + -0.048174746334552765, + -0.0489988848567009, + 0.040457796305418015, + 0.08016636967658997, + 0.013682601973414421, + -0.018046800047159195, + -0.06683028489351273, + -0.034351665526628494, + -0.006799157243221998, + 0.0028048865497112274, + -0.020341280847787857, + 0.01605200581252575, + -0.04637662321329117, + -0.06993953883647919, + 0.017569173127412796, + -0.06008731946349144, + -0.006916222628206015, + -0.03309672325849533, + -0.027758542448282242, + 0.004675591364502907, + -0.00883141253143549, + -0.03899681940674782, + 0.07012684643268585, + -0.0009002327569760382, + -0.02620391547679901, + -0.025023896247148514, + 0.06802903115749359, + 0.030193503946065903, + -0.00706606637686491, + 0.052332907915115356, + 0.02976270206272602, + 0.03502596169710159, + -0.012886556796729565, + -3.263197504566051e-05, + 0.019179992377758026, + -0.02637248858809471, + 0.017278850078582764, + -0.06031208485364914, + -0.012249721214175224, + 0.00553953368216753, + -0.029182057827711105, + 0.040907327085733414, + -0.010788745246827602, + 0.01755044236779213, + -0.042293380945920944, + 0.02043493278324604, + -0.0234318058937788, + 0.02427467703819275, + -0.030455728992819786, + 0.011584790423512459, + -0.045515019446611404, + -0.015181038528680801, + 0.0005320621421560645, + 0.00795576348900795, + -0.01710091158747673, + 0.017082180827856064, + 0.029687780886888504, + 0.003418309148401022, + 0.020734621211886406, + -0.07994160801172256, + 0.007215910125523806, + 0.022457823157310486, + -0.0006052280077710748, + -0.015817875042557716, + 0.02682201936841011, + -0.058176811784505844, + 0.05413103103637695, + -0.004389951936900616, + 0.03639328479766846, + 0.011172720231115818, + -0.0489988848567009, + -0.005675329826772213, + -0.031111296266317368, + -0.0019268961623311043, + -0.0032825132366269827, + -0.017981242388486862, + 0.036955200135707855, + -0.03377101942896843, + -0.030418269336223602, + 0.003273148089647293, + -0.02464928664267063, + -0.0011630445951595902, + 0.04394166171550751, + 0.020416202023625374, + 0.021034307777881622, + 0.0008352614822797477, + 0.05083446949720383, + -0.03319037705659866, + -0.009290308691561222, + -0.02464928664267063, + 0.04083240404725075, + -0.049785565584897995, + -0.031298600137233734, + 0.02560454048216343, + -0.01760663278400898, + 0.014263246208429337, + -0.01757853850722313, + -0.00598438223823905, + -0.005591042805463076, + 0.02594168856739998, + -0.012867826968431473, + -0.0477626770734787, + 0.033902134746313095, + -0.025061357766389847, + -0.05274497717618942, + 0.031523365527391434, + 0.03970857709646225, + 0.01596771739423275, + 0.013888636603951454, + 0.03877205401659012, + -0.009739839471876621, + -0.009786665439605713, + -0.04761283099651337, + -0.008143068291246891, + 0.032684653997421265, + 0.03822886943817139, + 0.009163877926766872, + -0.028170613572001457, + 0.005843903869390488, + 0.020753350108861923, + -0.007281466852873564, + -0.014216420240700245, + -0.014057210646569729, + -0.006424548104405403, + -0.011172720231115818, + -0.03332148864865303, + 0.03974603861570358, + 0.013757524080574512, + -0.015012464486062527, + 0.0028165930416435003, + 0.01327053178101778, + -0.019910480827093124, + 0.006625900510698557, + -0.022626396268606186, + -0.011912573128938675, + -0.02537977509200573, + -0.024574365466833115, + 0.007300197146832943, + -0.023169580847024918, + -0.047425527125597, + 0.0003184178494848311, + 0.02537977509200573, + -0.16213087737560272, + 0.02176479622721672, + 0.0014211736852303147, + 0.0010805134661495686, + -0.021952100098133087, + -0.02803950011730194, + -0.036280903965234756, + -0.023281963542103767, + 0.028245534747838974, + -0.02571692317724228, + 0.011734633706510067, + -0.03586883470416069, + 0.035793911665678024, + -0.030736686661839485, + -0.02288862317800522, + 0.02682201936841011, + 0.012006225995719433, + 0.04476580023765564, + -0.06004985794425011, + 0.09335261583328247, + -0.005075954832136631, + -0.030418269336223602, + -0.004537454340606928, + 0.005057224538177252, + -0.048624277114868164, + -0.0246118251234293, + 0.031017644330859184, + 0.02798330970108509, + -0.03510088473558426, + 0.03560660779476166, + -0.02120288275182247, + 0.031298600137233734, + 0.02449944242835045, + 0.05858888104557991, + 0.03335895016789436, + -0.01662328466773033, + 0.011725268326699734, + -0.04349213093519211, + -0.015340247191488743, + -0.00708011444658041, + -0.05031001940369606, + 0.01857125200331211, + -0.009627456776797771, + -0.015265326015651226, + 0.03616851940751076, + 0.06383340805768967, + -0.027833465486764908, + 0.009430787526071072, + -0.037685688585042953, + 0.02260766737163067, + -0.012202895246446133, + 0.021614952012896538, + -0.009009351953864098, + -0.009674282744526863, + -0.02116542123258114, + -0.017953146249055862, + -0.01185638178139925, + -0.013869906775653362, + -0.011453676968812943, + 0.016951067373156548, + -0.01976063661277294, + -0.012540043331682682, + -0.0244432520121336, + -0.042068615555763245, + -0.018955226987600327, + 0.011697173118591309, + -0.06926524639129639, + 0.0025239295791834593, + -0.015920892357826233, + 0.009945875033736229, + -0.035119615495204926, + 0.027009325101971626, + 0.02015397697687149, + -0.009777300991117954, + -0.015977082774043083, + 0.05308212712407112, + 0.06327150017023087, + 0.021558761596679688, + 0.017091546207666397, + -0.01766282506287098, + -0.013336088508367538, + 0.005932873580604792, + -0.0006385916494764388, + -0.015649300068616867, + 0.015049925073981285, + 0.03538184240460396, + -0.005164924543350935, + 0.003172471886500716, + -0.03903428092598915, + -0.01271798275411129, + -0.09005605429410934, + -0.008620694279670715, + 0.045664865523576736, + 0.003343387274071574, + -0.0031935435254126787, + 0.08196450024843216, + -0.023019736632704735, + -0.03611232712864876, + -0.037123773247003555, + -0.014216420240700245, + -0.009983335621654987, + 0.02026635967195034, + 0.00901871733367443, + 0.027964578941464424, + 0.009561900049448013, + 0.0246118251234293, + -0.01416022889316082, + -0.039558734744787216, + 0.006003112997859716, + 0.024087373167276382, + -0.036131057888269424, + -0.04008318483829498, + -0.04064510017633438, + -0.01315814908593893, + -0.08001653105020523, + -0.01819664239883423, + -0.020228898152709007, + 0.014759602956473827, + -0.05536724254488945, + -0.021577490493655205, + 0.035962484776973724, + 0.008822047151625156, + 0.01771901547908783, + -0.027908386662602425, + 0.019854288548231125, + 0.01024556253105402, + 0.029800163581967354, + 0.002376427175477147, + -0.007960446178913116, + 0.005197702907025814, + -0.019236182793974876, + 0.000641518272459507, + 0.04941095784306526, + 0.059113334864377975, + -0.0018589982064440846, + -0.006073351949453354, + -0.012024955824017525, + 0.013420375064015388, + -0.05192083865404129, + -0.03547549247741699, + -0.011425580829381943, + -0.008737759664654732, + 0.024836590513586998, + -0.014075941406190395, + -0.008587916381657124, + 0.013195609673857689, + 0.032628461718559265, + 0.003600931027904153, + -0.021633682772517204, + -0.0024490077048540115, + 0.018814748153090477, + -0.010835572145879269, + 0.036730434745550156, + 0.056116461753845215, + -0.047238223254680634, + 0.013729427941143513, + -0.006794474553316832, + 0.02987508475780487, + 0.008246085606515408, + 0.032347507774829865, + -0.04191877320408821, + 0.03465135395526886, + -0.061061304062604904, + -0.030792877078056335, + 0.013111323118209839, + 0.03854728862643242, + 0.03127986937761307, + 0.006546296179294586, + -0.062447357922792435, + 0.021970830857753754, + 0.021408917382359505, + 0.04547755792737007, + -0.034070707857608795, + -0.003069454338401556, + 0.006246608681976795, + -0.03761076554656029, + 0.017119640484452248, + 0.03736726939678192, + 0.018608713522553444, + -0.030774148181080818, + 0.021408917382359505, + -0.015321517363190651, + 0.019704444333910942, + 0.009730474092066288, + 0.02082827314734459, + 0.017110276967287064, + -0.012146703898906708, + 0.018589982762932777, + -0.006349626462906599, + 0.01249321736395359, + 0.025248661637306213, + -0.02309465780854225, + -0.053681500256061554, + -0.03335895016789436, + 0.04158162325620651, + -0.02916332706809044, + -0.02815188281238079, + 0.026110263541340828, + -0.014825159683823586, + 0.06844110786914825, + -0.04536517709493637, + -0.03854728862643242, + 0.013261166401207447, + -0.049785565584897995, + 0.008058780804276466, + 0.020453663542866707, + -0.010535884648561478, + 0.019517140462994576, + -0.04693853482604027, + 0.016342326998710632, + -0.020640967413783073, + -0.01554628275334835, + 0.017896955832839012, + 0.012184164486825466, + -0.02148383855819702, + 0.01065763272345066, + 0.0030835021752864122, + 0.019348565489053726, + -0.02071589045226574, + 0.05364403873682022, + -0.017054084688425064, + -0.004036414436995983, + 0.026335028931498528, + -0.03764822706580162, + -0.0230384673923254, + 0.00017208610370289534, + -0.0007825820939615369, + 0.0464140810072422, + 0.02110922895371914, + 0.048849042505025864, + 0.021633682772517204, + 0.024349600076675415, + -0.02910713665187359, + 0.022982275113463402, + -0.01966698467731476, + -0.011921938508749008, + 0.027065515518188477, + 0.017232025042176247, + -0.03560660779476166, + -0.01119145005941391, + 0.0029125867877155542, + -0.019123800098896027, + -0.04903634637594223, + -0.02921951934695244 + ], + "key": "Test Memory Example", + "status": "activated" + } + } + ], + "edges": [], + "total_nodes": 4, + "total_edges": 0 +} \ No newline at end of file diff --git a/examples/mem_cube/_deprecated/README.md b/examples/mem_cube/_deprecated/README.md new file mode 100644 index 000000000..da02eebef --- /dev/null +++ b/examples/mem_cube/_deprecated/README.md @@ -0,0 +1,81 @@ +# Deprecated Examples + +⚠️ **These examples are deprecated and no longer maintained.** + +## Why deprecated? + +These examples demonstrate old APIs that directly access MemCube internals (e.g., `mem_cube.text_mem.get_all()`), which is no longer the recommended approach. + +## Current Best Practice + +**Use `SingleCubeView` / `CompositeCubeView` for all add/search operations.** + +The new View architecture provides: +- ✅ Unified API interface +- ✅ Multi-cube support +- ✅ Better integration with MemOS Server +- ✅ Consistent result format with `cube_id` tracking + +## Updated Examples + +See the following files in the parent directory: +- **`../load_cube.py`** - Load MemCube and operate via SingleCubeView +- **`../dump_cube.py`** - Persist MemCube to disk + +## Migration Guide + +### Old approach (deprecated): +```python +mem_cube = GeneralMemCube.init_from_dir("examples/data/mem_cube_2") +items = mem_cube.text_mem.get_all() # ❌ Direct access +for item in items: + print(item) +``` + +### New approach (recommended): +```python +import json +from memos.api.handlers import init_server +from memos.api.product_models import APISearchRequest +from memos.multi_mem_cube.single_cube import SingleCubeView +from memos.log import get_logger + +logger = get_logger(__name__) + +# Initialize server (uses .env configuration) +components = init_server() +naive = components["naive_mem_cube"] + +# Create View +view = SingleCubeView( + cube_id="my_cube", + naive_mem_cube=naive, + mem_reader=components["mem_reader"], + mem_scheduler=components["mem_scheduler"], + logger=logger, + searcher=components["searcher"], + feedback_server=components["feedback_server"], +) + +# Load data from exported JSON +with open("examples/data/mem_cube_tree/textual_memory.json") as f: + json_data = json.load(f) +naive.text_mem.graph_store.import_graph(json_data, user_name="my_cube") + +# Use View API for search +results = view.search_memories(APISearchRequest( + user_id="user", + readable_cube_ids=["my_cube"], + query="your query here", +)) +for group in results.get("text_mem", []): + for mem in group.get("memories", []): + print(mem.get("metadata", {}).get("memory", "N/A")) +``` + +> **Note on Embeddings**: The sample data uses **bge-m3** model with **1024 dimensions**. +> Ensure your environment uses the same embedding configuration for accurate search. + +--- + +For more information, see the [MemCube documentation](https://memos-doc.memoryos.ai/open_source/modules/mem_cube). diff --git a/examples/mem_cube/load_from_folder.py b/examples/mem_cube/_deprecated/load_from_folder.py similarity index 100% rename from examples/mem_cube/load_from_folder.py rename to examples/mem_cube/_deprecated/load_from_folder.py diff --git a/examples/mem_cube/load_from_remote.py b/examples/mem_cube/_deprecated/load_from_remote.py similarity index 100% rename from examples/mem_cube/load_from_remote.py rename to examples/mem_cube/_deprecated/load_from_remote.py diff --git a/examples/mem_cube/load_lazily.py b/examples/mem_cube/_deprecated/load_lazily.py similarity index 100% rename from examples/mem_cube/load_lazily.py rename to examples/mem_cube/_deprecated/load_lazily.py diff --git a/examples/mem_cube/dump_cube.py b/examples/mem_cube/dump_cube.py new file mode 100644 index 000000000..5a2967ff9 --- /dev/null +++ b/examples/mem_cube/dump_cube.py @@ -0,0 +1,137 @@ +""" +MemCube dump example using SingleCubeView. + +Demonstrates: +1. Initialize server and create SingleCubeView with NEW cube_id +2. Add memories via View +3. Dump ONLY this cube's data to directory + +Requirements: + - MemOS service environment (.env configured) + - Neo4j graph database (set NEO4J_BACKEND=neo4j in .env) + +Note on Embeddings: + This example exports embeddings along with memory data. + The sample data uses: bge-m3 model, 1024 dimensions. + If your environment uses a different embedding model or dimension, + you may need to re-embed the data after import, or the semantic + search results may be inaccurate or fail. +""" + +import contextlib +import json +import os +import shutil + +from memos.api.handlers import init_server +from memos.api.product_models import APIADDRequest +from memos.log import get_logger +from memos.multi_mem_cube.single_cube import SingleCubeView + + +logger = get_logger(__name__) + +# NEW cube_id to avoid dumping existing data +EXAMPLE_CUBE_ID = "example_dump_cube" +EXAMPLE_USER_ID = "example_user" + +# ============================================================================= +# Step 1: Initialize server +# ============================================================================= +print("=" * 60) +print("Step 1: Initialize server") +print("=" * 60) + +components = init_server() +print("✓ Server initialized") + +# ============================================================================= +# Step 2: Create SingleCubeView with NEW cube_id +# ============================================================================= +print("\n" + "=" * 60) +print(f"Step 2: Create SingleCubeView (cube_id={EXAMPLE_CUBE_ID})") +print("=" * 60) + +naive = components["naive_mem_cube"] +view = SingleCubeView( + cube_id=EXAMPLE_CUBE_ID, # NEW cube_id + naive_mem_cube=naive, + mem_reader=components["mem_reader"], + mem_scheduler=components["mem_scheduler"], + logger=logger, + searcher=components["searcher"], + feedback_server=components["feedback_server"], +) +print("✓ SingleCubeView created") + +# ============================================================================= +# Step 3: Add memories via View +# ============================================================================= +print("\n" + "=" * 60) +print("Step 3: Add memories via SingleCubeView") +print("=" * 60) + +result = view.add_memories( + APIADDRequest( + user_id=EXAMPLE_USER_ID, + writable_cube_ids=[EXAMPLE_CUBE_ID], + messages=[ + {"role": "user", "content": "This is a test memory for dump example"}, + {"role": "user", "content": "Another memory to demonstrate persistence"}, + ], + async_mode="sync", + ) +) +print(f"✓ Added {len(result)} memories") + +# ============================================================================= +# Step 4: Dump ONLY this cube's data +# ============================================================================= +print("\n" + "=" * 60) +print("Step 4: Dump cube data (filtered by cube_id)") +print("=" * 60) + +output_dir = "tmp/mem_cube_dump" +if os.path.exists(output_dir): + shutil.rmtree(output_dir) +os.makedirs(output_dir, exist_ok=True) + +# Export only this cube's data using user_name filter +text_mem = naive.text_mem +json_data = text_mem.graph_store.export_graph( + include_embedding=True, # Include embeddings for semantic search + user_name=EXAMPLE_CUBE_ID, # Filter by cube_id +) + +# Fix embedding format: parse string to list for import compatibility +# (export_graph stores embedding as string in metadata, but add_node expects list) +for node in json_data.get("nodes", []): + metadata = node.get("metadata", {}) + if "embedding" in metadata and isinstance(metadata["embedding"], str): + with contextlib.suppress(json.JSONDecodeError): + metadata["embedding"] = json.loads(metadata["embedding"]) + +print(f"✓ Exported {len(json_data.get('nodes', []))} nodes") + +# Save to file +memory_file = os.path.join(output_dir, "textual_memory.json") +with open(memory_file, "w", encoding="utf-8") as f: + json.dump(json_data, f, indent=2, ensure_ascii=False) +print(f"✓ Saved to: {memory_file}") + +# Save config (user can modify sensitive fields before sharing) +config = components["default_cube_config"].model_copy(deep=True) +config.user_id = EXAMPLE_USER_ID +config.cube_id = EXAMPLE_CUBE_ID +config_file = os.path.join(output_dir, "config.json") +config.to_json_file(config_file) +print(f"✓ Config saved to: {config_file}") + +# ============================================================================= +# Done +# ============================================================================= +print("\n" + "=" * 60) +print("✅ Example completed!") +print("=" * 60) +print(f"\nDumped to: {output_dir}") +print("Run load_cube.py to load this data") diff --git a/examples/mem_cube/load_cube.py b/examples/mem_cube/load_cube.py new file mode 100644 index 000000000..c7552a4a2 --- /dev/null +++ b/examples/mem_cube/load_cube.py @@ -0,0 +1,137 @@ +""" +MemCube load example using SingleCubeView. + +Demonstrates: +1. Initialize server and create SingleCubeView +2. Load memories from dump via graph_store.import_graph() +3. Display loaded memories +4. Search loaded memories (semantic search) + +Requirements: + - MemOS service environment (.env configured) + - Neo4j graph database (set NEO4J_BACKEND=neo4j in .env) + +Note on Embeddings: + The sample data (examples/data/mem_cube_tree) uses: bge-m3 model, 1024 dimensions. + For semantic search to work correctly, your environment must use the same + embedding model and dimension. If different, search results may be inaccurate. +""" + +import json +import os + +from memos.api.handlers import init_server +from memos.api.product_models import APISearchRequest +from memos.log import get_logger +from memos.multi_mem_cube.single_cube import SingleCubeView + + +logger = get_logger(__name__) + +EXAMPLE_CUBE_ID = "example_dump_cube" +EXAMPLE_USER_ID = "example_user" + +# ============================================================================= +# Step 1: Initialize server +# ============================================================================= +print("=" * 60) +print("Step 1: Initialize server") +print("=" * 60) + +components = init_server() +print("✓ Server initialized") + +# ============================================================================= +# Step 2: Create SingleCubeView +# ============================================================================= +print("\n" + "=" * 60) +print(f"Step 2: Create SingleCubeView (cube_id={EXAMPLE_CUBE_ID})") +print("=" * 60) + +naive = components["naive_mem_cube"] +view = SingleCubeView( + cube_id=EXAMPLE_CUBE_ID, + naive_mem_cube=naive, + mem_reader=components["mem_reader"], + mem_scheduler=components["mem_scheduler"], + logger=logger, + searcher=components["searcher"], + feedback_server=components["feedback_server"], +) +print("✓ SingleCubeView created") + +# ============================================================================= +# Step 3: Load memories from dump +# ============================================================================= +print("\n" + "=" * 60) +print("Step 3: Load memories from dump") +print("=" * 60) + +load_dir = "examples/data/mem_cube_tree" +memory_file = os.path.join(load_dir, "textual_memory.json") + +if not os.path.exists(memory_file): + print(f"❌ File not found: {memory_file}") + print(" Run dump_cube.py first to create data!") + exit(1) + +with open(memory_file, encoding="utf-8") as f: + json_data = json.load(f) + +# Import graph data into graph_store +text_mem = naive.text_mem +text_mem.graph_store.import_graph(json_data, user_name=EXAMPLE_CUBE_ID) + +nodes = json_data.get("nodes", []) +edges = json_data.get("edges", []) +print(f"✓ Imported {len(nodes)} nodes, {len(edges)} edges") + +# ============================================================================= +# Step 4: Display loaded memories +# ============================================================================= +print("\n" + "=" * 60) +print("Step 4: Display loaded memories") +print("=" * 60) + +print(f"\nLoaded {len(nodes)} memories:") +for i, node in enumerate(nodes, 1): + metadata = node.get("metadata", {}) + memory_text = node.get("memory", "N/A") + mem_type = metadata.get("memory_type", "unknown") + print(f"\n [{i}] Type: {mem_type}") + print(f" Content: {memory_text[:70]}...") + +# ============================================================================= +# Step 5: Search loaded memories +# ============================================================================= +print("\n" + "=" * 60) +print("Step 5: Search loaded memories") +print("=" * 60) + +query = "test memory dump persistence demonstration" +print(f'Query: "{query}"') + +search_result = view.search_memories( + APISearchRequest( + user_id=EXAMPLE_USER_ID, + readable_cube_ids=[EXAMPLE_CUBE_ID], + query=query, + ) +) + +text_mem_results = search_result.get("text_mem", []) +memories = [] +for group in text_mem_results: + memories.extend(group.get("memories", [])) + +print(f"\n✓ Found {len(memories)} relevant memories:") +for i, mem in enumerate(memories[:3], 1): + content = mem.get("metadata", {}).get("memory", "N/A")[:70] + print(f" [{i}] {content}...") + +# ============================================================================= +# Done +# ============================================================================= +print("\n" + "=" * 60) +print("✅ Example completed!") +print("=" * 60) From 82a9477e4c7a873bb62f8f03e908a2bb15167f9c Mon Sep 17 00:00:00 2001 From: Travis Tang Date: Wed, 14 Jan 2026 14:50:01 +0800 Subject: [PATCH 32/53] fix:examples update for core memories (#863) * fix bugs: try to fix bugs in _submit_web_logs * fix bugs: try to address bugs * fix bugs * refactor: modify examples * revise add operation and fix an unbelievable bug * address the bug issues * the doc file has a format problem which has been fixed in this commit * add a range of new feats for the add operation * address the incompatible issue of local scheduler * feat(scheduler): optimize redis queue consumer group management - Proactively ensure consumer groups exist in '_refresh_stream_keys' for newly discovered streams. - Remove redundant consumer group checks in '_read_new_messages_batch' to improve read performance. - Clean up 'seen_streams' cache when streams are deleted to ensure correct group recreation. - This change reduces unnecessary Redis calls during high-frequency polling. * fix(tests): resolve AttributeError in SimpleStructMemReader tests - Import 'parse_json_result' from 'memos.mem_reader.utils' instead of accessing it as an instance attribute. - Fixes 'AttributeError: 'SimpleStructMemReader' object has no attribute 'parse_json_result'' in 'test_parse_json_result_success' and 'test_parse_json_result_failure'. - Remove incorrect mock assignment of 'parse_json_result' in 'test_process_chat_data'. * fix(mem_reader): pass info dict to add_before_search for correct user_id usage - Update 'add_before_search' signature in 'SimpleStructMemReader' to accept 'info' dict. - Pass 'info' (containing 'user_id' and 'session_id') to 'self.searcher.search' instead of using empty strings. - Add 'test_add_before_search' to 'TestSimpleStructMemReader' to verify the fix and ensure 'searcher.search' receives the correct 'info'. - This ensures that memory searches are scoped to the correct user and session. * refactor add_before_search from mem_reader to SingleCubeView * address bugs * fix: fix the qsize bug of task queue, and accept change from hotfix/scheduler * fix: address some issues to run old scheduler example and kv cache example * fix: address the issue of Top-level import of unavailable module 'torch' * fix: resolve linting errors and make optional dependencies lazy loaded - Fix ambiguous characters and commented-out code in examples/mem_scheduler/quick_start_examples.py - Fix nested if statements in src/memos/mem_os/core.py - Move torch and transformers imports to method scope in src/memos/llms/hf.py to support optional dependencies - Update tests/llms/test_hf.py to patch transformers module directly * refactor: revise the rewrite prompt to make it better * refactor: update examples * refactor: update examples for scheduler * fix bugs: address the unsupported xautoclaim command when redis version larger than 6.2.0 via adding a new feature of manul auto claim with the combination of xpending + xclaim * refactor: review settings * refactor: adjust examples to make it run better for code debugging * refactor: review slow add apis to get a better performance on Halumen * fix bugs: address the issue when set user_redis_queue to false, the status_tracker is still using * refactor: allow the code to run without rabbitmq * refactor: create a _parse_pending_entry for redis queue * refactor: add a try/catch for status_tracker * fix: revise examples of textual memories to run normally * fix:address the issues in existing examples of core memories * refactor: remove deprecated scheduler examples, and revise half examples * refactor: address all issues in examples --- examples/core_memories/kv_cache_memory.py | 186 +++++++---- .../core_memories/vllm_kv_cache_memory.py | 2 +- examples/mem_scheduler/api_w_scheduler.py | 154 +++++---- .../mem_scheduler/debug_text_mem_replace.py | 109 ------ examples/mem_scheduler/memos_w_scheduler.py | 258 ++++++--------- .../memos_w_scheduler_for_test.py | 88 ----- .../mem_scheduler/quick_start_examples.py | 312 ------------------ examples/mem_scheduler/rabbitmq_example.py | 60 ---- examples/mem_scheduler/redis_example.py | 4 +- ..._for_async_tasks.py => run_async_tasks.py} | 0 examples/mem_scheduler/show_redis_status.py | 33 +- examples/mem_scheduler/task_fair_schedule.py | 87 ----- src/memos/api/config.py | 2 +- src/memos/api/start_api.py | 2 +- .../task_schedule_modules/redis_queue.py | 35 +- 15 files changed, 352 insertions(+), 980 deletions(-) delete mode 100644 examples/mem_scheduler/debug_text_mem_replace.py delete mode 100644 examples/mem_scheduler/memos_w_scheduler_for_test.py delete mode 100644 examples/mem_scheduler/quick_start_examples.py delete mode 100644 examples/mem_scheduler/rabbitmq_example.py rename examples/mem_scheduler/{scheduler_for_async_tasks.py => run_async_tasks.py} (100%) delete mode 100644 examples/mem_scheduler/task_fair_schedule.py diff --git a/examples/core_memories/kv_cache_memory.py b/examples/core_memories/kv_cache_memory.py index dbe3ac4d7..470ad56a7 100644 --- a/examples/core_memories/kv_cache_memory.py +++ b/examples/core_memories/kv_cache_memory.py @@ -1,68 +1,132 @@ +import json + +from transformers import DynamicCache + from memos.configs.memory import MemoryConfigFactory +from memos.memories.activation.item import KVCacheItem from memos.memories.factory import MemoryFactory -# ===== Example: Use factory and HFLLM to build and manage KVCacheMemory ===== +def get_cache_info(cache): + if not cache: + return None + + num_layers = 0 + total_size_bytes = 0 + + if hasattr(cache, "layers"): + num_layers = len(cache.layers) + for layer in cache.layers: + if hasattr(layer, "key_cache") and layer.key_cache is not None: + total_size_bytes += layer.key_cache.nelement() * layer.key_cache.element_size() + if hasattr(layer, "value_cache") and layer.value_cache is not None: + total_size_bytes += layer.value_cache.nelement() * layer.value_cache.element_size() + + if hasattr(layer, "keys") and layer.keys is not None: + total_size_bytes += layer.keys.nelement() * layer.keys.element_size() + if hasattr(layer, "values") and layer.values is not None: + total_size_bytes += layer.values.nelement() * layer.values.element_size() + + elif hasattr(cache, "key_cache") and hasattr(cache, "value_cache"): + num_layers = len(cache.key_cache) + for k, v in zip(cache.key_cache, cache.value_cache, strict=False): + if k is not None: + total_size_bytes += k.nelement() * k.element_size() + if v is not None: + total_size_bytes += v.nelement() * v.element_size() + + return { + "num_layers": num_layers, + "size_bytes": total_size_bytes, + "size_mb": f"{total_size_bytes / (1024 * 1024):.2f} MB", + } + + +def serialize_item(obj): + if isinstance(obj, list): + return [serialize_item(x) for x in obj] + + if isinstance(obj, KVCacheItem): + return { + "id": obj.id, + "metadata": obj.metadata, + "records": obj.records.model_dump() + if hasattr(obj.records, "model_dump") + else obj.records, + "memory": get_cache_info(obj.memory), + } + + if isinstance(obj, DynamicCache): + return get_cache_info(obj) -# 1. Create config for KVCacheMemory (using HuggingFace backend) -config = MemoryConfigFactory( - backend="kv_cache", - config={ - "extractor_llm": { - "backend": "huggingface", - "config": { - "model_name_or_path": "Qwen/Qwen3-0.6B", # Use a valid HuggingFace model name - "max_tokens": 32, - "add_generation_prompt": True, - "remove_think_prefix": True, + return str(obj) + + +if __name__ == "__main__": + # ===== Example: Use factory and HFLLM to build and manage KVCacheMemory ===== + + # 1. Create config for KVCacheMemory (using HuggingFace backend) + config = MemoryConfigFactory( + backend="kv_cache", + config={ + "extractor_llm": { + "backend": "huggingface", + "config": { + "model_name_or_path": "Qwen/Qwen3-0.6B", # Use a valid HuggingFace model name + "max_tokens": 32, + "add_generation_prompt": True, + "remove_think_prefix": True, + }, }, }, - }, -) - -# 2. Instantiate KVCacheMemory using the factory -kv_mem = MemoryFactory.from_config(config) - -# 3. Extract a KVCacheItem (DynamicCache) from a prompt (uses HFLLM.build_kv_cache internally) -prompt = [ - {"role": "user", "content": "What is MemOS?"}, - {"role": "assistant", "content": "MemOS is a memory operating system for LLMs."}, -] -print("===== Extract KVCacheItem =====") -cache_item = kv_mem.extract(prompt) -print(cache_item) -print() - -# 4. Add the extracted KVCacheItem -print("===== Add KVCacheItem =====") -kv_mem.add([cache_item]) -print(kv_mem.get_all()) -print() - -# 5. Get by id -print("===== Get KVCacheItem by id =====") -retrieved = kv_mem.get(cache_item.id) -print(retrieved) -print() - -# 6. Merge caches (simulate with two items) -print("===== Merge DynamicCache =====") -item2 = kv_mem.extract([{"role": "user", "content": "Tell me a joke."}]) -kv_mem.add([item2]) -merged_cache = kv_mem.get_cache([cache_item.id, item2.id]) -print(merged_cache) -print() - -# 7. Delete one -print("===== Delete one KVCacheItem =====") -kv_mem.delete([cache_item.id]) -print(kv_mem.get_all()) -print() - -# 8. Dump and load -print("===== Dump and Load KVCacheMemory =====") -kv_mem.dump("tmp/kv_mem") -print("Memory dumped to 'tmp/kv_mem'.") -kv_mem.delete_all() -kv_mem.load("tmp/kv_mem") -print("Memory loaded from 'tmp/kv_mem':", kv_mem.get_all()) + ) + + # 2. Instantiate KVCacheMemory using the factory + kv_mem = MemoryFactory.from_config(config) + + # 3. Extract a KVCacheItem (DynamicCache) from a prompt (uses HFLLM.build_kv_cache internally) + prompt = [ + {"role": "user", "content": "What is MemOS?"}, + {"role": "assistant", "content": "MemOS is a memory operating system for LLMs."}, + ] + print("===== Extract KVCacheItem =====") + cache_item = kv_mem.extract(prompt) + print(json.dumps(serialize_item(cache_item), indent=2, default=str)) + print() + + # 4. Add the extracted KVCacheItem + print("===== Add KVCacheItem =====") + kv_mem.add([cache_item]) + print(json.dumps(serialize_item(kv_mem.get_all()), indent=2, default=str)) + print() + + # 5. Get by id + print("===== Get KVCacheItem by id =====") + retrieved = kv_mem.get(cache_item.id) + print(json.dumps(serialize_item(retrieved), indent=2, default=str)) + print() + + # 6. Merge caches (simulate with two items) + print("===== Merge DynamicCache =====") + item2 = kv_mem.extract([{"role": "user", "content": "Tell me a joke."}]) + kv_mem.add([item2]) + merged_cache = kv_mem.get_cache([cache_item.id, item2.id]) + print(json.dumps(serialize_item(merged_cache), indent=2, default=str)) + print() + + # 7. Delete one + print("===== Delete one KVCacheItem =====") + kv_mem.delete([cache_item.id]) + print(json.dumps(serialize_item(kv_mem.get_all()), indent=2, default=str)) + print() + + # 8. Dump and load + print("===== Dump and Load KVCacheMemory =====") + kv_mem.dump("tmp/kv_mem") + print("Memory dumped to 'tmp/kv_mem'.") + kv_mem.delete_all() + kv_mem.load("tmp/kv_mem") + print( + "Memory loaded from 'tmp/kv_mem':", + json.dumps(serialize_item(kv_mem.get_all()), indent=2, default=str), + ) diff --git a/examples/core_memories/vllm_kv_cache_memory.py b/examples/core_memories/vllm_kv_cache_memory.py index 65ae64911..7122200f6 100644 --- a/examples/core_memories/vllm_kv_cache_memory.py +++ b/examples/core_memories/vllm_kv_cache_memory.py @@ -20,7 +20,7 @@ def main(): "extractor_llm": { "backend": "vllm", "config": { - "model_name_or_path": "/mnt/afs/models/hf_models/Qwen2.5-7B", + "model_name_or_path": "Qwen/Qwen3-0.6B", "api_base": "http://localhost:8088/v1", "temperature": 0.7, "max_tokens": 1024, diff --git a/examples/mem_scheduler/api_w_scheduler.py b/examples/mem_scheduler/api_w_scheduler.py index 871dd0258..ba3d64bf1 100644 --- a/examples/mem_scheduler/api_w_scheduler.py +++ b/examples/mem_scheduler/api_w_scheduler.py @@ -1,85 +1,103 @@ +import sys + +from pathlib import Path from time import sleep -from memos.api.handlers.scheduler_handler import ( + +FILE_PATH = Path(__file__).absolute() +BASE_DIR = FILE_PATH.parent.parent.parent +sys.path.insert(0, str(BASE_DIR)) # Enable execution from any working directory + +from memos.api.handlers.scheduler_handler import ( # noqa: E402 handle_scheduler_status, handle_scheduler_wait, ) -from memos.api.routers.server_router import mem_scheduler, status_tracker -from memos.mem_scheduler.schemas.message_schemas import ScheduleMessageItem - - -# Debug: Print scheduler configuration -print("=== Scheduler Configuration Debug ===") -print(f"Scheduler type: {type(mem_scheduler).__name__}") -print(f"Config: {mem_scheduler.config}") -print(f"use_redis_queue: {mem_scheduler.use_redis_queue}") -print(f"Queue type: {type(mem_scheduler.memos_message_queue).__name__}") -print(f"Queue maxsize: {getattr(mem_scheduler.memos_message_queue, 'maxsize', 'N/A')}") -print("=====================================\n") - -queue = mem_scheduler.memos_message_queue -queue.clear() - - -# 1. Define a handler function -def my_test_handler(messages: list[ScheduleMessageItem]): - print(f"My test handler received {len(messages)} messages:") - for msg in messages: - print(f" my_test_handler - {msg.item_id}: {msg.content}") - user_status_running = handle_scheduler_status( - user_id=msg.user_id, status_tracker=status_tracker - ) - print("[Monitor] Status after submit:", user_status_running) +from memos.api.routers.server_router import mem_scheduler, status_tracker # noqa: E402 +from memos.mem_scheduler.schemas.message_schemas import ScheduleMessageItem # noqa: E402 -# 2. Register the handler TEST_HANDLER_LABEL = "test_handler" TEST_USER_ID = "test_user" -mem_scheduler.register_handlers({TEST_HANDLER_LABEL: my_test_handler}) - -# 2.1 Monitor global scheduler status before submitting tasks -global_status_before = handle_scheduler_status(user_id=TEST_USER_ID, status_tracker=status_tracker) -print("[Monitor] Global status before submit:", global_status_before) - -# 3. Create messages -messages_to_send = [ - ScheduleMessageItem( - item_id=f"test_item_{i}", - user_id=TEST_USER_ID, - mem_cube_id="test_mem_cube", - label=TEST_HANDLER_LABEL, - content=f"This is test message {i}", +USER_MEM_CUBE = "test_mem_cube" + + +def run_with_scheduler_api(): + # Debug: Print scheduler configuration + print("=== Scheduler Configuration Debug ===") + print(f"Scheduler type: {type(mem_scheduler).__name__}") + print(f"Config: {mem_scheduler.config}") + print(f"use_redis_queue: {mem_scheduler.use_redis_queue}") + print(f"Queue type: {type(mem_scheduler.memos_message_queue).__name__}") + print(f"Queue maxsize: {getattr(mem_scheduler.memos_message_queue, 'maxsize', 'N/A')}") + print("=====================================\n") + + queue = mem_scheduler.memos_message_queue + queue.clear() + + # 1. Define a handler function + def my_test_handler(messages: list[ScheduleMessageItem]): + print(f"My test handler received {len(messages)} messages:") + for msg in messages: + print(f" my_test_handler - {msg.item_id}: {msg.content}") + user_status_running = handle_scheduler_status( + user_id=msg.user_id, status_tracker=status_tracker + ) + print("[Monitor] Status after submit:", user_status_running) + + # 2. Register the handler + mem_scheduler.register_handlers({TEST_HANDLER_LABEL: my_test_handler}) + + # 2.1 Monitor global scheduler status before submitting tasks + global_status_before = handle_scheduler_status( + user_id=TEST_USER_ID, status_tracker=status_tracker ) - for i in range(5) -] + print("[Monitor] Global status before submit:", global_status_before) + + # 3. Create messages + messages_to_send = [ + ScheduleMessageItem( + item_id=f"test_item_{i}", + user_id=TEST_USER_ID, + mem_cube_id="test_mem_cube", + label=TEST_HANDLER_LABEL, + content=f"This is test message {i}", + ) + for i in range(5) + ] -# 5. Submit messages -for mes in messages_to_send: - print(f"Submitting message {mes.item_id} to the scheduler...") - mem_scheduler.submit_messages([mes]) - sleep(1) + # 5. Submit messages + for mes in messages_to_send: + print(f"Submitting message {mes.item_id} to the scheduler...") + mem_scheduler.submit_messages([mes]) + sleep(1) -# 5.1 Monitor status for specific mem_cube while running -USER_MEM_CUBE = "test_mem_cube" + # 5.1 Monitor status for specific mem_cube while running + # 6. Wait for messages to be processed (limited to 100 checks) -# 6. Wait for messages to be processed (limited to 100 checks) + user_status_running = handle_scheduler_status( + user_id=TEST_USER_ID, status_tracker=status_tracker + ) + print(f"[Monitor] Status for {USER_MEM_CUBE} after submit:", user_status_running) + + # 6.1 Wait until idle for specific mem_cube via handler + wait_result = handle_scheduler_wait( + user_name=TEST_USER_ID, + status_tracker=status_tracker, + timeout_seconds=120.0, + poll_interval=0.5, + ) + print(f"[Monitor] Wait result for {USER_MEM_CUBE}:", wait_result) -user_status_running = handle_scheduler_status(user_id=TEST_USER_ID, status_tracker=status_tracker) -print(f"[Monitor] Status for {USER_MEM_CUBE} after submit:", user_status_running) + # 6.2 Monitor global scheduler status after processing + global_status_after = handle_scheduler_status( + user_id=TEST_USER_ID, status_tracker=status_tracker + ) + print("[Monitor] Global status after processing:", global_status_after) -# 6.1 Wait until idle for specific mem_cube via handler -wait_result = handle_scheduler_wait( - user_name=TEST_USER_ID, - status_tracker=status_tracker, - timeout_seconds=120.0, - poll_interval=0.5, -) -print(f"[Monitor] Wait result for {USER_MEM_CUBE}:", wait_result) + # 7. Stop the scheduler + print("Stopping the scheduler...") + mem_scheduler.stop() -# 6.2 Monitor global scheduler status after processing -global_status_after = handle_scheduler_status(user_id=TEST_USER_ID, status_tracker=status_tracker) -print("[Monitor] Global status after processing:", global_status_after) -# 7. Stop the scheduler -print("Stopping the scheduler...") -mem_scheduler.stop() +if __name__ == "__main__": + run_with_scheduler_api() diff --git a/examples/mem_scheduler/debug_text_mem_replace.py b/examples/mem_scheduler/debug_text_mem_replace.py deleted file mode 100644 index a5de8e572..000000000 --- a/examples/mem_scheduler/debug_text_mem_replace.py +++ /dev/null @@ -1,109 +0,0 @@ -import json -import shutil -import sys - -from pathlib import Path - -from memos_w_scheduler_for_test import init_task - -from memos.configs.mem_cube import GeneralMemCubeConfig -from memos.configs.mem_os import MOSConfig -from memos.configs.mem_scheduler import AuthConfig -from memos.log import get_logger -from memos.mem_cube.general import GeneralMemCube -from memos.mem_scheduler.analyzer.mos_for_test_scheduler import MOSForTestScheduler - - -FILE_PATH = Path(__file__).absolute() -BASE_DIR = FILE_PATH.parent.parent.parent -sys.path.insert(0, str(BASE_DIR)) - -# Enable execution from any working directory - -logger = get_logger(__name__) - -if __name__ == "__main__": - # set up data - conversations, questions = init_task() - - # set configs - mos_config = MOSConfig.from_yaml_file( - f"{BASE_DIR}/examples/data/config/mem_scheduler/memos_config_w_optimized_scheduler.yaml" - ) - - mem_cube_config = GeneralMemCubeConfig.from_yaml_file( - f"{BASE_DIR}/examples/data/config/mem_scheduler/mem_cube_config_neo4j.yaml" - ) - - # default local graphdb uri - if AuthConfig.default_config_exists(): - auth_config = AuthConfig.from_local_config() - - mos_config.mem_reader.config.llm.config.api_key = auth_config.openai.api_key - mos_config.mem_reader.config.llm.config.api_base = auth_config.openai.base_url - - mem_cube_config.text_mem.config.graph_db.config.uri = auth_config.graph_db.uri - mem_cube_config.text_mem.config.graph_db.config.user = auth_config.graph_db.user - mem_cube_config.text_mem.config.graph_db.config.password = auth_config.graph_db.password - mem_cube_config.text_mem.config.graph_db.config.db_name = auth_config.graph_db.db_name - mem_cube_config.text_mem.config.graph_db.config.auto_create = ( - auth_config.graph_db.auto_create - ) - - # Initialization - mos = MOSForTestScheduler(mos_config) - - user_id = "user_1" - mos.create_user(user_id) - - mem_cube_id = "mem_cube_5" - mem_cube_name_or_path = f"{BASE_DIR}/outputs/mem_scheduler/{user_id}/{mem_cube_id}" - - if Path(mem_cube_name_or_path).exists(): - shutil.rmtree(mem_cube_name_or_path) - print(f"{mem_cube_name_or_path} is not empty, and has been removed.") - - mem_cube = GeneralMemCube(mem_cube_config) - mem_cube.dump(mem_cube_name_or_path) - mos.register_mem_cube( - mem_cube_name_or_path=mem_cube_name_or_path, mem_cube_id=mem_cube_id, user_id=user_id - ) - - mos.add(conversations, user_id=user_id, mem_cube_id=mem_cube_id) - - # Add interfering conversations - file_path = Path(f"{BASE_DIR}/examples/data/mem_scheduler/scene_data.json") - scene_data = json.load(file_path.open("r", encoding="utf-8")) - mos.add(scene_data[0], user_id=user_id, mem_cube_id=mem_cube_id) - mos.add(scene_data[1], user_id=user_id, mem_cube_id=mem_cube_id) - - # Test the replace_working_memory functionality - print("\n--- Testing replace_working_memory ---") - - # Get current working memories - text_mem_base = mem_cube.text_mem - if text_mem_base is not None: - working_memories_before = text_mem_base.get_working_memory() - print(f"Working memories before replacement: {len(working_memories_before)}") - - # Create filtered memories (simulate what the scheduler would do) - # Keep only memories related to Max - filtered_memories = [working_memories_before[1], working_memories_before[4]] - - text_mem_base.replace_working_memory(memories=filtered_memories) - - # Check working memory after replacement - working_memories_after = text_mem_base.get_working_memory() - print(f"Working memories after replacement: {len(working_memories_after)}") - - if len(working_memories_after) == len(filtered_memories): - print("✅ SUCCESS: Working memory count matches filtered memories") - else: - print( - f"❌ FAILED: Expected {len(filtered_memories)}, got {len(working_memories_after)}" - ) - - else: - print("❌ text_mem is None - not properly initialized") - - mos.mem_scheduler.stop() diff --git a/examples/mem_scheduler/memos_w_scheduler.py b/examples/mem_scheduler/memos_w_scheduler.py index ef7d853df..55e966b5a 100644 --- a/examples/mem_scheduler/memos_w_scheduler.py +++ b/examples/mem_scheduler/memos_w_scheduler.py @@ -1,32 +1,36 @@ -import re -import shutil +import asyncio +import json +import os import sys +import time -from datetime import datetime from pathlib import Path -from memos.configs.mem_cube import GeneralMemCubeConfig -from memos.configs.mem_os import MOSConfig -from memos.configs.mem_scheduler import AuthConfig -from memos.log import get_logger -from memos.mem_cube.general import GeneralMemCube -from memos.mem_os.main import MOS -from memos.mem_scheduler.schemas.message_schemas import ScheduleLogForWebItem -from memos.mem_scheduler.schemas.task_schemas import ( - ADD_TASK_LABEL, - ANSWER_TASK_LABEL, - MEM_ARCHIVE_TASK_LABEL, - MEM_ORGANIZE_TASK_LABEL, - MEM_UPDATE_TASK_LABEL, - QUERY_TASK_LABEL, -) -from memos.mem_scheduler.utils.filter_utils import transform_name_to_key - +# Setup paths before imports that depend on them FILE_PATH = Path(__file__).absolute() BASE_DIR = FILE_PATH.parent.parent.parent sys.path.insert(0, str(BASE_DIR)) # Enable execution from any working directory +# Set environment variables before importing server_router to ensure components are initialized correctly +os.environ["ENABLE_CHAT_API"] = "true" + +from memos.api.product_models import APIADDRequest, ChatPlaygroundRequest # noqa: E402 + +# Import from server_router for initialization +from memos.api.routers.server_router import ( # noqa: E402 + add_handler, + chat_stream_playground, + mem_scheduler, +) +from memos.log import get_logger # noqa: E402 +from memos.mem_scheduler.schemas.message_schemas import ScheduleMessageItem # noqa: E402 +from memos.mem_scheduler.schemas.task_schemas import ( # noqa: E402 + MEM_UPDATE_TASK_LABEL, + QUERY_TASK_LABEL, +) + + logger = get_logger(__name__) @@ -73,150 +77,106 @@ def init_task(): return conversations, questions -def _truncate_with_rules(text: str) -> str: - has_cjk = bool(re.search(r"[\u4e00-\u9fff]", text)) - limit = 32 if has_cjk else 64 - normalized = text.strip().replace("\n", " ") - if len(normalized) <= limit: - return normalized - return normalized[:limit] + "..." - - -def _format_title(ts: datetime, title_text: str) -> str: - return f"{ts.astimezone().strftime('%H:%M:%S')} {title_text}" - - -def _cube_display_from(mem_cube_id: str) -> str: - if "public" in (mem_cube_id or "").lower(): - return "PublicMemCube" - return "UserMemCube" - - -_TYPE_SHORT = { - "LongTermMemory": "LTM", - "UserMemory": "User", - "WorkingMemory": "Working", - "ActivationMemory": "Activation", - "ParameterMemory": "Parameter", - "TextMemory": "Text", - "UserInput": "Input", - "NotApplicable": "NA", -} - - -def _format_entry(item: ScheduleLogForWebItem) -> tuple[str, str]: - cube_display = getattr(item, "memcube_name", None) or _cube_display_from(item.mem_cube_id) - label = item.label - content = item.log_content or "" - memcube_content = getattr(item, "memcube_log_content", None) or [] - memory_len = getattr(item, "memory_len", None) or len(memcube_content) or 1 - - def _first_content() -> str: - if memcube_content: - return memcube_content[0].get("content", "") or content - return content - - if label in ("addMessage", QUERY_TASK_LABEL, ANSWER_TASK_LABEL): - target_cube = cube_display.replace("MemCube", "") - title = _format_title(item.timestamp, f"addMessages to {target_cube} MemCube") - return title, _truncate_with_rules(_first_content()) - - if label in ("addMemory", ADD_TASK_LABEL): - title = _format_title(item.timestamp, f"{cube_display} added {memory_len} memories") - return title, _truncate_with_rules(_first_content()) - - if label in ("updateMemory", MEM_UPDATE_TASK_LABEL): - title = _format_title(item.timestamp, f"{cube_display} updated {memory_len} memories") - return title, _truncate_with_rules(_first_content()) - - if label in ("archiveMemory", MEM_ARCHIVE_TASK_LABEL): - title = _format_title(item.timestamp, f"{cube_display} archived {memory_len} memories") - return title, _truncate_with_rules(_first_content()) - - if label in ("mergeMemory", MEM_ORGANIZE_TASK_LABEL): - title = _format_title(item.timestamp, f"{cube_display} merged {memory_len} memories") - merged = [c for c in memcube_content if c.get("type") == "merged"] - post = [c for c in memcube_content if c.get("type") == "postMerge"] - parts = [] - if merged: - parts.append("Merged: " + " | ".join(c.get("content", "") for c in merged)) - if post: - parts.append("Result: " + " | ".join(c.get("content", "") for c in post)) - detail = " ".join(parts) if parts else _first_content() - return title, _truncate_with_rules(detail) - - if label == "scheduleMemory": - title = _format_title(item.timestamp, f"{cube_display} scheduled {memory_len} memories") - if memcube_content: - return title, _truncate_with_rules(memcube_content[0].get("content", "")) - key = transform_name_to_key(content) - from_short = _TYPE_SHORT.get(item.from_memory_type, item.from_memory_type) - to_short = _TYPE_SHORT.get(item.to_memory_type, item.to_memory_type) - return title, _truncate_with_rules(f"[{from_short}→{to_short}] {key}: {content}") - - title = _format_title(item.timestamp, f"{cube_display} event") - return title, _truncate_with_rules(_first_content()) - - -def run_with_scheduler_init(): - print("==== run_with_automatic_scheduler_init ====") - conversations, questions = init_task() - - # set configs - mos_config = MOSConfig.from_yaml_file( - f"{BASE_DIR}/examples/data/config/mem_scheduler/memos_config_w_optimized_scheduler.yaml" - ) - - mem_cube_config = GeneralMemCubeConfig.from_yaml_file( - f"{BASE_DIR}/examples/data/config/mem_scheduler/mem_cube_config_neo4j.yaml" - ) - - # default local graphdb uri - if AuthConfig.default_config_exists(): - auth_config = AuthConfig.from_local_config() +working_memories = [] + + +# Define custom query handler function +def custom_query_handler(messages: list[ScheduleMessageItem]): + for msg in messages: + # Print user input content + print(f"\n[scheduler] User input query: {msg.content}") + # Manually construct a new message with MEM_UPDATE label to trigger memory update + new_msg = msg.model_copy(update={"label": MEM_UPDATE_TASK_LABEL}) + # Submit the message to the scheduler for processing + mem_scheduler.submit_messages([new_msg]) + + +# Define custom memory update handler function +def custom_mem_update_handler(messages: list[ScheduleMessageItem]): + global working_memories + search_args = {} + top_k = 2 + for msg in messages: + # Search for memories relevant to the current content in text memory (return top_k=2) + results = mem_scheduler.retriever.search( + query=msg.content, + user_id=msg.user_id, + mem_cube_id=msg.mem_cube_id, + mem_cube=mem_scheduler.current_mem_cube, + top_k=top_k, + method=mem_scheduler.search_method, + search_args=search_args, + ) + working_memories.extend(results) + working_memories = working_memories[-5:] + for mem in results: + print(f"\n[scheduler] Retrieved memory: {mem.memory}") - mos_config.mem_reader.config.llm.config.api_key = auth_config.openai.api_key - mos_config.mem_reader.config.llm.config.api_base = auth_config.openai.base_url - mem_cube_config.text_mem.config.graph_db.config.uri = auth_config.graph_db.uri - mem_cube_config.text_mem.config.graph_db.config.user = auth_config.graph_db.user - mem_cube_config.text_mem.config.graph_db.config.password = auth_config.graph_db.password - mem_cube_config.text_mem.config.graph_db.config.db_name = auth_config.graph_db.db_name - mem_cube_config.text_mem.config.graph_db.config.auto_create = ( - auth_config.graph_db.auto_create - ) +async def run_with_scheduler(): + print("==== run_with_automatic_scheduler_init ====") + conversations, questions = init_task() - # Initialization - mos = MOS(mos_config) + # Initialization using server_router components + # Configs are loaded via environment variables in init_server() user_id = "user_1" - mos.create_user(user_id) - mem_cube_id = "mem_cube_5" - mem_cube_name_or_path = f"{BASE_DIR}/outputs/mem_scheduler/{user_id}/{mem_cube_id}" - if Path(mem_cube_name_or_path).exists(): - shutil.rmtree(mem_cube_name_or_path) - print(f"{mem_cube_name_or_path} is not empty, and has been removed.") + print(f"Adding conversations for user {user_id}...") - mem_cube = GeneralMemCube(mem_cube_config) - mem_cube.dump(mem_cube_name_or_path) - mos.register_mem_cube( - mem_cube_name_or_path=mem_cube_name_or_path, mem_cube_id=mem_cube_id, user_id=user_id + # Use add_handler to add memories + add_req = APIADDRequest( + user_id=user_id, + writable_cube_ids=[mem_cube_id], + messages=conversations, + async_mode="sync", # Use sync mode for immediate addition in this example ) - - mos.add(conversations, user_id=user_id, mem_cube_id=mem_cube_id) - mos.mem_scheduler.current_mem_cube = mem_cube + add_handler.handle_add_memories(add_req) for item in questions: print("===== Chat Start =====") query = item["question"] print(f"Query:\n {query}\n") - response = mos.chat(query=query, user_id=user_id) - print(f"Answer:\n {response}\n") - mos.mem_scheduler.stop() + # Use chat_handler to chat + chat_req = ChatPlaygroundRequest( + user_id=user_id, + query=query, + readable_cube_ids=[mem_cube_id], + writable_cube_ids=[mem_cube_id], + ) + response = chat_stream_playground(chat_req) + + answer = "" + buffer = "" + async for chunk in response.body_iterator: + if isinstance(chunk, bytes): + chunk = chunk.decode("utf-8") + buffer += chunk + while "\n\n" in buffer: + msg, buffer = buffer.split("\n\n", 1) + for line in msg.split("\n"): + if line.startswith("data: "): + json_str = line[6:] + try: + data = json.loads(json_str) + if data.get("type") == "text": + answer += data["data"] + except json.JSONDecodeError: + pass + print(f"\nAnswer: {answer}") if __name__ == "__main__": - run_with_scheduler_init() + mem_scheduler.register_handlers( + { + QUERY_TASK_LABEL: custom_query_handler, # Query task + MEM_UPDATE_TASK_LABEL: custom_mem_update_handler, # Memory update task + } + ) + + asyncio.run(run_with_scheduler()) + + time.sleep(20) + mem_scheduler.stop() diff --git a/examples/mem_scheduler/memos_w_scheduler_for_test.py b/examples/mem_scheduler/memos_w_scheduler_for_test.py deleted file mode 100644 index 2e135f127..000000000 --- a/examples/mem_scheduler/memos_w_scheduler_for_test.py +++ /dev/null @@ -1,88 +0,0 @@ -import json -import shutil -import sys - -from pathlib import Path - -from memos_w_scheduler import init_task - -from memos.configs.mem_cube import GeneralMemCubeConfig -from memos.configs.mem_os import MOSConfig -from memos.configs.mem_scheduler import AuthConfig -from memos.log import get_logger -from memos.mem_cube.general import GeneralMemCube -from memos.mem_scheduler.analyzer.mos_for_test_scheduler import MOSForTestScheduler - - -FILE_PATH = Path(__file__).absolute() -BASE_DIR = FILE_PATH.parent.parent.parent -sys.path.insert(0, str(BASE_DIR)) - -# Enable execution from any working directory - -logger = get_logger(__name__) - -if __name__ == "__main__": - # set up data - conversations, questions = init_task() - - # set configs - mos_config = MOSConfig.from_yaml_file( - f"{BASE_DIR}/examples/data/config/mem_scheduler/memos_config_w_optimized_scheduler.yaml" - ) - - mem_cube_config = GeneralMemCubeConfig.from_yaml_file( - f"{BASE_DIR}/examples/data/config/mem_scheduler/mem_cube_config_neo4j.yaml" - ) - - # default local graphdb uri - if AuthConfig.default_config_exists(): - auth_config = AuthConfig.from_local_config() - - mos_config.mem_reader.config.llm.config.api_key = auth_config.openai.api_key - mos_config.mem_reader.config.llm.config.api_base = auth_config.openai.base_url - - mem_cube_config.text_mem.config.graph_db.config.uri = auth_config.graph_db.uri - mem_cube_config.text_mem.config.graph_db.config.user = auth_config.graph_db.user - mem_cube_config.text_mem.config.graph_db.config.password = auth_config.graph_db.password - mem_cube_config.text_mem.config.graph_db.config.db_name = auth_config.graph_db.db_name - mem_cube_config.text_mem.config.graph_db.config.auto_create = ( - auth_config.graph_db.auto_create - ) - - # Initialization - mos = MOSForTestScheduler(mos_config) - - user_id = "user_1" - mos.create_user(user_id) - - mem_cube_id = "mem_cube_5" - mem_cube_name_or_path = f"{BASE_DIR}/outputs/mem_scheduler/{user_id}/{mem_cube_id}" - - if Path(mem_cube_name_or_path).exists(): - shutil.rmtree(mem_cube_name_or_path) - print(f"{mem_cube_name_or_path} is not empty, and has been removed.") - - mem_cube = GeneralMemCube(mem_cube_config) - mem_cube.dump(mem_cube_name_or_path) - mos.register_mem_cube( - mem_cube_name_or_path=mem_cube_name_or_path, mem_cube_id=mem_cube_id, user_id=user_id - ) - mos.mem_scheduler.current_mem_cube = mem_cube - - mos.add(conversations, user_id=user_id, mem_cube_id=mem_cube_id) - - # Add interfering conversations - file_path = Path(f"{BASE_DIR}/examples/data/mem_scheduler/scene_data.json") - scene_data = json.load(file_path.open("r", encoding="utf-8")) - mos.add(scene_data[0], user_id=user_id, mem_cube_id=mem_cube_id) - mos.add(scene_data[1], user_id=user_id, mem_cube_id=mem_cube_id) - - for item in questions: - print("===== Chat Start =====") - query = item["question"] - print(f"Query:\n {query}\n") - response = mos.chat(query=query, user_id=user_id) - print(f"Answer:\n {response}\n") - - mos.mem_scheduler.stop() diff --git a/examples/mem_scheduler/quick_start_examples.py b/examples/mem_scheduler/quick_start_examples.py deleted file mode 100644 index 724663be6..000000000 --- a/examples/mem_scheduler/quick_start_examples.py +++ /dev/null @@ -1,312 +0,0 @@ -import json -import shutil -import sys -import uuid - -from pathlib import Path - -from transformers import DynamicCache - -from memos.configs.mem_cube import GeneralMemCubeConfig -from memos.configs.mem_os import MOSConfig -from memos.configs.memory import MemoryConfigFactory -from memos.mem_cube.general import GeneralMemCube -from memos.mem_os.main import MOS -from memos.mem_scheduler.schemas.message_schemas import ScheduleMessageItem -from memos.mem_scheduler.schemas.task_schemas import ( - ANSWER_TASK_LABEL, - MEM_UPDATE_TASK_LABEL, - QUERY_TASK_LABEL, -) -from memos.mem_scheduler.utils.db_utils import get_utc_now -from memos.mem_scheduler.utils.misc_utils import parse_yaml -from memos.memories.activation.item import KVCacheItem -from memos.memories.factory import MemoryFactory - - -FILE_PATH = Path(__file__).absolute() -BASE_DIR = FILE_PATH.parent.parent.parent -sys.path.insert(0, str(BASE_DIR)) # Enable execution from any working directory - - -def get_cache_info(cache): - if not cache: - return None - - num_layers = 0 - total_size_bytes = 0 - - if hasattr(cache, "layers"): - num_layers = len(cache.layers) - for layer in cache.layers: - if hasattr(layer, "key_cache") and layer.key_cache is not None: - total_size_bytes += layer.key_cache.nelement() * layer.key_cache.element_size() - if hasattr(layer, "value_cache") and layer.value_cache is not None: - total_size_bytes += layer.value_cache.nelement() * layer.value_cache.element_size() - - if hasattr(layer, "keys") and layer.keys is not None: - total_size_bytes += layer.keys.nelement() * layer.keys.element_size() - if hasattr(layer, "values") and layer.values is not None: - total_size_bytes += layer.values.nelement() * layer.values.element_size() - - elif hasattr(cache, "key_cache") and hasattr(cache, "value_cache"): - num_layers = len(cache.key_cache) - for k, v in zip(cache.key_cache, cache.value_cache, strict=False): - if k is not None: - total_size_bytes += k.nelement() * k.element_size() - if v is not None: - total_size_bytes += v.nelement() * v.element_size() - - return { - "num_layers": num_layers, - "size_bytes": total_size_bytes, - "size_mb": f"{total_size_bytes / (1024 * 1024):.2f} MB", - } - - -def serialize_item(obj): - if isinstance(obj, list): - return [serialize_item(x) for x in obj] - - if isinstance(obj, KVCacheItem): - return { - "id": obj.id, - "metadata": obj.metadata, - "records": obj.records.model_dump() - if hasattr(obj.records, "model_dump") - else obj.records, - "memory": get_cache_info(obj.memory), - } - - if isinstance(obj, DynamicCache): - return get_cache_info(obj) - - return str(obj) - - -def kv_cache_only(): - # 为 KVCacheMemory(HuggingFace 后端)创建配置 - config = MemoryConfigFactory( - backend="kv_cache", - config={ - "extractor_llm": { - "backend": "huggingface", - "config": { - "model_name_or_path": "Qwen/Qwen3-0.6B", - "max_tokens": 32, - "add_generation_prompt": True, - "remove_think_prefix": True, - }, - }, - }, - ) - - # 实例化 KVCacheMemory - kv_mem = MemoryFactory.from_config(config) - - # 提取一个 KVCacheItem(DynamicCache) - prompt = [ - {"role": "user", "content": "What is MemOS?"}, - {"role": "assistant", "content": "MemOS is a memory operating system for LLMs."}, - ] - print("===== Extract KVCacheItem =====") - cache_item = kv_mem.extract(prompt) - print(json.dumps(serialize_item(cache_item), indent=2, default=str)) - - # 将缓存添加到内存中 - kv_mem.add([cache_item]) - print("All caches:") - print(json.dumps(serialize_item(kv_mem.get_all()), indent=2, default=str)) - - # 通过 ID 获取 - retrieved = kv_mem.get(cache_item.id) - print("Retrieved:") - print(json.dumps(serialize_item(retrieved), indent=2, default=str)) - - # 合并缓存 - item2 = kv_mem.extract([{"role": "user", "content": "Tell me a joke."}]) - kv_mem.add([item2]) - merged = kv_mem.get_cache([cache_item.id, item2.id]) - print("Merged cache:") - print(json.dumps(serialize_item(merged), indent=2, default=str)) - - # 删除其中一个 - kv_mem.delete([cache_item.id]) - print("After delete:") - print(json.dumps(serialize_item(kv_mem.get_all()), indent=2, default=str)) - - # 导出和加载缓存 - kv_mem.dump("tmp/kv_mem") - print("Dumped to tmp/kv_mem") - kv_mem.delete_all() - kv_mem.load("tmp/kv_mem") - print("Loaded caches:") - print(json.dumps(serialize_item(kv_mem.get_all()), indent=2, default=str)) - - -def run_scheduler_example(): - # 使用 MemScheduler 加载主 MOS(Memory-Oriented System)配置文件 - config = parse_yaml( - f"{BASE_DIR}/examples/data/config/mem_scheduler/memos_config_w_scheduler.yaml" - ) - # 将解析出的配置字典传入 MOSConfig 构造器, 构建配置对象 - mos_config = MOSConfig(**config) - # 使用配置对象初始化 MOS 系统实例 - mos = MOS(mos_config) - - # 生成一个唯一的动态用户 ID(使用 UUID4) - user_id = str(uuid.uuid4()) - # 在 MOS 系统中为该用户创建账户 - mos.create_user(user_id=user_id) - - # 从 YAML 文件加载 MemCube(记忆立方体)的通用配置 - config = GeneralMemCubeConfig.from_yaml_file( - f"{BASE_DIR}/examples/data/config/mem_scheduler/mem_cube_config.yaml" - ) - # 定义 MemCube 的唯一标识符 - mem_cube_id = "mem_cube_5" - # 定义 MemCube 的本地存储路径(路径中包含用户 ID 和 MemCube ID) - mem_cube_name_or_path = f"{BASE_DIR}/outputs/mem_scheduler/{user_id}/{mem_cube_id}" - - # 如果该路径已存在, 则先删除旧目录 - if Path(mem_cube_name_or_path).exists(): - shutil.rmtree(mem_cube_name_or_path) - print(f"{mem_cube_name_or_path} 目录非空,已被删除。") - - # 根据加载的配置创建一个新的 MemCube 实例 - mem_cube = GeneralMemCube(config) - # 将该 MemCube 实例序列化并保存到指定路径 - mem_cube.dump(mem_cube_name_or_path) - - # 在 MOS 系统中为当前用户注册这个 MemCube - mos.register_mem_cube( - mem_cube_name_or_path=mem_cube_name_or_path, mem_cube_id=mem_cube_id, user_id=user_id - ) - - # 定义一个辅助函数, 用于获取缓存(如 KV Cache)的内存信息 - def get_cache_info(cache): - # 如果缓存为空, 则直接返回 None - if not cache: - return None - - num_layers = 0 # 记录缓存的层数 - total_size_bytes = 0 # 记录总字节数 - - # 情况一: 缓存结构包含 layers 属性(如 HuggingFace 的缓存格式) - if hasattr(cache, "layers"): - num_layers = len(cache.layers) - for layer in cache.layers: - # 统计 key_cache 的内存占用(如果存在) - if hasattr(layer, "key_cache") and layer.key_cache is not None: - total_size_bytes += layer.key_cache.nelement() * layer.key_cache.element_size() - # 统计 value_cache 的内存占用(如果存在) - if hasattr(layer, "value_cache") and layer.value_cache is not None: - total_size_bytes += ( - layer.value_cache.nelement() * layer.value_cache.element_size() - ) - - # 兼容其他可能的缓存命名方式(如 keys/values) - if hasattr(layer, "keys") and layer.keys is not None: - total_size_bytes += layer.keys.nelement() * layer.keys.element_size() - if hasattr(layer, "values") and layer.values is not None: - total_size_bytes += layer.values.nelement() * layer.values.element_size() - - # 情况二: 缓存结构直接包含 key_cache 和 value_cache 列表(如某些自定义格式) - elif hasattr(cache, "key_cache") and hasattr(cache, "value_cache"): - num_layers = len(cache.key_cache) - for k, v in zip(cache.key_cache, cache.value_cache, strict=False): - if k is not None: - total_size_bytes += k.nelement() * k.element_size() - if v is not None: - total_size_bytes += v.nelement() * v.element_size() - - # 返回结构化的缓存信息, 包括层数, 字节数和以 MB 为单位的可读格式 - return { - "num_layers": num_layers, - "size_bytes": total_size_bytes, - "size_mb": f"{total_size_bytes / (1024 * 1024):.2f} MB", - } - - # 定义自定义的查询(query)处理函数 - def custom_query_handler(messages: list[ScheduleMessageItem]): - for msg in messages: - # 打印用户输入内容 - print(f"\n[scheduler] 用户输入了查询:{msg.content}") - # 手动构造一个带有 MEM_UPDATE 标签的新消息, 用于触发记忆更新 - new_msg = msg.model_copy(update={"label": MEM_UPDATE_TASK_LABEL}) - # 将该消息提交给调度器处理 - mos.mem_scheduler.submit_messages([new_msg]) - - # 定义自定义的回答(answer)处理函数 - def custom_answer_handler(messages: list[ScheduleMessageItem]): - for msg in messages: - # 打印 LLM 的回复内容 - print(f"\n[scheduler] LLM 回复了答案:{msg.content}") - - # 定义自定义的记忆更新(mem_update)处理函数 - def custom_mem_update_handler(messages: list[ScheduleMessageItem]): - for msg in messages: - mem_cube = mos.mem_cubes.get(msg.mem_cube_id) - kv_mem = mem_cube.act_mem - # 如果该 MemCube 配置了文本记忆(TreeTextMemory / NaiveTextMemory) - if mem_cube and mem_cube.text_mem: - # 在文本记忆中搜索与当前内容相关的记忆(返回 top_k=3 条) - results = mem_cube.text_mem.search(msg.content, top_k=3) - for mem in results: - print(f"\n[scheduler] 检索到的记忆:{mem.memory}") - print("\n[scheduler] 转换为激活记忆......") - # 从文本记忆中提取对应的 KV 缓存项 - cache_item = kv_mem.extract(mem.memory) - # 附加元信息 - cache_item.records.text_memories = [mem.memory] - cache_item.records.timestamp = get_utc_now() - # 将该缓存项添加到激活记忆中 - kv_mem.add([cache_item]) - print("\n[scheduler] 完成!") - - # 将上述三个自定义处理器注册到调度器的分发器中, 分别对应不同任务标签 - mos.mem_scheduler.dispatcher.register_handlers( - { - QUERY_TASK_LABEL: custom_query_handler, # 查询任务 - ANSWER_TASK_LABEL: custom_answer_handler, # 回答任务 - MEM_UPDATE_TASK_LABEL: custom_mem_update_handler, # 记忆更新任务 - } - ) - - # 初始添加两条测试消息(用户和助手的对话)到系统中 - messages = [ - {"role": "user", "content": "I like playing football."}, - {"role": "assistant", "content": "I like playing football too."}, - ] - mos.add(messages, user_id=user_id, mem_cube_id=mem_cube_id) - - # 进入聊天循环: 展示 TreeTextMemory 的记忆节点结构 + KV Cache 的状态 - while True: - # 获取用户输入并去除首尾空格 - user_input = input("👤 [You] ").strip() - print() - # 调用 MOS 系统进行聊天响应 - response = mos.chat(user_input, user_id=user_id) - # 获取该用户当前 MemCube 中的所有记忆内容 - retrieved_memories = mos.get_all(mem_cube_id=mem_cube_id, user_id=user_id) - - # 打印助手的回复 - print(f"🤖 [Assistant] {response}") - - # 获取文本记忆部分 - TreeTextMemory - memories = retrieved_memories["text_mem"][0]["memories"] - for mem in memories: - print(f"[文本记忆] {mem.memory}") - - # 获取对应的 MemCube 和其激活记忆(KV Cache) - mem_cube = mos.mem_scheduler.mem_cube - kv_mem = mem_cube.act_mem - # 遍历所有激活记忆项, 打印其缓存信息和记录 - for cache_item in kv_mem.get_all(): - print(f"[激活记忆] {get_cache_info(cache_item.memory)} (记录:{cache_item.records})") - - -if __name__ == "__main__": - kv_cache_only() - - run_scheduler_example() diff --git a/examples/mem_scheduler/rabbitmq_example.py b/examples/mem_scheduler/rabbitmq_example.py deleted file mode 100644 index 5e40eaad5..000000000 --- a/examples/mem_scheduler/rabbitmq_example.py +++ /dev/null @@ -1,60 +0,0 @@ -import threading -import time - -from memos.configs.mem_scheduler import AuthConfig -from memos.mem_scheduler.webservice_modules.rabbitmq_service import RabbitMQSchedulerModule - - -def publish_message(rabbitmq_module, message): - """Function to publish a message.""" - rabbitmq_module.rabbitmq_publish_message(message) - print(f"Published message: {message}\n") - - -def main(): - # Initialize RabbitMQ module - rabbitmq_module = RabbitMQSchedulerModule() - rabbitmq_module.rabbit_queue_name = "test" - - # Initialize from configuration dictionary - if not AuthConfig.default_config_exists(): - print("Please set configs for rabbitmq.") - return - else: - rabbitmq_module.initialize_rabbitmq(config=AuthConfig.from_local_config().rabbitmq) - - try: - rabbitmq_module.wait_for_connection_ready() - - # === Publish some test messages === - # List to hold thread references - threads = [] - - # Publish some test messages using multiple threads - for i in range(3): - message = {"type": "test", "data": f"Message {i}", "timestamp": time.time()} - thread = threading.Thread(target=publish_message, args=(rabbitmq_module, message)) - thread.start() - threads.append(thread) - - # Start consumer - rabbitmq_module.rabbitmq_start_consuming() - - # Join threads to ensure all messages are published before proceeding - for thread in threads: - thread.join() - - except KeyboardInterrupt: - print("\nProgram interrupted by user") - - finally: - # Give some time for cleanup - time.sleep(3) - - # Close connections - rabbitmq_module.rabbitmq_close() - print("RabbitMQ connection closed") - - -if __name__ == "__main__": - main() diff --git a/examples/mem_scheduler/redis_example.py b/examples/mem_scheduler/redis_example.py index be6f20bed..9f7ca4139 100644 --- a/examples/mem_scheduler/redis_example.py +++ b/examples/mem_scheduler/redis_example.py @@ -1,5 +1,5 @@ -import asyncio import sys +import time from datetime import datetime from pathlib import Path @@ -64,7 +64,7 @@ def service_run(): print( f"Added: {res}", ) - asyncio.sleep(0.5) + time.sleep(0.5) mem_scheduler.redis_stop_listening() diff --git a/examples/mem_scheduler/scheduler_for_async_tasks.py b/examples/mem_scheduler/run_async_tasks.py similarity index 100% rename from examples/mem_scheduler/scheduler_for_async_tasks.py rename to examples/mem_scheduler/run_async_tasks.py diff --git a/examples/mem_scheduler/show_redis_status.py b/examples/mem_scheduler/show_redis_status.py index 04e79ca97..d88e86655 100644 --- a/examples/mem_scheduler/show_redis_status.py +++ b/examples/mem_scheduler/show_redis_status.py @@ -7,50 +7,46 @@ queue = mem_scheduler.memos_message_queue.memos_message_queue -def fetch_status(queue: SchedulerRedisQueue) -> dict[str, dict[str, int]]: +def fetch_status( + queue: SchedulerRedisQueue, stream_key_prefix: str | None = None +) -> dict[str, dict[str, int]]: """Fetch and print per-user Redis queue status using built-in API. - Returns a dict mapping user_id -> {"pending": int, "remaining": int}. + Returns a dict mapping user_id -> {"remaining": int}. """ # This method will also print a summary and per-user counts. - return queue.show_task_status() + return queue.show_task_status(stream_key_prefix=stream_key_prefix) def print_diff(prev: dict[str, dict[str, int]], curr: dict[str, dict[str, int]]) -> None: """Print aggregated totals and per-user changes compared to previous snapshot.""" ts = time.strftime("%Y-%m-%d %H:%M:%S") - tot_p_prev = sum(v.get("pending", 0) for v in prev.values()) if prev else 0 tot_r_prev = sum(v.get("remaining", 0) for v in prev.values()) if prev else 0 - tot_p_curr = sum(v.get("pending", 0) for v in curr.values()) tot_r_curr = sum(v.get("remaining", 0) for v in curr.values()) - dp_tot = tot_p_curr - tot_p_prev dr_tot = tot_r_curr - tot_r_prev - print(f"[{ts}] Total pending={tot_p_curr} ({dp_tot:+d}), remaining={tot_r_curr} ({dr_tot:+d})") + print(f"[{ts}] Total remaining={tot_r_curr} ({dr_tot:+d})") # Print per-user deltas (current counts are already printed by show_task_status) all_uids = sorted(set(prev.keys()) | set(curr.keys())) for uid in all_uids: - p_prev = prev.get(uid, {}).get("pending", 0) r_prev = prev.get(uid, {}).get("remaining", 0) - p_curr = curr.get(uid, {}).get("pending", 0) r_curr = curr.get(uid, {}).get("remaining", 0) - dp = p_curr - p_prev dr = r_curr - r_prev # Only print when there is any change to reduce noise - if dp != 0 or dr != 0: - print(f" Δ {uid}: pending={dp:+d}, remaining={dr:+d}") + if dr != 0: + print(f" Δ {uid}: remaining={dr:+d}") # Note: queue.show_task_status() handles printing per-user counts internally. -def main(interval_sec: float = 5.0) -> None: +def main(interval_sec: float = 5.0, stream_key_prefix: str | None = None) -> None: prev: dict[str, dict[str, int]] = {} while True: try: - curr = fetch_status(queue) + curr = fetch_status(queue, stream_key_prefix=stream_key_prefix) print_diff(prev, curr) print(f"stream_cache ({len(queue._stream_keys_cache)}): {queue._stream_keys_cache}") prev = curr @@ -64,4 +60,11 @@ def main(interval_sec: float = 5.0) -> None: if __name__ == "__main__": - main() + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument("--interval", type=float, default=1.0) + parser.add_argument("--prefix", type=str, default=None) + args = parser.parse_args() + + main(interval_sec=args.interval, stream_key_prefix=args.prefix) diff --git a/examples/mem_scheduler/task_fair_schedule.py b/examples/mem_scheduler/task_fair_schedule.py deleted file mode 100644 index 8b02b1931..000000000 --- a/examples/mem_scheduler/task_fair_schedule.py +++ /dev/null @@ -1,87 +0,0 @@ -import sys - -from collections import defaultdict -from pathlib import Path - -from memos.api.routers.server_router import mem_scheduler -from memos.mem_scheduler.schemas.message_schemas import ScheduleMessageItem - - -FILE_PATH = Path(__file__).absolute() -BASE_DIR = FILE_PATH.parent.parent.parent -sys.path.insert(0, str(BASE_DIR)) - - -def make_message(user_id: str, mem_cube_id: str, label: str, idx: int | str) -> ScheduleMessageItem: - return ScheduleMessageItem( - item_id=f"{user_id}:{mem_cube_id}:{label}:{idx}", - user_id=user_id, - mem_cube_id=mem_cube_id, - label=label, - content=f"msg-{idx} for {user_id}/{mem_cube_id}/{label}", - ) - - -def seed_messages_for_test_fairness(queue, combos, per_stream): - # send overwhelm message by one user - (u, c, label) = combos[0] - task_target = 100 - print(f"{u}:{c}:{label} submit {task_target} messages") - for i in range(task_target): - msg = make_message(u, c, label, f"overwhelm_{i}") - queue.submit_messages(msg) - - for u, c, label in combos: - print(f"{u}:{c}:{label} submit {per_stream} messages") - for i in range(per_stream): - msg = make_message(u, c, label, i) - queue.submit_messages(msg) - print("======= seed_messages Done ===========") - - -def count_by_stream(messages): - counts = defaultdict(int) - for m in messages: - key = f"{m.user_id}:{m.mem_cube_id}:{m.label}" - counts[key] += 1 - return counts - - -def run_fair_redis_schedule(batch_size: int = 3): - print("=== Redis Fairness Demo ===") - print(f"use_redis_queue: {mem_scheduler.use_redis_queue}") - mem_scheduler.consume_batch = batch_size - queue = mem_scheduler.memos_message_queue - - # Isolate and clear queue - queue.clear() - - # Define multiple streams: (user_id, mem_cube_id, task_label) - combos = [ - ("u1", "u1", "labelX"), - ("u1", "u1", "labelY"), - ("u2", "u2", "labelX"), - ("u2", "u2", "labelY"), - ] - per_stream = 5 - - # Seed messages evenly across streams - seed_messages_for_test_fairness(queue, combos, per_stream) - - # Compute target batch size (fair split across streams) - print(f"Request batch_size={batch_size} for {len(combos)} streams") - - for _ in range(len(combos)): - # Fetch one brokered pack - msgs = queue.get_messages(batch_size=batch_size) - print(f"Fetched {len(msgs)} messages in first pack") - - # Check fairness: counts per stream - counts = count_by_stream(msgs) - for k in sorted(counts): - print(f"{k}: {counts[k]}") - - -if __name__ == "__main__": - # task 1 fair redis schedule - run_fair_redis_schedule() diff --git a/src/memos/api/config.py b/src/memos/api/config.py index daf9b6cfe..204b0961c 100644 --- a/src/memos/api/config.py +++ b/src/memos/api/config.py @@ -23,7 +23,7 @@ # Load environment variables -load_dotenv() +load_dotenv(override=True) logger = logging.getLogger(__name__) diff --git a/src/memos/api/start_api.py b/src/memos/api/start_api.py index cbcdf6ce2..24a36f017 100644 --- a/src/memos/api/start_api.py +++ b/src/memos/api/start_api.py @@ -20,7 +20,7 @@ logger = logging.getLogger(__name__) # Load environment variables -load_dotenv() +load_dotenv(override=True) T = TypeVar("T") diff --git a/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py b/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py index 1c9683542..d570dccdd 100644 --- a/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py +++ b/src/memos/mem_scheduler/task_schedule_modules/redis_queue.py @@ -983,34 +983,21 @@ def qsize(self) -> dict: logger.error(f"Failed to get Redis queue size: {e}", stack_info=True) return {} - def show_task_status(self) -> dict[str, dict[str, int]]: - stream_keys = self.get_stream_keys(stream_key_prefix=self.stream_key_prefix) + def show_task_status(self, stream_key_prefix: str | None = None) -> dict[str, dict[str, int]]: + effective_prefix = ( + stream_key_prefix if stream_key_prefix is not None else self.stream_key_prefix + ) + stream_keys = self.get_stream_keys(stream_key_prefix=effective_prefix) if not stream_keys: - logger.info("No Redis streams found for the configured prefix") + logger.info(f"No Redis streams found for the configured prefix: {effective_prefix}") return {} - consumer_group = self.consumer_group or "scheduler_group" - grouped: dict[str, dict[str, int]] = {} for sk in stream_keys: uid = sk if uid not in grouped: - grouped[uid] = {"pending": 0, "remaining": 0} - - # Pending count via XPENDING - pending_count = 0 - try: - pending_info = self._redis_conn.xpending(sk, consumer_group) - # redis-py may return a tuple-like [count, ...] - if pending_info: - try: - pending_count = int(pending_info[0]) - except Exception: - # Fallback if structure differs - pending_count = int(getattr(pending_info, "count", 0) or 0) - except Exception as e: - logger.debug(f"XPENDING failed for '{sk}': {e}") + grouped[uid] = {"remaining": 0} # Remaining count via XLEN remaining_count = 0 @@ -1019,20 +1006,16 @@ def show_task_status(self) -> dict[str, dict[str, int]]: except Exception as e: logger.debug(f"XLEN failed for '{sk}': {e}") - grouped[uid]["pending"] += pending_count grouped[uid]["remaining"] += remaining_count # Pretty-print summary try: - total_pending = sum(v.get("pending", 0) for v in grouped.values()) total_remaining = sum(v.get("remaining", 0) for v in grouped.values()) - header = f"Task Queue Status by user_id | pending={total_pending}, remaining={total_remaining}" + header = f"Task Queue Status by user_id | remaining={total_remaining}" print(header) for uid in sorted(grouped.keys()): counts = grouped[uid] - print( - f"- {uid}: pending={counts.get('pending', 0)}, remaining={counts.get('remaining', 0)}" - ) + print(f"- {uid}: remaining={counts.get('remaining', 0)}") except Exception: # Printing is best-effort; return grouped regardless pass From 78ca96c2d2f9f3a2c73e7e9ff2979601c6f6a5b7 Mon Sep 17 00:00:00 2001 From: Dubberman <48425266+whipser030@users.noreply.github.com> Date: Thu, 15 Jan 2026 20:40:12 +0800 Subject: [PATCH 33/53] fix:feedback mute pref (#876) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feedback mute pref * mute pref feedback --------- Co-authored-by: 黑布林 <11641432+heiheiyouyou@user.noreply.gitee.com> --- src/memos/mem_feedback/feedback.py | 14 +++++++++----- src/memos/mem_feedback/simple_feedback.py | 2 ++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/memos/mem_feedback/feedback.py b/src/memos/mem_feedback/feedback.py index 15d7c336a..da3324572 100644 --- a/src/memos/mem_feedback/feedback.py +++ b/src/memos/mem_feedback/feedback.py @@ -95,6 +95,7 @@ def __init__(self, config: MemFeedbackConfig): self.searcher: Searcher = None self.reranker = None self.pref_mem: SimplePreferenceTextMemory = None + self.pref_feedback: bool = False self.DB_IDX_READY = False @require_python_package( @@ -629,11 +630,14 @@ def _retrieve(self, query: str, info=None, top_k=20, user_name=None): ) retrieved_mems = [item[0] for item in retrieved_mems if float(item[1]) > 0.01] - pref_info = {} - if "user_id" in info: - pref_info = {"user_id": info["user_id"]} - retrieved_prefs = self.pref_mem.search(query, top_k, pref_info) - return retrieved_mems + retrieved_prefs + if self.pref_feedback: + pref_info = {} + if "user_id" in info: + pref_info = {"user_id": info["user_id"]} + retrieved_prefs = self.pref_mem.search(query, top_k, pref_info) + return retrieved_mems + retrieved_prefs + else: + return retrieved_mems def _vec_query(self, new_memories_embedding: list[float], user_name=None): """Vector retrieval query""" diff --git a/src/memos/mem_feedback/simple_feedback.py b/src/memos/mem_feedback/simple_feedback.py index e32f939c7..2ac0a0a39 100644 --- a/src/memos/mem_feedback/simple_feedback.py +++ b/src/memos/mem_feedback/simple_feedback.py @@ -25,6 +25,7 @@ def __init__( searcher: Searcher, reranker: BaseReranker, pref_mem: SimplePreferenceTextMemory, + pref_feedback: bool = False, ): self.llm = llm self.embedder = embedder @@ -36,3 +37,4 @@ def __init__( self.pref_mem = pref_mem self.reranker = reranker self.DB_IDX_READY = False + self.pref_feedback = pref_feedback From 51a98ebc3017d28a5118eae1b33a2b8d8fa8a63f Mon Sep 17 00:00:00 2001 From: Wenqiang Wei <46308778+endxxxx@users.noreply.github.com> Date: Fri, 16 Jan 2026 14:22:16 +0800 Subject: [PATCH 34/53] =?UTF-8?q?examples=20update=20from=20tree=5Ftextual?= =?UTF-8?q?=5Fmemories=20and=20preference=5Ftextual=5Fmem=E2=80=A6=20(#872?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit examples update from tree_textual_memories and preference_textual_memories --- examples/core_memories/pref_textual_memory.py | 192 ++++++++++++++++++ examples/core_memories/tree_textual_memory.py | 28 +++ examples/data/config/preference_config.json | 53 +++++ .../config/tree_config_shared_database.json | 3 +- 4 files changed, 275 insertions(+), 1 deletion(-) create mode 100644 examples/core_memories/pref_textual_memory.py create mode 100644 examples/data/config/preference_config.json diff --git a/examples/core_memories/pref_textual_memory.py b/examples/core_memories/pref_textual_memory.py new file mode 100644 index 000000000..ca9d471b9 --- /dev/null +++ b/examples/core_memories/pref_textual_memory.py @@ -0,0 +1,192 @@ +import time + +from memos import log +from memos.configs.memory import PreferenceTextMemoryConfig +from memos.memories.textual.preference import PreferenceTextMemory + + +logger = log.get_logger(__name__) + +preference_config = PreferenceTextMemoryConfig.from_json_file( + "examples/data/config/preference_config.json" +) +my_preference_textual_memory = PreferenceTextMemory(preference_config) +my_preference_textual_memory.delete_all() + + +scene_data = [ + [ + {"role": "user", "chat_time": "3 May 2025", "content": "I’m feeling a bit down today."}, + { + "role": "assistant", + "chat_time": "3 May 2025", + "content": "I’m sorry to hear that. Do you want to talk about what’s been going on?", + }, + { + "role": "user", + "chat_time": "3 May 2025", + "content": "It’s just been a tough couple of days, you know? Everything feels a bit overwhelming, and I just can’t seem to shake it off.", + }, + { + "role": "assistant", + "chat_time": "3 May 2025", + "content": "It sounds like you're going through a lot right now. Sometimes it helps to talk things out. Is there something specific that's been weighing on you, or is it more of a general feeling?", + }, + { + "role": "user", + "chat_time": "3 May 2025", + "content": "It’s a mix, I guess. Work’s been really stressful, and on top of that, I’ve been feeling kinda disconnected from the people around me.", + }, + { + "role": "assistant", + "chat_time": "3 May 2025", + "content": "That can be really draining, especially when you’re feeling isolated on top of the stress. Do you think there’s something from your past that’s contributing to how you’re feeling now? Sometimes our emotions are tied to older experiences.", + }, + { + "role": "user", + "chat_time": "3 May 2025", + "content": "Yeah, now that you mention it… I’ve been thinking a lot about my childhood lately. I didn’t have the easiest upbringing. My parents were always busy, and I often felt like I had to figure things out on my own. I remember one winter, I got really sick with a high fever. My parents were both working, and I didn’t want to bother them. I just lay in bed, crying by myself, not knowing what to do.", + }, + { + "role": "assistant", + "chat_time": "3 May 2025", + "content": "That must have been very lonely. Growing up without that support can really make you feel like you have to handle everything on your own. How do you think that experience has affected you now?", + }, + { + "role": "user", + "chat_time": "3 May 2025", + "content": "Yeah, it was really lonely. I remember spending a lot of time doing things on my own, like drawing, because it was my only way to escape. I used to draw animals, and I created my own little world on paper. It was peaceful in a way, just me and my imagination, with no outside distractions.", + }, + { + "role": "assistant", + "chat_time": "3 May 2025", + "content": "Drawing sounds like a beautiful way to express yourself and find some peace in that solitude. It must have been a very quiet and private world for you. Do you think that sense of loneliness from back then has shaped how you connect with others today?", + }, + { + "role": "user", + "chat_time": "3 May 2025", + "content": "I think it has. I’ve always found it hard to let others in. I feel like I have to handle everything on my own. If I rely on someone else, I feel vulnerable, and I start to feel that loneliness again.", + }, + { + "role": "assistant", + "chat_time": "3 May 2025", + "content": "It sounds like this was a protective mechanism that helped you cope with your feelings of loneliness back then. But as you’ve grown, it seems like this pattern might not be serving you as well anymore. Have you thought about trying to break this cycle, or finding new ways to connect with others?", + }, + { + "role": "user", + "chat_time": "3 May 2025", + "content": "I’ve thought about it, though it’s hard. But I also know I can’t keep going like this forever. Maybe it’s time to seek some help.", + }, + { + "role": "assistant", + "chat_time": "3 May 2025", + "content": "It’s a big step, but a positive one. Exploring your emotions and past experiences could really help you understand how they’ve shaped your present. Therapy could be a great place to start, as it would help you connect with both yourself and others. Would you be open to trying it?", + }, + { + "role": "user", + "chat_time": "3 May 2025", + "content": "I’m open to trying. Thank you for encouraging me. It feels like it might be a good starting point for me.", + }, + { + "role": "assistant", + "chat_time": "3 May 2025", + "content": "I’m really glad to hear that. Taking that first step is always difficult, but you’ve made an important decision. If you need help finding the right therapist, or just want to talk, I’m here for you.", + }, + ], + [ + { + "role": "user", + "chat_time": "3 May 2025", + "content": "This week I’ve been feeling a bit off, especially when playing tennis. My body just doesn’t feel right.", + }, + { + "role": "assistant", + "chat_time": "3 May 2025", + "content": "It sounds like you've been having some physical discomfort lately. Where specifically are you feeling unwell? Is there something particular about tennis that's been difficult?", + }, + { + "role": "user", + "chat_time": "3 May 2025", + "content": "I just feel a bit fatigued, and every time I play tennis, my movements feel off. I used to play pretty well, but lately, I’ve been feeling weak and my movements aren’t as coordinated as they used to be.", + }, + { + "role": "assistant", + "chat_time": "3 May 2025", + "content": "Physical discomfort can definitely affect performance, especially in a sport like tennis that requires quick reactions and coordination. Have you noticed anything specific that might be causing these changes? Could it be overtraining, or is there another physical issue making you feel off?", + }, + { + "role": "user", + "chat_time": "3 May 2025", + "content": "I think it might be due to stress and lack of sleep recently. I just feel drained all the time. Plus, I’ve been frustrated with my tennis performance, which makes me feel even worse, like I’m stuck in a vicious cycle.", + }, + { + "role": "assistant", + "chat_time": "3 May 2025", + "content": "Stress and poor sleep quality can definitely affect your physical performance, especially in sports. When you’re also feeling down about your performance, it’s easy to fall into a negative cycle. Have you tried anything to relieve some of the stress, or to improve your sleep?", + }, + { + "role": "user", + "chat_time": "3 May 2025", + "content": "I’ve tried some relaxation techniques, like deep breathing and simple meditation, but it doesn’t seem to help much. I still can’t focus during tennis, and I feel like my mind is distracted by other things.", + }, + { + "role": "assistant", + "chat_time": "3 May 2025", + "content": "Relaxation techniques like deep breathing and meditation can help reduce stress, but sometimes we need a more structured approach to improve both our physical and mental state. For example, you might want to focus on specific aspects of your tennis training, or adjust your rest and recovery time. Have you thought about setting smaller goals for yourself? Like focusing on a specific tennis move each day, rather than expecting perfection right away? That might help you gradually regain confidence.", + }, + { + "role": "user", + "chat_time": "3 May 2025", + "content": "That’s a good idea. I think I’ve been expecting too much from myself, which just makes me more anxious. Maybe I can start with small practice sessions and gradually find my rhythm again.", + }, + { + "role": "assistant", + "chat_time": "3 May 2025", + "content": "Exactly! Setting small and clear goals will help reduce pressure and give you a sense of accomplishment. And don’t forget that rest is just as important—taking time to recover will help you feel better physically and mentally. Both physical and mental recovery are key to improving your performance and health.", + }, + { + "role": "user", + "chat_time": "3 May 2025", + "content": "Thanks, I feel like I need to rethink a few things. Maybe I really need to be kinder to myself and take things step by step.", + }, + { + "role": "assistant", + "chat_time": "3 May 2025", + "content": "You’re on the right track. Rethinking things and giving yourself space and patience is so important. You’ve already taken the first step, now just keep moving forward, one step at a time. If you need anything, I’m always here to help.", + }, + ], +] + +memories = my_preference_textual_memory.get_memory( + scene_data, type="chat", info={"user_id": "1234", "session_id": "2222"} +) + +added_ids = my_preference_textual_memory.add(memories) + +time.sleep(10) + +init_time = time.time() +# search preference memories +results = my_preference_textual_memory.search("Talk about childhood story of the user", top_k=10) + +for i, r in enumerate(results): + r = r.to_dict() + print(f"{i}'th similar result is: " + str(r["memory"])) +print(f"Successfully search {len(results)} memories in {round(time.time() - init_time)}s") + +# get all preference memories +all_preference_memories = my_preference_textual_memory.get_all() +for key, value in all_preference_memories.items(): + for i, m in enumerate(value): + print(f"{i}'th {key} memory is: " + str(m.memory)) + +# use filter to get all implicit preference memories +all_implicit_memories = my_preference_textual_memory.get_memory_by_filter( + {"preference_type": "implicit_preference"} +) +for i, m in enumerate(all_implicit_memories[0]): + print(f"{i}'th filtered memory is: " + str(m.memory)) + +# dump preference memories +dumped_memories_dir = "tmp/my_preference_textual_memory" +my_preference_textual_memory.dump(dumped_memories_dir) diff --git a/examples/core_memories/tree_textual_memory.py b/examples/core_memories/tree_textual_memory.py index d2e197e5b..641335495 100644 --- a/examples/core_memories/tree_textual_memory.py +++ b/examples/core_memories/tree_textual_memory.py @@ -3,6 +3,7 @@ from memos import log from memos.configs.mem_reader import SimpleStructMemReaderConfig from memos.configs.memory import TreeTextMemoryConfig +from memos.mem_reader.multi_modal_struct import MultiModalStructMemReader from memos.mem_reader.simple_struct import SimpleStructMemReader from memos.memories.textual.tree import TreeTextMemory @@ -240,6 +241,33 @@ top_k=30, info={"query": "Tell me about what memos consist of?", "user_id": "111", "session": "2234"}, ) + +for i, r in enumerate(results): + r = r.to_dict() + print(f"{i}'th similar result is: " + str(r["memory"])) +print(f"Successfully search {len(results)} memories") + +logger.info("start multi-modal memory search example...") + +multi_modal_reader = MultiModalStructMemReader(reader_config) +doc_paths = ["examples/data/one_page_example.pdf"] +multi_modal_memory = multi_modal_reader.get_memory( + doc_paths, "doc", info={"user_id": "1111", "session_id": "2222"} +) + +for m_list in multi_modal_memory: + added_ids = my_tree_textual_memory.add(m_list) + my_tree_textual_memory.memory_manager.wait_reorganizer() + +results = my_tree_textual_memory.search( + "Give me one poem from Tagore's 'Stray birds'", + top_k=30, + info={ + "query": "Give me one poem from Tagore's 'Stray birds'", + "user_id": "111", + "session": "2234", + }, +) for i, r in enumerate(results): r = r.to_dict() print(f"{i}'th similar result is: " + str(r["memory"])) diff --git a/examples/data/config/preference_config.json b/examples/data/config/preference_config.json new file mode 100644 index 000000000..4db7475a0 --- /dev/null +++ b/examples/data/config/preference_config.json @@ -0,0 +1,53 @@ +{ + "extractor_llm": { + "backend": "ollama", + "config": { + "model_name_or_path": "qwen3:0.6b", + "temperature": 0.0, + "remove_think_prefix": true, + "max_tokens": 8192 + } + }, + "vector_db": { + "backend": "milvus", + "config": { + "collection_name": [ + "explicit_preference", + "implicit_preference" + ], + "vector_dimension": 768, + "distance_metric": "cosine", + "uri": "./milvus_demo.db" + } + }, + "embedder": { + "backend": "ollama", + "config": { + "model_name_or_path": "nomic-embed-text:latest" + } + }, + "reranker": { + "backend": "cosine_local", + "config": { + "level_weights": { + "topic": 1.0, + "concept": 1.0, + "fact": 1.0 + }, + "level_field": "background" + } + }, + "extractor": { + "backend": "naive", + "config": {} + }, + "adder": { + "backend": "naive", + "config": {} + }, + "retriever": { + "backend": "naive", + "config": {} + }, + "memory_filename": "preference_textual_memories.json" +} diff --git a/examples/data/config/tree_config_shared_database.json b/examples/data/config/tree_config_shared_database.json index 914f3c725..889a4a592 100644 --- a/examples/data/config/tree_config_shared_database.json +++ b/examples/data/config/tree_config_shared_database.json @@ -36,5 +36,6 @@ "embedding_dimension": 768 } }, - "reorganize": true + "reorganize": true, + "memory_filename": "tree_textual_memories.json" } From a90d256bdc5a0a8923ed27b239666181fb96229e Mon Sep 17 00:00:00 2001 From: novaleolin <15062791135@163.com> Date: Fri, 16 Jan 2026 14:27:06 +0800 Subject: [PATCH 35/53] feat(examples): update basic modules examples and configs (#856) * feat(examples): update basic modules examples and configs * feat: update MCP examples and internet search * docs: api reference --------- Co-authored-by: nova Co-authored-by: CaralHsi --- docs/openapi.json | 3596 +++++++++++++---- .../textual_memory_internet_search_example.py | 307 +- .../tree_textual_memory_recall.py | 203 +- ...textual_memory_relation_reason_detector.py | 272 +- .../tree_textual_memory_task_goal_parser.py | 205 +- .../config/simple_struct_reader_config.json | 22 +- .../config/tree_config_shared_database.json | 58 +- examples/mem_mcp/simple_fastmcp_client.py | 69 +- examples/mem_mcp/simple_fastmcp_serve.py | 77 +- src/memos/api/mcp_serve.py | 80 +- src/memos/cli.py | 2 +- tests/test_openapi_sync.py | 2 +- 12 files changed, 3870 insertions(+), 1023 deletions(-) diff --git a/docs/openapi.json b/docs/openapi.json index 46d715147..d9ef710b5 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -1,21 +1,24 @@ { "openapi": "3.1.0", "info": { - "title": "MemOS REST APIs", - "description": "A REST API for managing and searching memories using MemOS.", - "version": "1.0.0" + "title": "MemOS Server REST APIs", + "description": "A REST API for managing multiple users with MemOS Server.", + "version": "1.0.1" }, "paths": { - "/configure": { + "/product/search": { "post": { - "summary": "Configure MemOS", - "description": "Set MemOS configuration.", - "operationId": "set_config_configure_post", + "tags": [ + "Server API" + ], + "summary": "Search memories", + "description": "Search memories for a specific user.\n\nThis endpoint uses the class-based SearchHandler for better code organization.", + "operationId": "search_memories_product_search_post", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/MOSConfig" + "$ref": "#/components/schemas/APISearchRequest" } } }, @@ -27,7 +30,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ConfigResponse" + "$ref": "#/components/schemas/SearchResponse" } } } @@ -45,33 +48,19 @@ } } }, - "/users": { - "get": { - "summary": "List all users", - "description": "List all active users.", - "operationId": "list_users_users_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UserListResponse" - } - } - } - } - } - }, + "/product/add": { "post": { - "summary": "Create a new user", - "description": "Create a new user.", - "operationId": "create_user_users_post", + "tags": [ + "Server API" + ], + "summary": "Add memories", + "description": "Add memories for a specific user.\n\nThis endpoint uses the class-based AddHandler for better code organization.", + "operationId": "add_memories_product_add_post", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UserCreate" + "$ref": "#/components/schemas/APIADDRequest" } } }, @@ -83,7 +72,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/UserResponse" + "$ref": "#/components/schemas/MemoryResponse" } } } @@ -101,57 +90,21 @@ } } }, - "/users/me": { + "/product/scheduler/allstatus": { "get": { - "summary": "Get current user info", - "description": "Get current user information including accessible cubes.", - "operationId": "get_user_info_users_me_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UserResponse" - } - } - } - } - } - } - }, - "/mem_cubes": { - "post": { - "summary": "Register a MemCube", - "description": "Register a new MemCube.", - "operationId": "register_mem_cube_mem_cubes_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MemCubeRegister" - } - } - }, - "required": true - }, + "tags": [ + "Server API" + ], + "summary": "Get detailed scheduler status", + "description": "Get detailed scheduler status including running tasks and queue metrics.", + "operationId": "scheduler_allstatus_product_scheduler_allstatus_get", "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SimpleResponse" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" + "$ref": "#/components/schemas/AllStatusResponse" } } } @@ -159,23 +112,28 @@ } } }, - "/mem_cubes/{mem_cube_id}": { - "delete": { - "summary": "Unregister a MemCube", - "description": "Unregister a MemCube.", - "operationId": "unregister_mem_cube_mem_cubes__mem_cube_id__delete", + "/product/scheduler/status": { + "get": { + "tags": [ + "Server API" + ], + "summary": "Get scheduler running status", + "description": "Get scheduler running status.", + "operationId": "scheduler_status_product_scheduler_status_get", "parameters": [ { - "name": "mem_cube_id", - "in": "path", + "name": "user_id", + "in": "query", "required": true, "schema": { "type": "string", - "title": "Mem Cube Id" - } + "description": "User ID", + "title": "User Id" + }, + "description": "User ID" }, { - "name": "user_id", + "name": "task_id", "in": "query", "required": false, "schema": { @@ -187,8 +145,10 @@ "type": "null" } ], - "title": "User Id" - } + "description": "Optional Task ID to query a specific task", + "title": "Task Id" + }, + "description": "Optional Task ID to query a specific task" } ], "responses": { @@ -197,7 +157,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SimpleResponse" + "$ref": "#/components/schemas/StatusResponse" } } } @@ -215,39 +175,34 @@ } } }, - "/mem_cubes/{cube_id}/share": { - "post": { - "summary": "Share a cube with another user", - "description": "Share a cube with another user.", - "operationId": "share_cube_mem_cubes__cube_id__share_post", + "/product/scheduler/task_queue_status": { + "get": { + "tags": [ + "Server API" + ], + "summary": "Get scheduler task queue status", + "description": "Get scheduler task queue backlog/pending status for a user.", + "operationId": "scheduler_task_queue_status_product_scheduler_task_queue_status_get", "parameters": [ { - "name": "cube_id", - "in": "path", + "name": "user_id", + "in": "query", "required": true, "schema": { "type": "string", - "title": "Cube Id" - } + "description": "User ID whose queue status is requested", + "title": "User Id" + }, + "description": "User ID whose queue status is requested" } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CubeShare" - } - } - } - }, "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SimpleResponse" + "$ref": "#/components/schemas/TaskQueueResponse" } } } @@ -265,79 +220,42 @@ } } }, - "/memories": { + "/product/scheduler/wait": { "post": { - "summary": "Create memories", - "description": "Store new memories in a MemCube.", - "operationId": "add_memory_memories_post", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MemoryCreate" - } - } - } - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SimpleResponse" - } - } + "tags": [ + "Server API" + ], + "summary": "Wait until scheduler is idle for a specific user", + "description": "Wait until scheduler is idle for a specific user.", + "operationId": "scheduler_wait_product_scheduler_wait_post", + "parameters": [ + { + "name": "user_name", + "in": "query", + "required": true, + "schema": { + "type": "string", + "title": "User Name" } }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - }, - "get": { - "summary": "Get all memories", - "description": "Retrieve all memories from a MemCube.", - "operationId": "get_all_memories_memories_get", - "parameters": [ { - "name": "mem_cube_id", + "name": "timeout_seconds", "in": "query", "required": false, "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Mem Cube Id" + "type": "number", + "default": 120.0, + "title": "Timeout Seconds" } }, { - "name": "user_id", + "name": "poll_interval", "in": "query", "required": false, "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "User Id" + "type": "number", + "default": 0.5, + "title": "Poll Interval" } } ], @@ -346,9 +264,7 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { - "$ref": "#/components/schemas/MemoryResponse" - } + "schema": {} } } }, @@ -365,44 +281,42 @@ } } }, - "/memories/{mem_cube_id}/{memory_id}": { + "/product/scheduler/wait/stream": { "get": { - "summary": "Get a memory", - "description": "Retrieve a specific memory by ID from a MemCube.", - "operationId": "get_memory_memories__mem_cube_id___memory_id__get", + "tags": [ + "Server API" + ], + "summary": "Stream scheduler progress for a user", + "description": "Stream scheduler progress via Server-Sent Events (SSE).", + "operationId": "scheduler_wait_stream_product_scheduler_wait_stream_get", "parameters": [ { - "name": "mem_cube_id", - "in": "path", + "name": "user_name", + "in": "query", "required": true, "schema": { "type": "string", - "title": "Mem Cube Id" + "title": "User Name" } }, { - "name": "memory_id", - "in": "path", - "required": true, + "name": "timeout_seconds", + "in": "query", + "required": false, "schema": { - "type": "string", - "title": "Memory Id" + "type": "number", + "default": 120.0, + "title": "Timeout Seconds" } }, { - "name": "user_id", + "name": "poll_interval", "in": "query", "required": false, "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "User Id" + "type": "number", + "default": 0.5, + "title": "Poll Interval" } } ], @@ -411,9 +325,7 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { - "$ref": "#/components/schemas/MemoryResponse" - } + "schema": {} } } }, @@ -428,67 +340,32 @@ } } } - }, - "put": { - "summary": "Update a memory", - "description": "Update an existing memory in a MemCube.", - "operationId": "update_memory_memories__mem_cube_id___memory_id__put", - "parameters": [ - { - "name": "mem_cube_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Mem Cube Id" - } - }, - { - "name": "memory_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Memory Id" - } - }, - { - "name": "user_id", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "User Id" - } - } + } + }, + "/product/chat/complete": { + "post": { + "tags": [ + "Server API" ], + "summary": "Chat with MemOS (Complete Response)", + "description": "Chat with MemOS for a specific user. Returns complete response (non-streaming).\n\nThis endpoint uses the class-based ChatHandler.", + "operationId": "chat_complete_product_chat_complete_post", "requestBody": { - "required": true, "content": { "application/json": { "schema": { - "type": "object", - "additionalProperties": true, - "title": "Updated Memory" + "$ref": "#/components/schemas/APIChatCompleteRequest" } } - } + }, + "required": true }, "responses": { "200": { "description": "Successful Response", "content": { "application/json": { - "schema": { - "$ref": "#/components/schemas/SimpleResponse" - } + "schema": {} } } }, @@ -503,55 +380,32 @@ } } } - }, - "delete": { - "summary": "Delete a memory", - "description": "Delete a specific memory from a MemCube.", - "operationId": "delete_memory_memories__mem_cube_id___memory_id__delete", - "parameters": [ - { - "name": "mem_cube_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Mem Cube Id" - } - }, - { - "name": "memory_id", - "in": "path", - "required": true, - "schema": { - "type": "string", - "title": "Memory Id" + } + }, + "/product/chat/stream": { + "post": { + "tags": [ + "Server API" + ], + "summary": "Chat with MemOS", + "description": "Chat with MemOS for a specific user. Returns SSE stream.\n\nThis endpoint uses the class-based ChatHandler which internally\ncomposes SearchHandler and AddHandler for a clean architecture.", + "operationId": "chat_stream_product_chat_stream_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ChatRequest" + } } }, - { - "name": "user_id", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "User Id" - } - } - ], + "required": true + }, "responses": { "200": { "description": "Successful Response", "content": { "application/json": { - "schema": { - "$ref": "#/components/schemas/SimpleResponse" - } + "schema": {} } } }, @@ -568,16 +422,19 @@ } } }, - "/search": { + "/product/chat/stream/playground": { "post": { - "summary": "Search memories", - "description": "Search for memories across MemCubes.", - "operationId": "search_memories_search_post", + "tags": [ + "Server API" + ], + "summary": "Chat with MemOS playground", + "description": "Chat with MemOS for a specific user. Returns SSE stream.\n\nThis endpoint uses the class-based ChatHandler which internally\ncomposes SearchHandler and AddHandler for a clean architecture.", + "operationId": "chat_stream_playground_product_chat_stream_playground_post", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SearchRequest" + "$ref": "#/components/schemas/ChatPlaygroundRequest" } } }, @@ -588,8 +445,131 @@ "description": "Successful Response", "content": { "application/json": { - "schema": { - "$ref": "#/components/schemas/SearchResponse" + "schema": {} + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/product/suggestions": { + "post": { + "tags": [ + "Server API" + ], + "summary": "Get suggestion queries", + "description": "Get suggestion queries for a specific user with language preference.", + "operationId": "get_suggestion_queries_product_suggestions_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuggestionRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuggestionResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/product/get_all": { + "post": { + "tags": [ + "Server API" + ], + "summary": "Get all memories for user", + "description": "Get all memories or subgraph for a specific user.\n\nIf search_query is provided, returns a subgraph based on the query.\nOtherwise, returns all memories of the specified type.", + "operationId": "get_all_memories_product_get_all_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetMemoryPlaygroundRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MemoryResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/product/get_memory": { + "post": { + "tags": [ + "Server API" + ], + "summary": "Get memories for user", + "operationId": "get_memories_product_get_memory_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetMemoryRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetMemoryResponse" } } } @@ -607,107 +587,2013 @@ } } }, - "/memories/{mem_cube_id}": { - "delete": { - "summary": "Delete all memories", - "description": "Delete all memories from a MemCube.", - "operationId": "delete_all_memories_memories__mem_cube_id__delete", + "/product/get_memory/{memory_id}": { + "get": { + "tags": [ + "Server API" + ], + "summary": "Get memory by id", + "operationId": "get_memory_by_id_product_get_memory__memory_id__get", "parameters": [ { - "name": "mem_cube_id", + "name": "memory_id", "in": "path", "required": true, "schema": { "type": "string", - "title": "Mem Cube Id" + "title": "Memory Id" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetMemoryResponse" + } + } } }, - { - "name": "user_id", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" } - ], - "title": "User Id" + } + } + } + } + } + }, + "/product/delete_memory": { + "post": { + "tags": [ + "Server API" + ], + "summary": "Delete memories for user", + "operationId": "delete_memories_product_delete_memory_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteMemoryRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DeleteMemoryResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/product/feedback": { + "post": { + "tags": [ + "Server API" + ], + "summary": "Feedback memories", + "description": "Feedback memories for a specific user.\n\nThis endpoint uses the class-based FeedbackHandler for better code organization.", + "operationId": "feedback_memories_product_feedback_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/APIFeedbackRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MemoryResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + }, + "/product/get_user_names_by_memory_ids": { + "post": { + "tags": [ + "Server API" + ], + "summary": "Get user names by memory ids", + "description": "Get user names by memory ids.", + "operationId": "get_user_names_by_memory_ids_product_get_user_names_by_memory_ids_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetUserNamesByMemoryIdsRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetUserNamesByMemoryIdsResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } } } + } + } + }, + "/product/exist_mem_cube_id": { + "post": { + "tags": [ + "Server API" ], + "summary": "Check if mem cube id exists", + "description": "Check if mem cube id exists.", + "operationId": "exist_mem_cube_id_product_exist_mem_cube_id_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExistMemCubeIdRequest" + } + } + }, + "required": true + }, "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SimpleResponse" + "$ref": "#/components/schemas/ExistMemCubeIdResponse" } } - } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "APIADDRequest": { + "properties": { + "user_id": { + "type": "string", + "title": "User Id", + "description": "User ID" + }, + "session_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Session Id", + "description": "Session ID. If not provided, a default session will be used." + }, + "task_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Task Id", + "description": "Task ID for monitering async tasks" + }, + "writable_cube_ids": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Writable Cube Ids", + "description": "List of cube IDs user can write for multi-cube add" + }, + "async_mode": { + "type": "string", + "enum": [ + "async", + "sync" + ], + "title": "Async Mode", + "description": "Whether to add memory in async mode. Use 'async' to enqueue background add (non-blocking), or 'sync' to add memories in the current call. Default: 'async'.", + "default": "async" + }, + "mode": { + "anyOf": [ + { + "type": "string", + "enum": [ + "fast", + "fine" + ] + }, + { + "type": "null" + } + ], + "title": "Mode", + "description": "(Internal) Add mode used only when async_mode='sync'. If set to 'fast', the handler will use a fast add pipeline. Ignored when async_mode='async'." + }, + "custom_tags": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Custom Tags", + "description": "Custom tags for this add request, e.g. ['Travel', 'family']. These tags can be used as filters in search." + }, + "info": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Info", + "description": "Additional metadata for the add request. All keys can be used as filters in search. Example: {'agent_id': 'xxxxxx', 'app_id': 'xxxx', 'source_type': 'web', 'source_url': 'https://www.baidu.com', 'source_content': '西湖是杭州最著名的景点'}." + }, + "messages": { + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/ChatCompletionSystemMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionUserMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionAssistantMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionToolMessageParam" + } + ] + }, + "type": "array" + }, + { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/ChatCompletionContentPartTextParam" + }, + { + "$ref": "#/components/schemas/File" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Messages", + "description": "List of messages to store. Supports: - system / user / assistant messages with 'content' and 'chat_time'; - tool messages including: * tool_description (name, description, parameters), * tool_input (call_id, name, argument), * raw tool messages where content is str or list[str], * tool_output with structured output items (input_text / input_image / input_file, etc.). Also supports pure input items when there is no dialog." + }, + "chat_history": { + "anyOf": [ + { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/ChatCompletionSystemMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionUserMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionAssistantMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionToolMessageParam" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Chat History", + "description": "Historical chat messages used internally by algorithms. If None, internal stored history will be used; if provided (even an empty list), this value will be used as-is." + }, + "is_feedback": { + "type": "boolean", + "title": "Is Feedback", + "description": "Whether this request represents user feedback. Default: False.", + "default": false + }, + "mem_cube_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Mem Cube Id", + "description": "(Deprecated) Target cube ID for this add request (optional for developer API)." + }, + "memory_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Memory Content", + "description": "(Deprecated) Plain memory content to store. Prefer using `messages`." + }, + "doc_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Doc Path", + "description": "(Deprecated / internal) Path to document to store." + }, + "source": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Source", + "description": "(Deprecated) Simple source tag of the memory. Prefer using `info.source_type` / `info.source_url`." + }, + "operation": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/PermissionDict" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Operation", + "description": "(Internal) Operation definitions for multi-cube write permissions." + } + }, + "type": "object", + "title": "APIADDRequest", + "description": "Request model for creating memories." + }, + "APIChatCompleteRequest": { + "properties": { + "user_id": { + "type": "string", + "title": "User Id", + "description": "User ID" + }, + "query": { + "type": "string", + "title": "Query", + "description": "Chat query message" + }, + "readable_cube_ids": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Readable Cube Ids", + "description": "List of cube IDs user can read for multi-cube chat" + }, + "writable_cube_ids": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Writable Cube Ids", + "description": "List of cube IDs user can write for multi-cube chat" + }, + "history": { + "anyOf": [ + { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/ChatCompletionSystemMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionUserMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionAssistantMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionToolMessageParam" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "History", + "description": "Chat history" + }, + "mode": { + "$ref": "#/components/schemas/SearchMode", + "description": "search mode: fast, fine, or mixture", + "default": "fast" + }, + "system_prompt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "System Prompt", + "description": "Base system prompt to use for chat" + }, + "top_k": { + "type": "integer", + "title": "Top K", + "description": "Number of results to return", + "default": 10 + }, + "session_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Session Id", + "description": "Session ID for soft-filtering memories" + }, + "include_preference": { + "type": "boolean", + "title": "Include Preference", + "description": "Whether to handle preference memory", + "default": true + }, + "pref_top_k": { + "type": "integer", + "title": "Pref Top K", + "description": "Number of preference results to return", + "default": 6 + }, + "model_name_or_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Model Name Or Path", + "description": "Model name to use for chat" + }, + "max_tokens": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Max Tokens", + "description": "Max tokens to generate" + }, + "temperature": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Temperature", + "description": "Temperature for sampling" + }, + "top_p": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Top P", + "description": "Top-p (nucleus) sampling parameter" + }, + "add_message_on_answer": { + "type": "boolean", + "title": "Add Message On Answer", + "description": "Add dialogs to memory after chat", + "default": true + }, + "filter": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Filter", + "description": "\n Filter for the memory, example:\n {\n \"`and` or `or`\": [\n {\"id\": \"uuid-xxx\"},\n {\"created_at\": {\"gt\": \"2024-01-01\"}},\n ]\n }\n " + }, + "internet_search": { + "type": "boolean", + "title": "Internet Search", + "description": "Whether to use internet search", + "default": false + }, + "threshold": { + "type": "number", + "title": "Threshold", + "description": "Threshold for filtering references", + "default": 0.5 + }, + "mem_cube_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Mem Cube Id", + "description": "Cube ID to use for chat" + }, + "moscube": { + "type": "boolean", + "title": "Moscube", + "description": "(Deprecated) Whether to use legacy MemOSCube pipeline", + "default": false + } + }, + "type": "object", + "required": [ + "user_id", + "query" + ], + "title": "APIChatCompleteRequest", + "description": "Request model for chat operations." + }, + "APIFeedbackRequest": { + "properties": { + "user_id": { + "type": "string", + "title": "User Id", + "description": "User ID" + }, + "session_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Session Id", + "description": "Session ID for soft-filtering memories", + "default": "default_session" + }, + "task_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Task Id", + "description": "Task ID for monitering async tasks" + }, + "history": { + "anyOf": [ + { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/ChatCompletionSystemMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionUserMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionAssistantMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionToolMessageParam" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "History", + "description": "Chat history" + }, + "retrieved_memory_ids": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Retrieved Memory Ids", + "description": "Retrieved memory ids at last turn" + }, + "feedback_content": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Feedback Content", + "description": "Feedback content to process" + }, + "feedback_time": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Feedback Time", + "description": "Feedback time" + }, + "writable_cube_ids": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Writable Cube Ids", + "description": "List of cube IDs user can write for multi-cube add" + }, + "async_mode": { + "type": "string", + "enum": [ + "sync", + "async" + ], + "title": "Async Mode", + "description": "feedback mode: sync or async", + "default": "async" + }, + "corrected_answer": { + "type": "boolean", + "title": "Corrected Answer", + "description": "Whether need return corrected answer", + "default": false + }, + "info": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Info", + "description": "Additional metadata for the add request. All keys can be used as filters in search. Example: {'agent_id': 'xxxxxx', 'app_id': 'xxxx', 'source_type': 'web', 'source_url': 'https://www.baidu.com', 'source_content': 'West Lake is the most famous scenic spot in Hangzhou'}." + }, + "mem_cube_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Mem Cube Id", + "description": "(Deprecated) Single cube ID to search in. Prefer `readable_cube_ids` for multi-cube search." + } + }, + "type": "object", + "required": [ + "user_id", + "history", + "feedback_content" + ], + "title": "APIFeedbackRequest", + "description": "Request model for processing feedback info." + }, + "APISearchRequest": { + "properties": { + "query": { + "type": "string", + "title": "Query", + "description": "User search query" + }, + "user_id": { + "type": "string", + "title": "User Id", + "description": "User ID" + }, + "readable_cube_ids": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Readable Cube Ids", + "description": "List of cube IDs that are readable for this request. Required for algorithm-facing API; optional for developer-facing API." + }, + "mode": { + "$ref": "#/components/schemas/SearchMode", + "description": "Search mode: fast, fine, or mixture.", + "default": "fast" + }, + "session_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Session Id", + "description": "Session ID used as a soft signal to prioritize more relevant memories. Only used for weighting, not as a hard filter." + }, + "top_k": { + "type": "integer", + "minimum": 1.0, + "title": "Top K", + "description": "Number of textual memories to retrieve (top-K). Default: 10.", + "default": 10 + }, + "dedup": { + "anyOf": [ + { + "type": "string", + "enum": [ + "no", + "sim" + ] + }, + { + "type": "null" + } + ], + "title": "Dedup", + "description": "Optional dedup option for textual memories. Use 'no' for no dedup, 'sim' for similarity dedup. If None, default exact-text dedup is applied." + }, + "pref_top_k": { + "type": "integer", + "minimum": 0.0, + "title": "Pref Top K", + "description": "Number of preference memories to retrieve (top-K). Default: 6.", + "default": 6 + }, + "include_preference": { + "type": "boolean", + "title": "Include Preference", + "description": "Whether to retrieve preference memories along with general memories. If enabled, the system will automatically recall user preferences relevant to the query. Default: True.", + "default": true + }, + "search_tool_memory": { + "type": "boolean", + "title": "Search Tool Memory", + "description": "Whether to retrieve tool memories along with general memories. If enabled, the system will automatically recall tool memories relevant to the query. Default: True.", + "default": true + }, + "tool_mem_top_k": { + "type": "integer", + "minimum": 0.0, + "title": "Tool Mem Top K", + "description": "Number of tool memories to retrieve (top-K). Default: 6.", + "default": 6 + }, + "filter": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Filter", + "description": "\n Filter for the memory, example:\n {\n \"`and` or `or`\": [\n {\"id\": \"uuid-xxx\"},\n {\"created_at\": {\"gt\": \"2024-01-01\"}},\n ]\n }\n " + }, + "internet_search": { + "type": "boolean", + "title": "Internet Search", + "description": "Whether to enable internet search in addition to memory search. Primarily used by internal algorithms. Default: False.", + "default": false + }, + "threshold": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Threshold", + "description": "Internal similarity threshold for searching plaintext memories. If None, default thresholds will be applied." + }, + "search_memory_type": { + "type": "string", + "title": "Search Memory Type", + "description": "Type of memory to search: All, WorkingMemory, LongTermMemory, UserMemory, OuterMemory, ToolSchemaMemory, ToolTrajectoryMemory", + "default": "All" + }, + "chat_history": { + "anyOf": [ + { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/ChatCompletionSystemMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionUserMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionAssistantMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionToolMessageParam" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Chat History", + "description": "Historical chat messages used internally by algorithms. If None, internal stored history may be used; if provided (even an empty list), this value will be used as-is." + }, + "mem_cube_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Mem Cube Id", + "description": "(Deprecated) Single cube ID to search in. Prefer `readable_cube_ids` for multi-cube search." + }, + "moscube": { + "type": "boolean", + "title": "Moscube", + "description": "(Deprecated / internal) Whether to use legacy MemOSCube path.", + "default": false + }, + "operation": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/PermissionDict" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Operation", + "description": "(Internal) Operation definitions for multi-cube read permissions." + }, + "source": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Source", + "description": "Source of the search query [plugin will router diff search]" + } + }, + "type": "object", + "required": [ + "query", + "user_id" + ], + "title": "APISearchRequest", + "description": "Request model for searching memories." + }, + "AllStatusResponse": { + "properties": { + "code": { + "type": "integer", + "title": "Code", + "description": "Response status code", + "default": 200 + }, + "message": { + "type": "string", + "title": "Message", + "default": "Scheduler status summary retrieved successfully" + }, + "data": { + "anyOf": [ + { + "$ref": "#/components/schemas/AllStatusResponseData" + }, + { + "type": "null" + } + ], + "description": "Response data" + } + }, + "type": "object", + "title": "AllStatusResponse", + "description": "Response model for full scheduler status operations." + }, + "AllStatusResponseData": { + "properties": { + "scheduler_summary": { + "$ref": "#/components/schemas/TaskSummary", + "description": "Aggregated status for scheduler-managed tasks" + }, + "all_tasks_summary": { + "$ref": "#/components/schemas/TaskSummary", + "description": "Aggregated status for all tracked tasks" + } + }, + "type": "object", + "required": [ + "scheduler_summary", + "all_tasks_summary" + ], + "title": "AllStatusResponseData", + "description": "Aggregated scheduler status metrics." + }, + "Audio": { + "properties": { + "id": { + "type": "string", + "title": "Id" + } + }, + "type": "object", + "required": [ + "id" + ], + "title": "Audio" + }, + "ChatCompletionAssistantMessageParam": { + "properties": { + "role": { + "type": "string", + "const": "assistant", + "title": "Role" + }, + "audio": { + "anyOf": [ + { + "$ref": "#/components/schemas/Audio" + }, + { + "type": "null" + } + ] + }, + "content": { + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/ChatCompletionContentPartTextParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionContentPartRefusalParam" + } + ] + }, + "type": "array" + }, + { + "$ref": "#/components/schemas/ChatCompletionContentPartTextParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionContentPartRefusalParam" + }, + { + "type": "null" + } + ], + "title": "Content" + }, + "refusal": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Refusal" + }, + "tool_calls": { + "anyOf": [ + { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/ChatCompletionMessageFunctionToolCallParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionMessageCustomToolCallParam" + } + ] + }, + "type": "array" + }, + { + "$ref": "#/components/schemas/ChatCompletionMessageFunctionToolCallParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionMessageCustomToolCallParam" + } + ], + "title": "Tool Calls" + }, + "chat_time": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Chat Time" + }, + "message_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Message Id" + } + }, + "type": "object", + "required": [ + "role" + ], + "title": "ChatCompletionAssistantMessageParam" + }, + "ChatCompletionContentPartImageParam": { + "properties": { + "image_url": { + "$ref": "#/components/schemas/ImageURL" + }, + "type": { + "type": "string", + "const": "image_url", + "title": "Type" + } + }, + "type": "object", + "required": [ + "image_url", + "type" + ], + "title": "ChatCompletionContentPartImageParam" + }, + "ChatCompletionContentPartInputAudioParam": { + "properties": { + "input_audio": { + "$ref": "#/components/schemas/InputAudio" + }, + "type": { + "type": "string", + "const": "input_audio", + "title": "Type" + } + }, + "type": "object", + "required": [ + "input_audio", + "type" + ], + "title": "ChatCompletionContentPartInputAudioParam" + }, + "ChatCompletionContentPartRefusalParam": { + "properties": { + "refusal": { + "type": "string", + "title": "Refusal" + }, + "type": { + "type": "string", + "const": "refusal", + "title": "Type" + } + }, + "type": "object", + "required": [ + "refusal", + "type" + ], + "title": "ChatCompletionContentPartRefusalParam" + }, + "ChatCompletionContentPartTextParam": { + "properties": { + "text": { + "type": "string", + "title": "Text" + }, + "type": { + "type": "string", + "const": "text", + "title": "Type" + } + }, + "type": "object", + "required": [ + "text", + "type" + ], + "title": "ChatCompletionContentPartTextParam" + }, + "ChatCompletionMessageCustomToolCallParam": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "custom": { + "$ref": "#/components/schemas/Custom" + }, + "type": { + "type": "string", + "const": "custom", + "title": "Type" + } + }, + "type": "object", + "required": [ + "id", + "custom", + "type" + ], + "title": "ChatCompletionMessageCustomToolCallParam" + }, + "ChatCompletionMessageFunctionToolCallParam": { + "properties": { + "id": { + "type": "string", + "title": "Id" + }, + "function": { + "$ref": "#/components/schemas/Function" + }, + "type": { + "type": "string", + "const": "function", + "title": "Type" + } + }, + "type": "object", + "required": [ + "id", + "function", + "type" + ], + "title": "ChatCompletionMessageFunctionToolCallParam" + }, + "ChatCompletionSystemMessageParam": { + "properties": { + "content": { + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "$ref": "#/components/schemas/ChatCompletionContentPartTextParam" + }, + "type": "array" + }, + { + "$ref": "#/components/schemas/ChatCompletionContentPartTextParam" + } + ], + "title": "Content" + }, + "role": { + "type": "string", + "const": "system", + "title": "Role" + }, + "name": { + "type": "string", + "title": "Name" + }, + "chat_time": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Chat Time" + }, + "message_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Message Id" + } + }, + "type": "object", + "required": [ + "content", + "role" + ], + "title": "ChatCompletionSystemMessageParam" + }, + "ChatCompletionToolMessageParam": { + "properties": { + "content": { + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/ChatCompletionContentPartTextParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionContentPartImageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionContentPartInputAudioParam" + }, + { + "$ref": "#/components/schemas/File" + } + ] + }, + "type": "array" + }, + { + "$ref": "#/components/schemas/ChatCompletionContentPartTextParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionContentPartImageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionContentPartInputAudioParam" + }, + { + "$ref": "#/components/schemas/File" + } + ], + "title": "Content" + }, + "role": { + "type": "string", + "const": "tool", + "title": "Role" + }, + "tool_call_id": { + "type": "string", + "title": "Tool Call Id" + }, + "chat_time": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Chat Time" + }, + "message_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Message Id" + } + }, + "type": "object", + "required": [ + "content", + "role", + "tool_call_id" + ], + "title": "ChatCompletionToolMessageParam" + }, + "ChatCompletionUserMessageParam": { + "properties": { + "content": { + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/ChatCompletionContentPartTextParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionContentPartImageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionContentPartInputAudioParam" + }, + { + "$ref": "#/components/schemas/File" + } + ] + }, + "type": "array" + }, + { + "$ref": "#/components/schemas/ChatCompletionContentPartTextParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionContentPartImageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionContentPartInputAudioParam" + }, + { + "$ref": "#/components/schemas/File" + } + ], + "title": "Content" + }, + "role": { + "type": "string", + "const": "user", + "title": "Role" + }, + "name": { + "type": "string", + "title": "Name" + }, + "chat_time": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Chat Time" + }, + "message_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Message Id" + } + }, + "type": "object", + "required": [ + "content", + "role" + ], + "title": "ChatCompletionUserMessageParam" + }, + "ChatPlaygroundRequest": { + "properties": { + "user_id": { + "type": "string", + "title": "User Id", + "description": "User ID" + }, + "query": { + "type": "string", + "title": "Query", + "description": "Chat query message" + }, + "readable_cube_ids": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Readable Cube Ids", + "description": "List of cube IDs user can read for multi-cube chat" + }, + "writable_cube_ids": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Writable Cube Ids", + "description": "List of cube IDs user can write for multi-cube chat" + }, + "history": { + "anyOf": [ + { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/ChatCompletionSystemMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionUserMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionAssistantMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionToolMessageParam" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "History", + "description": "Chat history" + }, + "mode": { + "$ref": "#/components/schemas/SearchMode", + "description": "search mode: fast, fine, or mixture", + "default": "fast" + }, + "system_prompt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "System Prompt", + "description": "Base system prompt to use for chat" + }, + "top_k": { + "type": "integer", + "title": "Top K", + "description": "Number of results to return", + "default": 10 + }, + "session_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Session Id", + "description": "Session ID for soft-filtering memories" + }, + "include_preference": { + "type": "boolean", + "title": "Include Preference", + "description": "Whether to handle preference memory", + "default": true + }, + "pref_top_k": { + "type": "integer", + "title": "Pref Top K", + "description": "Number of preference results to return", + "default": 6 + }, + "model_name_or_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Model Name Or Path", + "description": "Model name to use for chat" + }, + "max_tokens": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Max Tokens", + "description": "Max tokens to generate" + }, + "temperature": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Temperature", + "description": "Temperature for sampling" + }, + "top_p": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Top P", + "description": "Top-p (nucleus) sampling parameter" + }, + "add_message_on_answer": { + "type": "boolean", + "title": "Add Message On Answer", + "description": "Add dialogs to memory after chat", + "default": true + }, + "filter": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Filter", + "description": "\n Filter for the memory, example:\n {\n \"`and` or `or`\": [\n {\"id\": \"uuid-xxx\"},\n {\"created_at\": {\"gt\": \"2024-01-01\"}},\n ]\n }\n " + }, + "internet_search": { + "type": "boolean", + "title": "Internet Search", + "description": "Whether to use internet search", + "default": false + }, + "threshold": { + "type": "number", + "title": "Threshold", + "description": "Threshold for filtering references", + "default": 0.5 + }, + "moscube": { + "type": "boolean", + "title": "Moscube", + "description": "(Deprecated) Whether to use legacy MemOSCube pipeline.", + "default": false + }, + "mem_cube_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Mem Cube Id", + "description": "(Deprecated) Single cube ID to use for chat. Prefer `readable_cube_ids` / `writable_cube_ids` for multi-cube chat." + }, + "beginner_guide_step": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Beginner Guide Step", + "description": "Whether to use beginner guide, option: [first, second]" + } + }, + "type": "object", + "required": [ + "user_id", + "query" + ], + "title": "ChatPlaygroundRequest", + "description": "Request model for chat operations in playground." + }, + "ChatRequest": { + "properties": { + "user_id": { + "type": "string", + "title": "User Id", + "description": "User ID" + }, + "query": { + "type": "string", + "title": "Query", + "description": "Chat query message" + }, + "readable_cube_ids": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Readable Cube Ids", + "description": "List of cube IDs user can read for multi-cube chat" + }, + "writable_cube_ids": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Writable Cube Ids", + "description": "List of cube IDs user can write for multi-cube chat" + }, + "history": { + "anyOf": [ + { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/ChatCompletionSystemMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionUserMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionAssistantMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionToolMessageParam" + } + ] + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "History", + "description": "Chat history" + }, + "mode": { + "$ref": "#/components/schemas/SearchMode", + "description": "search mode: fast, fine, or mixture", + "default": "fast" + }, + "system_prompt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "System Prompt", + "description": "Base system prompt to use for chat" + }, + "top_k": { + "type": "integer", + "title": "Top K", + "description": "Number of results to return", + "default": 10 + }, + "session_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Session Id", + "description": "Session ID for soft-filtering memories" + }, + "include_preference": { + "type": "boolean", + "title": "Include Preference", + "description": "Whether to handle preference memory", + "default": true + }, + "pref_top_k": { + "type": "integer", + "title": "Pref Top K", + "description": "Number of preference results to return", + "default": 6 + }, + "model_name_or_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Model Name Or Path", + "description": "Model name to use for chat" + }, + "max_tokens": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Max Tokens", + "description": "Max tokens to generate" }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - } - } - }, - "/chat": { - "post": { - "summary": "Chat with MemOS", - "description": "Chat with the MemOS system.", - "operationId": "chat_chat_post", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChatRequest" + "temperature": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" } - } + ], + "title": "Temperature", + "description": "Temperature for sampling" }, - "required": true - }, - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ChatResponse" - } + "top_p": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" } - } + ], + "title": "Top P", + "description": "Top-p (nucleus) sampling parameter" }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } + "add_message_on_answer": { + "type": "boolean", + "title": "Add Message On Answer", + "description": "Add dialogs to memory after chat", + "default": true + }, + "filter": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" } - } - } - } - } - } - }, - "components": { - "schemas": { - "ChatRequest": { - "properties": { - "user_id": { + ], + "title": "Filter", + "description": "\n Filter for the memory, example:\n {\n \"`and` or `or`\": [\n {\"id\": \"uuid-xxx\"},\n {\"created_at\": {\"gt\": \"2024-01-01\"}},\n ]\n }\n " + }, + "internet_search": { + "type": "boolean", + "title": "Internet Search", + "description": "Whether to use internet search", + "default": false + }, + "threshold": { + "type": "number", + "title": "Threshold", + "description": "Threshold for filtering references", + "default": 0.5 + }, + "moscube": { + "type": "boolean", + "title": "Moscube", + "description": "(Deprecated) Whether to use legacy MemOSCube pipeline.", + "default": false + }, + "mem_cube_id": { "anyOf": [ { "type": "string" @@ -716,42 +2602,112 @@ "type": "null" } ], - "title": "User Id", - "description": "User ID for the request", - "example": "user123" + "title": "Mem Cube Id", + "description": "(Deprecated) Single cube ID to use for chat. Prefer `readable_cube_ids` / `writable_cube_ids` for multi-cube chat." + } + }, + "type": "object", + "required": [ + "user_id", + "query" + ], + "title": "ChatRequest", + "description": "Request model for chat operations.\n\nThis model is used as the algorithm-facing chat interface, while also\nremaining backward compatible with older developer-facing APIs." + }, + "Custom": { + "properties": { + "input": { + "type": "string", + "title": "Input" }, - "query": { + "name": { "type": "string", - "title": "Query", - "description": "Chat query message.", - "example": "What is the latest update?" + "title": "Name" } }, "type": "object", "required": [ - "query" + "input", + "name" ], - "title": "ChatRequest" + "title": "Custom" + }, + "DeleteMemoryRequest": { + "properties": { + "writable_cube_ids": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Writable Cube Ids", + "description": "Writable cube IDs" + }, + "memory_ids": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Memory Ids", + "description": "Memory IDs" + }, + "file_ids": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "File Ids", + "description": "File IDs" + }, + "filter": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Filter", + "description": "Filter for the memory" + } + }, + "type": "object", + "title": "DeleteMemoryRequest", + "description": "Request model for deleting memories." }, - "ChatResponse": { + "DeleteMemoryResponse": { "properties": { "code": { "type": "integer", "title": "Code", "description": "Response status code", - "default": 200, - "example": 200 + "default": 200 }, "message": { "type": "string", "title": "Message", - "description": "Response message", - "example": "Operation successful" + "description": "Response message" }, "data": { "anyOf": [ { - "type": "string" + "additionalProperties": true, + "type": "object" }, { "type": "null" @@ -765,26 +2721,49 @@ "required": [ "message" ], - "title": "ChatResponse", - "description": "Response model for chat operations." + "title": "DeleteMemoryResponse", + "description": "Response model for deleting memories." + }, + "ExistMemCubeIdRequest": { + "properties": { + "mem_cube_id": { + "type": "string", + "title": "Mem Cube Id", + "description": "Mem cube ID" + } + }, + "type": "object", + "required": [ + "mem_cube_id" + ], + "title": "ExistMemCubeIdRequest", + "description": "Request model for checking if mem cube id exists." }, - "ConfigResponse": { + "ExistMemCubeIdResponse": { "properties": { "code": { "type": "integer", "title": "Code", "description": "Response status code", - "default": 200, - "example": 200 + "default": 200 }, "message": { "type": "string", "title": "Message", - "description": "Response message", - "example": "Operation successful" + "description": "Response message" }, "data": { - "type": "null", + "anyOf": [ + { + "additionalProperties": { + "type": "boolean" + }, + "type": "object" + }, + { + "type": "null" + } + ], "title": "Data", "description": "Response data" } @@ -793,247 +2772,124 @@ "required": [ "message" ], - "title": "ConfigResponse", - "description": "Response model for configuration endpoint." + "title": "ExistMemCubeIdResponse", + "description": "Response model for checking if mem cube id exists." }, - "CubeShare": { + "File": { "properties": { - "user_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "User Id", - "description": "User ID for the request", - "example": "user123" + "file": { + "$ref": "#/components/schemas/FileFile" }, - "target_user_id": { + "type": { "type": "string", - "title": "Target User Id", - "description": "Target user ID to share with", - "example": "user456" + "const": "file", + "title": "Type" } }, "type": "object", "required": [ - "target_user_id" + "file", + "type" ], - "title": "CubeShare" + "title": "File" }, - "HTTPValidationError": { + "FileFile": { "properties": { - "detail": { - "items": { - "$ref": "#/components/schemas/ValidationError" - }, - "type": "array", - "title": "Detail" + "file_data": { + "type": "string", + "title": "File Data" + }, + "file_id": { + "type": "string", + "title": "File Id" + }, + "filename": { + "type": "string", + "title": "Filename" } }, "type": "object", - "title": "HTTPValidationError" + "title": "FileFile" }, - "LLMConfigFactory": { + "Function": { "properties": { - "model_schema": { + "arguments": { "type": "string", - "title": "Model Schema", - "description": "Schema for configuration. This value will be automatically set.", - "default": "NOT_SET" + "title": "Arguments" }, - "backend": { + "name": { "type": "string", - "title": "Backend", - "description": "Backend for LLM" - }, - "config": { - "additionalProperties": true, - "type": "object", - "title": "Config", - "description": "Configuration for the LLM backend" + "title": "Name" } }, - "additionalProperties": false, "type": "object", "required": [ - "backend", - "config" + "arguments", + "name" ], - "title": "LLMConfigFactory", - "description": "Factory class for creating LLM configurations." + "title": "Function" }, - "MOSConfig": { + "GetMemoryPlaygroundRequest": { "properties": { - "model_schema": { - "type": "string", - "title": "Model Schema", - "description": "Schema for configuration. This value will be automatically set.", - "default": "NOT_SET" - }, "user_id": { "type": "string", "title": "User Id", - "description": "User ID for the MOS. This is used to distinguish between different users' memories.", - "default": "root" + "description": "User ID" }, - "session_id": { + "memory_type": { "type": "string", - "title": "Session Id", - "description": "Session ID for the MOS. This is used to distinguish between different dialogue", - "default": "8dcdbd62-c231-4678-a3ae-0946b7d9ce14" - }, - "chat_model": { - "$ref": "#/components/schemas/LLMConfigFactory", - "description": "LLM configuration for the chat model in the MOS" - }, - "mem_reader": { - "$ref": "#/components/schemas/MemReaderConfigFactory", - "description": "MemReader configuration for the MOS" - }, - "mem_scheduler": { - "anyOf": [ - { - "$ref": "#/components/schemas/SchedulerConfigFactory" - }, - { - "type": "null" - } + "enum": [ + "text_mem", + "act_mem", + "param_mem", + "para_mem" ], - "description": "Memory scheduler configuration for managing memory operations" - }, - "user_manager": { - "$ref": "#/components/schemas/UserManagerConfigFactory", - "description": "User manager configuration for database operations" - }, - "max_turns_window": { - "type": "integer", - "title": "Max Turns Window", - "description": "Maximum number of turns to keep in the conversation history", - "default": 15 - }, - "top_k": { - "type": "integer", - "title": "Top K", - "description": "Maximum number of memories to retrieve for each query", - "default": 5 + "title": "Memory Type", + "description": "Memory type" }, - "enable_textual_memory": { - "type": "boolean", - "title": "Enable Textual Memory", - "description": "Enable textual memory for the MemChat", - "default": true - }, - "enable_activation_memory": { - "type": "boolean", - "title": "Enable Activation Memory", - "description": "Enable activation memory for the MemChat", - "default": false - }, - "enable_parametric_memory": { - "type": "boolean", - "title": "Enable Parametric Memory", - "description": "Enable parametric memory for the MemChat", - "default": false - }, - "enable_preference_memory": { - "type": "boolean", - "title": "Enable Preference Memory", - "description": "Enable preference memory for the MemChat", - "default": false - }, - "enable_mem_scheduler": { - "type": "boolean", - "title": "Enable Mem Scheduler", - "description": "Enable memory scheduler for automated memory management", - "default": false - }, - "PRO_MODE": { - "type": "boolean", - "title": "Pro Mode", - "description": "Enable PRO mode for complex query decomposition", - "default": false - } - }, - "additionalProperties": false, - "type": "object", - "title": "MOSConfig" - }, - "MemCubeRegister": { - "properties": { - "user_id": { + "mem_cube_ids": { "anyOf": [ { - "type": "string" + "items": { + "type": "string" + }, + "type": "array" }, { "type": "null" } ], - "title": "User Id", - "description": "User ID for the request", - "example": "user123" - }, - "mem_cube_name_or_path": { - "type": "string", - "title": "Mem Cube Name Or Path", - "description": "Name or path of the MemCube to register.", - "example": "/path/to/cube" + "title": "Mem Cube Ids", + "description": "Cube IDs" }, - "mem_cube_id": { + "search_query": { "anyOf": [ { "type": "string" }, - { - "type": "null" - } - ], - "title": "Mem Cube Id", - "description": "ID for the MemCube", - "example": "cube123" - } - }, - "type": "object", - "required": [ - "mem_cube_name_or_path" - ], - "title": "MemCubeRegister" - }, - "MemReaderConfigFactory": { - "properties": { - "model_schema": { - "type": "string", - "title": "Model Schema", - "description": "Schema for configuration. This value will be automatically set.", - "default": "NOT_SET" - }, - "backend": { - "type": "string", - "title": "Backend", - "description": "Backend for MemReader" - }, - "config": { - "additionalProperties": true, - "type": "object", - "title": "Config", - "description": "Configuration for the MemReader backend" + { + "type": "null" + } + ], + "title": "Search Query", + "description": "Search query" } }, - "additionalProperties": false, "type": "object", "required": [ - "backend", - "config" + "user_id", + "memory_type" ], - "title": "MemReaderConfigFactory", - "description": "Factory class for creating MemReader configurations." + "title": "GetMemoryPlaygroundRequest", + "description": "Request model for getting memories." }, - "MemoryCreate": { + "GetMemoryRequest": { "properties": { + "mem_cube_id": { + "type": "string", + "title": "Mem Cube Id", + "description": "Cube ID" + }, "user_id": { "anyOf": [ { @@ -1044,92 +2900,124 @@ } ], "title": "User Id", - "description": "User ID for the request", - "example": "user123" + "description": "User ID" }, - "messages": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Message" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Messages", - "description": "List of messages to store.", - "example": [ - { - "content": "Hello", - "role": "user" - } - ] + "include_preference": { + "type": "boolean", + "title": "Include Preference", + "description": "Whether to handle preference memory", + "default": true }, - "mem_cube_id": { + "page": { "anyOf": [ { - "type": "string" + "type": "integer" }, { "type": "null" } ], - "title": "Mem Cube Id", - "description": "ID of the memory cube", - "example": "cube123" + "title": "Page", + "description": "Page number (starts from 1). If None, exports all data without pagination." }, - "memory_content": { + "page_size": { "anyOf": [ { - "type": "string" + "type": "integer" }, { "type": "null" } ], - "title": "Memory Content", - "description": "Content to store as memory", - "example": "This is a memory content" + "title": "Page Size", + "description": "Number of items per page. If None, exports all data without pagination." + } + }, + "type": "object", + "required": [ + "mem_cube_id" + ], + "title": "GetMemoryRequest", + "description": "Request model for getting memories." + }, + "GetMemoryResponse": { + "properties": { + "code": { + "type": "integer", + "title": "Code", + "description": "Response status code", + "default": 200 }, - "doc_path": { + "message": { + "type": "string", + "title": "Message", + "description": "Response message" + }, + "data": { "anyOf": [ { - "type": "string" + "additionalProperties": true, + "type": "object" }, { "type": "null" } ], - "title": "Doc Path", - "description": "Path to document to store", - "example": "/path/to/document.txt" + "title": "Data", + "description": "Response data" } }, "type": "object", - "title": "MemoryCreate" + "required": [ + "message" + ], + "title": "GetMemoryResponse", + "description": "Response model for getting memories." }, - "MemoryResponse": { + "GetUserNamesByMemoryIdsRequest": { + "properties": { + "memory_ids": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Memory Ids", + "description": "Memory IDs" + } + }, + "type": "object", + "required": [ + "memory_ids" + ], + "title": "GetUserNamesByMemoryIdsRequest", + "description": "Request model for getting user names by memory ids." + }, + "GetUserNamesByMemoryIdsResponse": { "properties": { "code": { "type": "integer", "title": "Code", "description": "Response status code", - "default": 200, - "example": 200 + "default": 200 }, "message": { "type": "string", "title": "Message", - "description": "Response message", - "example": "Operation successful" + "description": "Response message" }, "data": { "anyOf": [ { - "additionalProperties": true, + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, "type": "object" }, { @@ -1144,106 +3032,133 @@ "required": [ "message" ], - "title": "MemoryResponse", - "description": "Response model for memory operations." + "title": "GetUserNamesByMemoryIdsResponse", + "description": "Response model for getting user names by memory ids." }, - "Message": { + "HTTPValidationError": { "properties": { - "role": { + "detail": { + "items": { + "$ref": "#/components/schemas/ValidationError" + }, + "type": "array", + "title": "Detail" + } + }, + "type": "object", + "title": "HTTPValidationError" + }, + "ImageURL": { + "properties": { + "url": { "type": "string", - "title": "Role", - "description": "Role of the message (user or assistant).", - "example": "user" + "title": "Url" }, - "content": { + "detail": { "type": "string", - "title": "Content", - "description": "Message content.", - "example": "Hello, how can I help you?" + "enum": [ + "auto", + "low", + "high" + ], + "title": "Detail" } }, "type": "object", "required": [ - "role", - "content" + "url" ], - "title": "Message" + "title": "ImageURL" }, - "SchedulerConfigFactory": { + "InputAudio": { "properties": { - "model_schema": { + "data": { "type": "string", - "title": "Model Schema", - "description": "Schema for configuration. This value will be automatically set.", - "default": "NOT_SET" + "title": "Data" }, - "backend": { + "format": { "type": "string", - "title": "Backend", - "description": "Backend for scheduler" - }, - "config": { - "additionalProperties": true, - "type": "object", - "title": "Config", - "description": "Configuration for the scheduler backend" + "enum": [ + "wav", + "mp3" + ], + "title": "Format" } }, - "additionalProperties": false, "type": "object", "required": [ - "backend", - "config" + "data", + "format" ], - "title": "SchedulerConfigFactory", - "description": "Factory class for creating scheduler configurations." + "title": "InputAudio" }, - "SearchRequest": { + "MemoryResponse": { "properties": { - "user_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "User Id", - "description": "User ID for the request", - "example": "user123" + "code": { + "type": "integer", + "title": "Code", + "description": "Response status code", + "default": 200 }, - "query": { + "message": { "type": "string", - "title": "Query", - "description": "Search query.", - "example": "How to implement a feature?" + "title": "Message", + "description": "Response message" }, - "install_cube_ids": { + "data": { "anyOf": [ { - "items": { - "type": "string" - }, + "items": {}, "type": "array" }, { "type": "null" } ], - "title": "Install Cube Ids", - "description": "List of cube IDs to search in", - "example": [ - "cube123", - "cube456" - ] + "title": "Data", + "description": "Response data" } }, "type": "object", "required": [ - "query" + "message" + ], + "title": "MemoryResponse", + "description": "Response model for memory operations." + }, + "PermissionDict": { + "properties": { + "permissions": { + "items": { + "type": "string", + "enum": [ + "read", + "write", + "delete", + "execute" + ] + }, + "type": "array", + "title": "Permissions" + }, + "mem_cube_id": { + "type": "string", + "title": "Mem Cube Id" + } + }, + "type": "object", + "title": "PermissionDict", + "description": "Typed dictionary for chat message dictionaries." + }, + "SearchMode": { + "type": "string", + "enum": [ + "fast", + "fine", + "mixture" ], - "title": "SearchRequest" + "title": "SearchMode", + "description": "Enumeration for search modes." }, "SearchResponse": { "properties": { @@ -1251,14 +3166,12 @@ "type": "integer", "title": "Code", "description": "Response status code", - "default": 200, - "example": 200 + "default": 200 }, "message": { "type": "string", "title": "Message", - "description": "Response message", - "example": "Operation successful" + "description": "Response message" }, "data": { "anyOf": [ @@ -1281,89 +3194,165 @@ "title": "SearchResponse", "description": "Response model for search operations." }, - "SimpleResponse": { + "StatusResponse": { "properties": { "code": { "type": "integer", "title": "Code", "description": "Response status code", - "default": 200, - "example": 200 + "default": 200 }, "message": { "type": "string", "title": "Message", - "description": "Response message", - "example": "Operation successful" + "default": "Memory get status successfully" }, "data": { - "type": "null", + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/StatusResponseItem" + }, + "type": "array" + }, + { + "type": "null" + } + ], "title": "Data", "description": "Response data" } }, "type": "object", + "title": "StatusResponse", + "description": "Response model for scheduler status operations." + }, + "StatusResponseItem": { + "properties": { + "task_id": { + "type": "string", + "title": "Task Id", + "description": "The ID of the task" + }, + "status": { + "type": "string", + "enum": [ + "in_progress", + "completed", + "waiting", + "failed", + "cancelled" + ], + "title": "Status", + "description": "The current status of the task" + } + }, + "type": "object", "required": [ - "message" + "task_id", + "status" ], - "title": "SimpleResponse", - "description": "Simple response model for operations without data return." + "title": "StatusResponseItem", + "description": "Individual task status item." }, - "UserCreate": { + "SuggestionRequest": { "properties": { "user_id": { "type": "string", "title": "User Id", - "description": "User ID", - "example": "user123" + "description": "User ID" }, - "user_name": { + "mem_cube_id": { + "type": "string", + "title": "Mem Cube Id", + "description": "Cube ID" + }, + "language": { + "type": "string", + "enum": [ + "zh", + "en" + ], + "title": "Language", + "description": "Language for suggestions", + "default": "zh" + }, + "message": { "anyOf": [ { "type": "string" }, + { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/ChatCompletionSystemMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionUserMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionAssistantMessageParam" + }, + { + "$ref": "#/components/schemas/ChatCompletionToolMessageParam" + } + ] + }, + "type": "array" + }, + { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/ChatCompletionContentPartTextParam" + }, + { + "$ref": "#/components/schemas/File" + } + ] + }, + "type": "array" + }, { "type": "null" } ], - "title": "User Name", - "description": "Name of the user", - "example": "john_doe" - }, - "role": { - "type": "string", - "title": "Role", - "description": "Role of the user", - "default": "user", - "example": "user" + "title": "Message", + "description": "List of messages to store." } }, "type": "object", "required": [ - "user_id" + "user_id", + "mem_cube_id" ], - "title": "UserCreate" + "title": "SuggestionRequest", + "description": "Request model for getting suggestion queries." }, - "UserListResponse": { + "SuggestionResponse": { "properties": { "code": { "type": "integer", "title": "Code", "description": "Response status code", - "default": 200, - "example": 200 + "default": 200 }, "message": { "type": "string", "title": "Message", - "description": "Response message", - "example": "Operation successful" + "description": "Response message" }, "data": { "anyOf": [ { - "items": {}, - "type": "array" + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "object" }, { "type": "null" @@ -1377,63 +3366,170 @@ "required": [ "message" ], - "title": "UserListResponse", - "description": "Response model for user list operations." + "title": "SuggestionResponse", + "description": "Response model for suggestion operations." }, - "UserManagerConfigFactory": { + "TaskQueueData": { "properties": { - "backend": { + "user_id": { "type": "string", - "title": "Backend", - "description": "Backend for user manager", - "default": "sqlite" + "title": "User Id", + "description": "User ID the query is scoped to" + }, + "user_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "User Name", + "description": "User name if available" + }, + "mem_cube_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Mem Cube Id", + "description": "MemCube ID if a single cube is targeted; otherwise None" + }, + "stream_keys": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Stream Keys", + "description": "Matched Redis stream keys for this user" + }, + "users_count": { + "type": "integer", + "title": "Users Count", + "description": "Distinct users currently present in queue streams" + }, + "pending_tasks_count": { + "type": "integer", + "title": "Pending Tasks Count", + "description": "Count of pending (delivered, not acked) tasks" + }, + "remaining_tasks_count": { + "type": "integer", + "title": "Remaining Tasks Count", + "description": "Count of enqueued tasks (xlen)" + }, + "pending_tasks_detail": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Pending Tasks Detail", + "description": "Per-stream pending counts, formatted as '{stream_key}:{count}'" }, - "config": { - "additionalProperties": true, - "type": "object", - "title": "Config", - "description": "Configuration for the user manager backend" + "remaining_tasks_detail": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Remaining Tasks Detail", + "description": "Per-stream remaining counts, formatted as '{stream_key}:{count}'" } }, "type": "object", - "title": "UserManagerConfigFactory", - "description": "Factory for user manager configurations." + "required": [ + "user_id", + "stream_keys", + "users_count", + "pending_tasks_count", + "remaining_tasks_count", + "pending_tasks_detail", + "remaining_tasks_detail" + ], + "title": "TaskQueueData", + "description": "Queue-level metrics for scheduler tasks." }, - "UserResponse": { + "TaskQueueResponse": { "properties": { "code": { "type": "integer", "title": "Code", "description": "Response status code", - "default": 200, - "example": 200 + "default": 200 }, "message": { "type": "string", "title": "Message", - "description": "Response message", - "example": "Operation successful" + "default": "Scheduler task queue status retrieved successfully" }, "data": { "anyOf": [ { - "additionalProperties": true, - "type": "object" + "$ref": "#/components/schemas/TaskQueueData" }, { "type": "null" } ], - "title": "Data", "description": "Response data" } }, "type": "object", - "required": [ - "message" - ], - "title": "UserResponse", - "description": "Response model for user operations." + "title": "TaskQueueResponse", + "description": "Response model for scheduler task queue status." + }, + "TaskSummary": { + "properties": { + "waiting": { + "type": "integer", + "title": "Waiting", + "description": "Number of tasks waiting to run", + "default": 0 + }, + "in_progress": { + "type": "integer", + "title": "In Progress", + "description": "Number of tasks currently running", + "default": 0 + }, + "pending": { + "type": "integer", + "title": "Pending", + "description": "Number of tasks fetched by workers but not yet acknowledged", + "default": 0 + }, + "completed": { + "type": "integer", + "title": "Completed", + "description": "Number of tasks completed", + "default": 0 + }, + "failed": { + "type": "integer", + "title": "Failed", + "description": "Number of tasks failed", + "default": 0 + }, + "cancelled": { + "type": "integer", + "title": "Cancelled", + "description": "Number of tasks cancelled", + "default": 0 + }, + "total": { + "type": "integer", + "title": "Total", + "description": "Total number of tasks counted", + "default": 0 + } + }, + "type": "object", + "title": "TaskSummary", + "description": "Aggregated counts of tasks by status." }, "ValidationError": { "properties": { diff --git a/examples/basic_modules/textual_memory_internet_search_example.py b/examples/basic_modules/textual_memory_internet_search_example.py index f26d3afd8..9007d7e67 100644 --- a/examples/basic_modules/textual_memory_internet_search_example.py +++ b/examples/basic_modules/textual_memory_internet_search_example.py @@ -1,7 +1,49 @@ """ -Example: Using InternetRetrieverFactory with BochaAISearchRetriever +Textual Memory Internet Search Example +======================================= + +This example demonstrates how to use MemOS's InternetRetrieverFactory to search +the web and retrieve relevant information as memory items. + +**What you'll learn:** +- How to initialize an embedder for web content embedding +- How to configure and use BochaAI web search retriever +- How to configure and use Google Custom Search API +- How to chunk and process web content into memory items +- How to retrieve structured information from internet searches + +**Use case:** +When you need to answer questions that require real-time web information +(e.g., "What's in Alibaba's 2024 ESG report?"), this retriever can: +1. Search the web using BochaAI API or Google Custom Search API +2. Fetch and parse web page content +3. Chunk the content into manageable pieces +4. Return structured memory items with embeddings + +**Prerequisites:** +- Valid BochaAI API Key (set in environment variable: BOCHA_API_KEY) +- (Optional) Valid Google API Key and Search Engine ID for Google Custom Search + - GOOGLE_API_KEY: Get from https://console.cloud.google.com/ + - GOOGLE_SEARCH_ENGINE_ID: Get from https://programmablesearchengine.google.com/ +- Embedder service running (e.g., Ollama with nomic-embed-text) +- Internet connection for web searches + +Run this example: + # Basic test with BochaAI + export BOCHA_API_KEY='sk-your-bocha-api-key' + python examples/basic_modules/textual_memory_internet_search_example.py + + # Test with both BochaAI and Google + export BOCHA_API_KEY='sk-your-bocha-api-key' + export GOOGLE_API_KEY='your-google-api-key' + export GOOGLE_SEARCH_ENGINE_ID='your-search-engine-id' + python examples/basic_modules/textual_memory_internet_search_example.py """ +import json +import os + +from memos import log from memos.configs.embedder import EmbedderConfigFactory from memos.configs.internet_retriever import InternetRetrieverConfigFactory from memos.embedders.factory import EmbedderFactory @@ -10,43 +52,258 @@ ) -# ========= 1. Create an embedder ========= -embedder_config = EmbedderConfigFactory.model_validate( - { - "backend": "ollama", # Or "sentence_transformer", etc. - "config": { - "model_name_or_path": "nomic-embed-text:latest", - }, - } -) +logger = log.get_logger(__name__) + +# ============================================================================ +# Step 0: Setup - Load configuration files +# ============================================================================ +print("=" * 80) +print("Textual Memory Internet Search Example") +print("=" * 80) + +current_dir = os.path.dirname(os.path.abspath(__file__)) +config_dir = os.path.join(current_dir, "../data/config") + +# Load the shared tree-text memory configuration +config_path = os.path.join(config_dir, "tree_config_shared_database.json") +with open(config_path) as f: + config_data = json.load(f) + +print(f"\n✓ Loaded configuration from: {config_path}") + +# ============================================================================ +# Step 1: Initialize Embedder +# ============================================================================ +print("\n[Step 1] Initializing embedder for web content...") + +# The embedder will convert web content into vector embeddings +embedder_config = EmbedderConfigFactory.model_validate(config_data["embedder"]) embedder = EmbedderFactory.from_config(embedder_config) -# ========= 2. Create retriever config for BochaAI ========= +print(f"✓ Embedder initialized: {embedder_config.backend}") + +# ============================================================================ +# Step 2: Configure Internet Retriever (BochaAI) +# ============================================================================ +print("\n[Step 2] Configuring internet retriever...") + +# Load the simple_struct reader configuration +reader_config_path = os.path.join(config_dir, "simple_struct_reader_config.json") +with open(reader_config_path) as f: + reader_config_data = json.load(f) + +print(f"✓ Loaded reader configuration from: {reader_config_path}") + +# NOTE: You need to set your BochaAI API key here or in environment variable +# For this example, we'll read from environment variable +bocha_api_key = os.environ.get("BOCHA_API_KEY", "sk-your-bocha-api-key-here") + +if bocha_api_key == "sk-your-bocha-api-key-here": + print("⚠️ Warning: Using placeholder API key. Set BOCHA_API_KEY environment variable.") + retriever_config = InternetRetrieverConfigFactory.model_validate( { "backend": "bocha", "config": { - "api_key": "sk-xxx", # Your BochaAI API Key - "max_results": 5, - "reader": { # Reader config for chunking web content + "api_key": bocha_api_key, + "max_results": 5, # Maximum number of search results to retrieve + "reader": { + # The reader chunks web content into memory items "backend": "simple_struct", - "config": { # your simple struct reader config - }, + "config": reader_config_data, # Use loaded configuration }, }, } ) -# ========= 3. Build retriever instance via factory ========= +print(f"✓ Retriever configured: {retriever_config.backend}") +print(f" Max results per search: {retriever_config.config.max_results}") + +# ============================================================================ +# Step 3: Create Retriever Instance +# ============================================================================ +print("\n[Step 3] Creating internet retriever instance...") + retriever = InternetRetrieverFactory.from_config(retriever_config, embedder) -# ========= 4. Run BochaAI Web Search ========= -print("=== Scenario 1: Web Search (BochaAI) ===") -query_web = "Alibaba 2024 ESG report" -results_web = retriever.retrieve_from_internet(query_web) +print("✓ Retriever initialized and ready") + +# ============================================================================ +# Step 4: Perform Web Search +# ============================================================================ +print("\n[Step 4] Performing web search...") + +# Define the search query +query = "Alibaba 2024 ESG report" +print(f" 🔍 Query: '{query}'") +print(" ⏳ Searching the web and processing results...\n") + +# Execute the search +# This will: +# 1. Search using BochaAI API +# 2. Fetch web page content +# 3. Parse and chunk the content +# 4. Generate embeddings for each chunk +# 5. Return as TextualMemoryItem objects +results = retriever.retrieve_from_internet(query) + +print("✓ Search completed!") +print(f"✓ Retrieved {len(results)} memory items from web search\n") + +# ============================================================================ +# Step 5: Display Results +# ============================================================================ +print("=" * 80) +print("WEB SEARCH RESULTS") +print("=" * 80) + +if not results: + print("\n❌ No results found.") + print(" This might indicate:") + print(" - Invalid or missing BochaAI API key") + print(" - Network connectivity issues") + print(" - The query returned no relevant web pages") + print(" - The web content couldn't be parsed") +else: + for idx, item in enumerate(results, 1): + print(f"\n[Result #{idx}]") + print("-" * 80) + + # Display the memory content (truncated for readability) + content = item.memory + if len(content) > 300: + print(f"Content: {content[:300]}...") + print(f" (... {len(content) - 300} more characters)") + else: + print(f"Content: {content}") + + # Display metadata if available + if hasattr(item, "metadata") and item.metadata: + metadata = item.metadata + if hasattr(metadata, "sources") and metadata.sources: + print(f"Source: {metadata.sources[0] if metadata.sources else 'N/A'}") + + print() + +print("=" * 80) +print("Example completed successfully!") +print("=" * 80) +print("\n💡 Next steps:") +print(" - Set your BochaAI API key in environment variable: export BOCHA_API_KEY='sk-...'") +print(" - Try different search queries to test various topics") +print(" - Adjust max_results in config to control number of results") +print(" - Use the retrieved memory items in your retrieval pipeline") +print(" - Combine internet search with local memory retrieval for hybrid systems\n") + +print("\n⚠️ Note:") +print(" If you see 'No results found', make sure:") +print(" 1. Your BochaAI API key is valid and set correctly") +print(" 2. You have internet connectivity") +print(" 3. The embedder service is running\n") + +# ============================================================================ +# Step 6: Test Google Custom Search API (Optional) +# ============================================================================ +print("\n" + "=" * 80) +print("GOOGLE CUSTOM SEARCH API TEST") +print("=" * 80) + +# NOTE: You need to set your Google API key and Search Engine ID +# Get these from: https://developers.google.com/custom-search/v1/overview +google_api_key = os.environ.get("GOOGLE_API_KEY", "") +google_search_engine_id = os.environ.get("GOOGLE_SEARCH_ENGINE_ID", "") + +if google_api_key and google_search_engine_id: + print("\n[Step 6.1] Configuring Google Custom Search retriever...") + + google_retriever_config = InternetRetrieverConfigFactory.model_validate( + { + "backend": "google", + "config": { + "api_key": google_api_key, + "search_engine_id": google_search_engine_id, + "max_results": 5, # Maximum number of search results to retrieve + "num_per_request": 5, # Number of results per API request (max 10 for Google) + }, + } + ) + + print("✓ Google retriever configured") + print(f" Max results: {google_retriever_config.config.max_results}") + + print("\n[Step 6.2] Creating Google retriever instance...") + google_retriever = InternetRetrieverFactory.from_config(google_retriever_config, embedder) + print("✓ Google retriever initialized") + + print("\n[Step 6.3] Performing Google web search...") + google_query = "Python best practices 2024" + print(f" 🔍 Query: '{google_query}'") + print(" ⏳ Searching via Google Custom Search API...\n") + + google_results = google_retriever.retrieve_from_internet(google_query) + + print("✓ Google search completed!") + print(f"✓ Retrieved {len(google_results)} memory items from Google search\n") + + # Display Google search results + print("=" * 80) + print("GOOGLE SEARCH RESULTS") + print("=" * 80) + + if not google_results: + print("\n❌ No results found from Google.") + print(" This might indicate:") + print(" - Invalid Google API key or Search Engine ID") + print(" - API quota exceeded") + print(" - Network connectivity issues") + else: + for idx, item in enumerate(google_results, 1): + print(f"\n[Google Result #{idx}]") + print("-" * 80) + + # Display the memory content (truncated for readability) + content = item.memory + if len(content) > 300: + print(f"Content: {content[:300]}...") + print(f" (... {len(content) - 300} more characters)") + else: + print(f"Content: {content}") + + # Display metadata if available + if hasattr(item, "metadata") and item.metadata: + metadata = item.metadata + if hasattr(metadata, "sources") and metadata.sources: + print(f"Source: {metadata.sources[0] if metadata.sources else 'N/A'}") + + print() -print(f"Retrieved {len(results_web)} memory items.") -for idx, item in enumerate(results_web, 1): - print(f"[{idx}] {item.memory[:500]}...") # preview first 100 chars + print("=" * 80) + print("Google Search Test completed!") + print("=" * 80) +else: + print("\n⏭️ Skipping Google Custom Search API test") + print(" To enable this test, set the following environment variables:") + print(" - GOOGLE_API_KEY: Your Google API key") + print(" - GOOGLE_SEARCH_ENGINE_ID: Your Google Custom Search Engine ID (cx parameter)") + print("\n Get your credentials from:") + print(" https://developers.google.com/custom-search/v1/overview") -print("==" * 20) +print("\n" + "=" * 80) +print("ALL TESTS COMPLETED") +print("=" * 80) +print("\n💡 Summary:") +print(" ✓ Tested BochaAI web search retriever") +if google_api_key and google_search_engine_id: + print(" ✓ Tested Google Custom Search API") +else: + print(" ⏭️ Skipped Google Custom Search API (credentials not set)") +print("\n💡 Quick Start:") +print(" # Set BochaAI API key") +print(" export BOCHA_API_KEY='sk-your-bocha-api-key'") +print(" ") +print(" # Set Google Custom Search credentials (optional)") +print(" export GOOGLE_API_KEY='your-google-api-key'") +print(" export GOOGLE_SEARCH_ENGINE_ID='your-search-engine-id'") +print(" ") +print(" # Run the example") +print(" python examples/basic_modules/textual_memory_internet_search_example.py\n") diff --git a/examples/basic_modules/tree_textual_memory_recall.py b/examples/basic_modules/tree_textual_memory_recall.py index 935513784..10831cbeb 100644 --- a/examples/basic_modules/tree_textual_memory_recall.py +++ b/examples/basic_modules/tree_textual_memory_recall.py @@ -1,26 +1,152 @@ +""" +Tree Textual Memory Recall Example +=================================== + +This example demonstrates how to use MemOS's GraphMemoryRetriever to recall memories +from a shared graph database. + +**What you'll learn:** +- How to load embedder and graph database configurations +- How to insert memories into the graph store with embeddings +- How to build a ParsedTaskGoal to guide retrieval +- How to retrieve relevant memories using hybrid search + +**Use case:** +You have stored various long-term memories about a user (e.g., "Caroline") +in a graph database, and now you want to answer a natural language question +by retrieving the most relevant memories. + +Run this example: + python examples/basic_modules/tree_textual_memory_recall.py +""" + +import json +import os + from memos import log from memos.configs.embedder import EmbedderConfigFactory from memos.configs.graph_db import GraphDBConfigFactory from memos.embedders.factory import EmbedderFactory from memos.graph_dbs.factory import GraphStoreFactory -from memos.memories.textual.item import TextualMemoryItem +from memos.memories.textual.item import TextualMemoryItem, TreeNodeTextualMemoryMetadata from memos.memories.textual.tree_text_memory.retrieve.recall import GraphMemoryRetriever from memos.memories.textual.tree_text_memory.retrieve.retrieval_mid_structs import ParsedTaskGoal logger = log.get_logger(__name__) -embedder_config = EmbedderConfigFactory.model_validate( - { - "backend": "ollama", - "config": { - "model_name_or_path": "nomic-embed-text:latest", - }, - } -) +# ============================================================================ +# Step 0: Setup - Load configuration files +# ============================================================================ +print("=" * 70) +print("Tree Textual Memory Recall Example") +print("=" * 70) + +current_dir = os.path.dirname(os.path.abspath(__file__)) +config_dir = os.path.join(current_dir, "../data/config") + +# Load the shared tree-text memory configuration +# This config includes both embedder settings and graph database settings +config_path = os.path.join(config_dir, "tree_config_shared_database.json") +with open(config_path) as f: + config_data = json.load(f) + +print(f"\n✓ Loaded configuration from: {config_path}") + +# ============================================================================ +# Step 1: Initialize Embedder +# ============================================================================ +# The embedder converts text into vector embeddings for semantic search +embedder_config = EmbedderConfigFactory.model_validate(config_data["embedder"]) embedder = EmbedderFactory.from_config(embedder_config) -# Step 1: Prepare a mock ParsedTaskGoal +print(f"✓ Initialized embedder: {embedder_config.backend}") + +# ============================================================================ +# Step 2: Initialize Graph Store +# ============================================================================ +# The graph store persists memories and supports both graph queries and vector search +graph_config = GraphDBConfigFactory(**config_data["graph_db"]) +graph_store = GraphStoreFactory.from_config(graph_config) + +print(f"✓ Initialized graph store: {graph_config.backend}") + +# ============================================================================ +# Step 3: Clean up old mock data (optional) +# ============================================================================ +# If you're running this example multiple times, clean up previous test data +# to avoid duplicates. This is optional in production. +print("\nCleaning up old mock data...") +try: + if hasattr(graph_store, "delete_node_by_prams"): + graph_store.delete_node_by_prams(filter={"key": "LGBTQ support group"}) + graph_store.delete_node_by_prams(filter={"key": "LGBTQ community"}) + print("✓ Old mock data cleaned") + else: + print("⚠ Graph store doesn't support delete_node_by_prams, skipping cleanup") +except Exception as exc: + print(f"⚠ Cleanup warning: {exc}") + +# ============================================================================ +# Step 4: Insert mock memories into the graph store +# ============================================================================ +# In a real application, these would be memories extracted from user conversations +# or documents. Here we use a few hardcoded examples about "Caroline". +print("\nInserting mock memories...") + +mock_memories = [ + { + "memory": "Caroline joined the LGBTQ support group in 2023.", + "tags": ["LGBTQ", "support group"], + "key": "LGBTQ support group", + }, + { + "memory": "Caroline has been an active member of the LGBTQ community since college.", + "tags": ["LGBTQ", "community"], + "key": "LGBTQ community", + }, + { + "memory": "She attended the weekly LGBTQ support group meetings every Friday.", + "tags": ["LGBTQ", "support group", "meetings"], + "key": "LGBTQ support group", + }, +] + +for idx, mem_data in enumerate(mock_memories, 1): + # Generate embedding for this memory + mem_embedding = embedder.embed([mem_data["memory"]])[0] + + # Create a TextualMemoryItem with metadata + item = TextualMemoryItem( + memory=mem_data["memory"], + metadata=TreeNodeTextualMemoryMetadata( + memory_type="LongTermMemory", # Can be ShortTermMemory, LongTermMemory, etc. + key=mem_data["key"], + tags=mem_data["tags"], + embedding=mem_embedding, + sources=[], + ), + ) + + # Add the memory node to the graph store + graph_store.add_node(item.id, item.memory, item.metadata.model_dump()) + print(f" [{idx}/{len(mock_memories)}] Added: {mem_data['memory'][:60]}...") + +print("✓ Mock memories inserted successfully") + +# ============================================================================ +# Step 5: Define a query and retrieval goal +# ============================================================================ +# This is the natural language question we want to answer +query = "When did Caroline go to the LGBTQ support group?" +print(f"\n{'=' * 70}") +print(f"Query: {query}") +print(f"{'=' * 70}") + +# ParsedTaskGoal provides hints to guide the retrieval process: +# - memories: semantic descriptions of what we're looking for +# - keys: specific keywords to match +# - tags: categorical tags to filter by parsed_goal = ParsedTaskGoal( memories=[ "Caroline's participation in the LGBTQ community", @@ -34,37 +160,46 @@ tags=["LGBTQ", "support group"], ) -# Step 2: Initialize graph store -graph_config = GraphDBConfigFactory( - backend="neo4j", - config={ - "uri": "bolt://localhost:7687", - "user": "neo4j", - "password": "12345678", - "db_name": "caroline", - "auto_create": True, - }, -) -graph_store = GraphStoreFactory.from_config(graph_config) +# ============================================================================ +# Step 6: Perform hybrid retrieval +# ============================================================================ +# The retriever uses both semantic similarity (embeddings) and graph structure +# to find the most relevant memories +print("\nPerforming hybrid retrieval...") -# Step 6: Create embedding for query -query = "When did Caroline go to the LGBTQ support group?" query_embedding = embedder.embed([query])[0] - -# Step 7: Init memory retriever retriever = GraphMemoryRetriever(graph_store=graph_store, embedder=embedder) -# Step 8: Run hybrid retrieval retrieved_items: list[TextualMemoryItem] = retriever.retrieve( query=query, parsed_goal=parsed_goal, - top_k=10, - memory_scope="LongTermMemory", + top_k=10, # Maximum number of memories to retrieve + memory_scope="LongTermMemory", # Filter by memory type query_embedding=[query_embedding], ) -# Step 9: Print retrieved memory items -print("\n=== Retrieved Memory Items ===") -for item in retrieved_items: - print(f"ID: {item.id}") - print(f"Memory: {item.memory}") +print(f"✓ Retrieved {len(retrieved_items)} memories") + +# ============================================================================ +# Step 7: Display results +# ============================================================================ +print(f"\n{'=' * 70}") +print("Retrieved Memory Items:") +print(f"{'=' * 70}\n") + +if not retrieved_items: + print("❌ No memories retrieved.") + print(" This might indicate:") + print(" - The mock data wasn't inserted correctly") + print(" - The query doesn't match any stored memories") + print(" - The retrieval parameters are too restrictive") +else: + for idx, item in enumerate(retrieved_items, 1): + print(f"[{idx}] ID: {item.id}") + print(f" Memory: {item.memory}") + print(f" Tags: {item.metadata.tags if hasattr(item.metadata, 'tags') else 'N/A'}") + print() + +print(f"{'=' * 70}") +print("Example completed successfully!") +print(f"{'=' * 70}\n") diff --git a/examples/basic_modules/tree_textual_memory_relation_reason_detector.py b/examples/basic_modules/tree_textual_memory_relation_reason_detector.py index 72e4deb60..dd6bca67f 100644 --- a/examples/basic_modules/tree_textual_memory_relation_reason_detector.py +++ b/examples/basic_modules/tree_textual_memory_relation_reason_detector.py @@ -1,3 +1,31 @@ +""" +Tree Textual Memory Relation & Reasoning Detector Example +========================================================== + +This example demonstrates how to use MemOS's RelationAndReasoningDetector to +automatically discover relationships between memories and infer new knowledge. + +**What you'll learn:** +- How to initialize embedder, graph store, and LLM for relation detection +- How to create mock memory nodes with rich metadata +- How to detect pairwise relations between memory nodes (e.g., causal, temporal) +- How to infer new facts through multi-hop reasoning chains +- How to generate aggregate concepts from related memories +- How to identify sequential patterns (FOLLOWS relationships) + +**Use case:** +You have stored multiple facts about a user (e.g., "Caroline's work stress", +"joining support group", "improved mental health"). This detector can: +1. Find causal links: "Work stress" → "Joining support group" → "Better mental health" +2. Infer new facts: "Support groups help reduce work-related stress" +3. Build aggregate concepts: "Caroline's stress management journey" + +Run this example: + python examples/basic_modules/tree_textual_memory_relation_reason_detector.py +""" + +import json +import os import uuid from memos import log @@ -16,52 +44,79 @@ logger = log.get_logger(__name__) -# === Step 1: Initialize embedder === -embedder_config = EmbedderConfigFactory.model_validate( - { - "backend": "ollama", - "config": { - "model_name_or_path": "nomic-embed-text:latest", - }, - } -) +# ============================================================================ +# Step 0: Setup - Load configuration files +# ============================================================================ +print("=" * 80) +print("Tree Textual Memory Relation & Reasoning Detector Example") +print("=" * 80) +print("\nThis example will:") +print(" 1. Create a set of related memories about Caroline") +print(" 2. Detect causal and temporal relationships between them") +print(" 3. Infer new knowledge through reasoning chains") +print(" 4. Generate aggregate concepts") +print("=" * 80) + +current_dir = os.path.dirname(os.path.abspath(__file__)) +config_dir = os.path.join(current_dir, "../data/config") + +# Load the shared tree-text memory configuration +# This includes embedder, graph DB, and LLM configurations +config_path = os.path.join(config_dir, "tree_config_shared_database.json") +with open(config_path) as f: + config_data = json.load(f) + +print(f"\n✓ Loaded configuration from: {config_path}") + +# ============================================================================ +# Step 1: Initialize Embedder +# ============================================================================ +print("\n[Step 1] Initializing embedder...") + +embedder_config = EmbedderConfigFactory.model_validate(config_data["embedder"]) embedder = EmbedderFactory.from_config(embedder_config) -# === Step 2: Initialize Neo4j GraphStore === -graph_config = GraphDBConfigFactory( - backend="neo4j", - config={ - "uri": "bolt://localhost:7687", - "user": "neo4j", - "password": "12345678", - "db_name": "lucy4", - "auto_create": True, - }, -) +print(f"✓ Embedder initialized: {embedder_config.backend}") + +# ============================================================================ +# Step 2: Initialize Graph Store +# ============================================================================ +print("\n[Step 2] Initializing graph database...") + +# Load graph database configuration from the config file +graph_config = GraphDBConfigFactory(**config_data["graph_db"]) graph_store = GraphStoreFactory.from_config(graph_config) -# === Step 3: Initialize LLM for pairwise relation detection === -# Step 1: Load LLM config and instantiate -config = LLMConfigFactory.model_validate( - { - "backend": "ollama", - "config": { - "model_name_or_path": "qwen3:0.6b", - "temperature": 0.7, - "max_tokens": 1024, - }, - } -) -llm = LLMFactory.from_config(config) +print(f"✓ Graph store initialized: {graph_config.backend}") +print(f" Connected to: {graph_config.config.get('uri', 'N/A')}") +print(f" Database: {graph_config.config.get('db_name', 'N/A')}") + +# ============================================================================ +# Step 3: Initialize LLM +# ============================================================================ +print("\n[Step 3] Initializing LLM for relation detection...") -# === Step 4: Create a mock GraphDBNode to test relation detection === +# The LLM analyzes pairs of memories to detect semantic relationships +# (e.g., "causes", "leads to", "happens before", etc.) +# We use the extractor_llm from the config file +llm_config = LLMConfigFactory.model_validate(config_data["extractor_llm"]) +llm = LLMFactory.from_config(llm_config) +print(f"✓ LLM initialized: {llm_config.backend}") + +# ============================================================================ +# Step 4: Create Mock Memory Nodes +# ============================================================================ +print("\n[Step 4] Creating mock memory nodes...") +print(" Building a scenario about Caroline's stress and support journey...\n") + +# Node A: Caroline's work stress node_a = GraphDBNode( id=str(uuid.uuid4()), memory="Caroline faced increased workload stress during the project deadline.", metadata=TreeNodeTextualMemoryMetadata( memory_type="LongTermMemory", - embedding=[0.1] * 10, + embedding=[0.1] * 10, # Placeholder embedding (real one will be generated) key="Workload stress", tags=["stress", "workload"], type="fact", @@ -70,7 +125,7 @@ updated_at="2024-06-28T09:00:00Z", ), ) - +# Node B: Improved mental health after joining support group node_b = GraphDBNode( id=str(uuid.uuid4()), memory="After joining the support group, Caroline reported improved mental health.", @@ -85,7 +140,9 @@ updated_at="2024-07-10T12:00:00Z", ), ) +print(" ✓ Node B: Improved mental health") +# Node C: General research about support groups node_c = GraphDBNode( id=str(uuid.uuid4()), memory="Peer support groups are effective in reducing stress for LGBTQ individuals.", @@ -100,8 +157,9 @@ updated_at="2024-06-29T14:00:00Z", ), ) +print(" ✓ Node C: Support group benefits") -# === D: Work pressure ➜ stress === +# Node D: Work pressure → stress (causal chain element) node_d = GraphDBNode( id=str(uuid.uuid4()), memory="Excessive work pressure increases stress levels among employees.", @@ -116,8 +174,9 @@ updated_at="2024-06-15T08:00:00Z", ), ) +print(" ✓ Node D: Work pressure → stress") -# === E: Stress ➜ poor sleep === +# Node E: Stress → poor sleep (causal chain element) node_e = GraphDBNode( id=str(uuid.uuid4()), memory="High stress levels often result in poor sleep quality.", @@ -132,8 +191,9 @@ updated_at="2024-06-18T10:00:00Z", ), ) +print(" ✓ Node E: Stress → poor sleep") -# === F: Poor sleep ➜ low performance === +# Node F: Poor sleep → low performance (causal chain element) node_f = GraphDBNode( id=str(uuid.uuid4()), memory="Employees with poor sleep show reduced work performance.", @@ -148,7 +208,10 @@ updated_at="2024-06-20T12:00:00Z", ), ) +print(" ✓ Node F: Poor sleep → low performance") +# Main Node: The central fact we want to analyze +# This node will be used as the "anchor" to find related memories node = GraphDBNode( id="a88db9ce-3c77-4e83-8d61-aa9ef95c957e", memory="Caroline joined an LGBTQ support group to cope with work-related stress.", @@ -156,7 +219,7 @@ memory_type="LongTermMemory", embedding=embedder.embed( ["Caroline joined an LGBTQ support group to cope with work-related stress."] - )[0], + )[0], # Generate real embedding for the main node key="Caroline LGBTQ stress", tags=["LGBTQ", "support group", "stress"], type="fact", @@ -165,49 +228,122 @@ updated_at="2024-07-01T10:00:00Z", ), ) +print(" ✓ Main Node: Caroline's support group action\n") +# ============================================================================ +# Step 5: Insert Nodes into Graph Store +# ============================================================================ +print("[Step 5] Inserting all nodes into graph database...") -for n in [node, node_a, node_b, node_c, node_d, node_e, node_f]: +all_nodes = [node, node_a, node_b, node_c, node_d, node_e, node_f] +for n in all_nodes: graph_store.add_node(n.id, n.memory, n.metadata.dict()) +print(f"✓ Successfully inserted {len(all_nodes)} memory nodes into the graph\n") + +# ============================================================================ +# Step 6: Initialize Relation & Reasoning Detector +# ============================================================================ +print("[Step 6] Initializing RelationAndReasoningDetector...") -# === Step 5: Initialize RelationDetector and run detection === relation_detector = RelationAndReasoningDetector( - graph_store=graph_store, llm=llm, embedder=embedder + graph_store=graph_store, + llm=llm, + embedder=embedder, ) +print("✓ Detector initialized and ready\n") + +# ============================================================================ +# Step 7: Run Relation Detection & Reasoning +# ============================================================================ +print("[Step 7] Running relation detection and reasoning...") +print(f" Analyzing relationships for: '{node.memory[:60]}...'\n") + +# This will: +# 1. Find semantically similar nodes using embeddings +# 2. Detect pairwise relations (causal, temporal, etc.) using LLM +# 3. Infer new facts through multi-hop reasoning +# 4. Generate aggregate concepts +# 5. Identify sequential patterns results = relation_detector.process_node( node=node, - exclude_ids=[node.id], # Exclude self when searching for neighbors - top_k=5, + exclude_ids=[node.id], # Don't compare the node with itself + top_k=5, # Consider top 5 most similar nodes ) -# === Step 6: Print detected relations === -print("\n=== Detected Global Relations ===") +print("✓ Analysis complete!\n") + +# ============================================================================ +# Step 8: Display Results +# ============================================================================ +print("=" * 80) +print("ANALYSIS RESULTS") +print("=" * 80) + +# Display detected pairwise relations +print("\n📊 [1] Detected Pairwise Relations") +print("-" * 80) +if results["relations"]: + for idx, rel in enumerate(results["relations"], 1): + print(f"\n Relation #{idx}:") + print(f" Source: {rel['source_id'][:8]}...") + print(f" Target: {rel['target_id'][:8]}...") + print(f" Type: {rel['relation_type']}") +else: + print(" ❌ No pairwise relations detected") + print(" Try adjusting similarity threshold or adding more related nodes") +# Display inferred new facts +print("\n\n💡 [2] Inferred New Facts (through reasoning)") +print("-" * 80) +if results["inferred_nodes"]: + for idx, inferred_node in enumerate(results["inferred_nodes"], 1): + print(f"\n Inferred Fact #{idx}:") + print(f" 💬 {inferred_node.memory}") + print(f" 📌 Sources: {inferred_node.metadata.sources}") + print(f" 🏷️ Key: {inferred_node.metadata.key}") +else: + print(" ℹ️ No new facts inferred") + print(" This is normal if relations are simple or insufficient for reasoning") -# === Step 6: Pretty-print detected results === -print("\n=== Detected Pairwise Relations ===") -for rel in results["relations"]: - print(f" Source ID: {rel['source_id']}") - print(f" Target ID: {rel['target_id']}") - print(f" Relation Type: {rel['relation_type']}") - print("------") +# Display sequence links (temporal ordering) +print("\n\n⏱️ [3] Sequence Links (FOLLOWS relationships)") +print("-" * 80) +if results["sequence_links"]: + for idx, link in enumerate(results["sequence_links"], 1): + print(f" {idx}. {link['from_id'][:8]}... → {link['to_id'][:8]}...") +else: + print(" ℹ️ No sequential patterns detected") -print("\n=== Inferred Nodes ===") -for node in results["inferred_nodes"]: - print(f" New Fact: {node.memory}") - print(f" Sources: {node.metadata.sources}") - print("------") +# Display aggregate concepts +print("\n\n🎯 [4] Aggregate Concepts") +print("-" * 80) +if results["aggregate_nodes"]: + for idx, agg in enumerate(results["aggregate_nodes"], 1): + print(f"\n Concept #{idx}:") + print(f" 📖 {agg.memory}") + print(f" 🔑 Key: {agg.metadata.key}") + print(f" 📎 Aggregates from: {agg.metadata.sources}") +else: + print(" ℹ️ No aggregate concepts generated") + print(" Aggregates are created when multiple related memories share themes") -print("\n=== Sequence Links (FOLLOWS) ===") -for link in results["sequence_links"]: - print(f" From: {link['from_id']} -> To: {link['to_id']}") - print("------") +print("\n" + "=" * 80) +print("Example completed successfully!") +print("=" * 80) +print("\n💡 Next steps:") +print(" - Modify the mock memories to test different scenarios") +print(" - Adjust top_k parameter to control how many neighbors are considered") +print(" - Experiment with different LLM models for relation detection") +print(" - Check the Neo4j database to visualize the created graph\n") print("\n=== Aggregate Concepts ===") -for agg in results["aggregate_nodes"]: - print(f" Concept Key: {agg.metadata.key}") - print(f" Concept Memory: {agg.memory}") - print(f" Sources: {agg.metadata.sources}") - print("------") +if not results["aggregate_nodes"]: + print("No aggregate concepts generated.") +else: + for agg in results["aggregate_nodes"]: + print(f" Concept Key: {agg.metadata.key}") + print(f" Concept Memory: {agg.memory}") + print(f" Sources: {agg.metadata.sources}") + print("------") diff --git a/examples/basic_modules/tree_textual_memory_task_goal_parser.py b/examples/basic_modules/tree_textual_memory_task_goal_parser.py index c36d47cf1..11c2c8087 100644 --- a/examples/basic_modules/tree_textual_memory_task_goal_parser.py +++ b/examples/basic_modules/tree_textual_memory_task_goal_parser.py @@ -1,52 +1,185 @@ +""" +Tree Textual Memory Task Goal Parser Example +============================================= + +This example demonstrates how to use MemOS's TaskGoalParser to parse natural +language queries into structured retrieval goals. + +**What you'll learn:** +- How to initialize an LLM for task parsing +- How to parse a natural language query into structured components +- The difference between "fast" and "fine" parsing modes +- How the parser extracts memories, keys, tags, and goal types + +**Use case:** +When a user asks "When did Caroline go to the LGBTQ support group?", you need to: +1. Extract semantic descriptions (memories to look for) +2. Identify key phrases and keywords +3. Determine relevant tags for filtering +4. Classify the goal type (retrieval, update, etc.) + +The TaskGoalParser does this automatically using an LLM. + +Run this example: + python examples/basic_modules/tree_textual_memory_task_goal_parser.py +""" + +import json +import os import time +from memos import log from memos.configs.llm import LLMConfigFactory from memos.llms.factory import LLMFactory from memos.memories.textual.tree_text_memory.retrieve.task_goal_parser import TaskGoalParser -# Step 1: Load LLM config and instantiate -config = LLMConfigFactory.model_validate( - { - "backend": "ollama", - "config": { - "model_name_or_path": "qwen3:0.6b", - "temperature": 0.7, - "max_tokens": 1024, - "remove_think_prefix": True, - }, - } -) -llm = LLMFactory.from_config(config) +logger = log.get_logger(__name__) + +# ============================================================================ +# Step 0: Setup - Load configuration files +# ============================================================================ +print("=" * 80) +print("Tree Textual Memory Task Goal Parser Example") +print("=" * 80) + +current_dir = os.path.dirname(os.path.abspath(__file__)) +config_dir = os.path.join(current_dir, "../data/config") + +# Load the shared tree-text memory configuration +config_path = os.path.join(config_dir, "tree_config_shared_database.json") +with open(config_path) as f: + config_data = json.load(f) + +print(f"\n✓ Loaded configuration from: {config_path}") + +# ============================================================================ +# Step 1: Initialize LLM for Task Parsing +# ============================================================================ +print("\n[Step 1] Initializing LLM for task goal parsing...") + +# The LLM will analyze the natural language query and extract structured information +# We use the extractor_llm from the config file +llm_config = LLMConfigFactory.model_validate(config_data["extractor_llm"]) +llm = LLMFactory.from_config(llm_config) + +print(f"✓ LLM initialized: {llm_config.backend}") -# Task input +# ============================================================================ +# Step 2: Define a natural language task/query +# ============================================================================ +# This is the user's question that needs to be parsed task = "When did Caroline go to the LGBTQ support group?" -parser = TaskGoalParser(llm, mode="fast") +print("\n[Step 2] Task to parse:") +print(f" 📝 '{task}'") +print() -time_init = time.time() -# Parse task goal -result = parser.parse(task) +# ============================================================================ +# Step 3: Parse using FAST mode +# ============================================================================ +print("[Step 3] Parsing with FAST mode...") +print(" (Fast mode uses a simpler prompt for quick parsing)") -# Print output -print("=== Parsed Result ===") -print("memories:", result.memories) -print("keys:", result.keys) -print("tags:", result.tags) -print("goal_type:", result.goal_type) -print("time:", time.time() - time_init) +parser = TaskGoalParser(llm) -parser = TaskGoalParser(llm, mode="fine") +time_start = time.time() +result_fast = parser.parse(task, mode="fast") +time_fast = time.time() - time_start -time_init = time.time() +print(f"✓ Fast mode parsing completed in {time_fast:.3f}s\n") -# Parse task goal -result = parser.parse(task) +# Display fast mode results +print("=" * 80) +print("FAST MODE RESULTS") +print("=" * 80) +print("\n📋 Memories (semantic descriptions):") +if result_fast.memories: + for idx, mem in enumerate(result_fast.memories, 1): + print(f" {idx}. {mem}") +else: + print(" (None extracted)") + +print("\n🔑 Keys (important keywords):") +if result_fast.keys: + for idx, key in enumerate(result_fast.keys, 1): + print(f" {idx}. {key}") +else: + print(" (None extracted)") + +print("\n🏷️ Tags (categorical labels):") +if result_fast.tags: + print(f" {', '.join(result_fast.tags)}") +else: + print(" (None extracted)") + +print(f"\n🎯 Goal Type: {result_fast.goal_type}") +print(f"⏱️ Processing Time: {time_fast:.3f}s") + +# ============================================================================ +# Step 4: Parse using FINE mode +# ============================================================================ +print(f"\n{'=' * 80}") +print("[Step 4] Parsing with FINE mode...") +print(" (Fine mode uses more detailed prompts for better accuracy)") + +time_start = time.time() +result_fine = parser.parse(task, mode="fine") +time_fine = time.time() - time_start + +print(f"✓ Fine mode parsing completed in {time_fine:.3f}s\n") + +# Display fine mode results +print("=" * 80) +print("FINE MODE RESULTS") +print("=" * 80) +print("\n📋 Memories (semantic descriptions):") +if result_fine.memories: + for idx, mem in enumerate(result_fine.memories, 1): + print(f" {idx}. {mem}") +else: + print(" (None extracted)") + +print("\n🔑 Keys (important keywords):") +if result_fine.keys: + for idx, key in enumerate(result_fine.keys, 1): + print(f" {idx}. {key}") +else: + print(" (None extracted)") + +print("\n🏷️ Tags (categorical labels):") +if result_fine.tags: + print(f" {', '.join(result_fine.tags)}") +else: + print(" (None extracted)") + +print(f"\n🎯 Goal Type: {result_fine.goal_type}") +print(f"⏱️ Processing Time: {time_fine:.3f}s") + +# ============================================================================ +# Step 5: Compare Results +# ============================================================================ +print(f"\n{'=' * 80}") +print("COMPARISON") +print("=" * 80) +print("\nSpeed:") +print(f" Fast mode: {time_fast:.3f}s") +print(f" Fine mode: {time_fine:.3f}s") +print(f" Difference: {abs(time_fast - time_fine):.3f}s") + +print("\nExtracted Components:") +print( + f" Fast mode: {len(result_fast.memories)} memories, {len(result_fast.keys)} keys, {len(result_fast.tags)} tags" +) +print( + f" Fine mode: {len(result_fine.memories)} memories, {len(result_fine.keys)} keys, {len(result_fine.tags)} tags" +) -# Print output -print("=== Parsed Result ===") -print("memories:", result.memories) -print("keys:", result.keys) -print("tags:", result.tags) -print("goal_type:", result.goal_type) -print("time:", time.time() - time_init) +print(f"\n{'=' * 80}") +print("Example completed successfully!") +print("=" * 80) +print("\n💡 Next steps:") +print(" - Try different queries to see how the parser handles various inputs") +print(" - Use the parsed result as input for GraphMemoryRetriever") +print(" - Experiment with 'fast' vs 'fine' mode based on your accuracy/speed needs") +print(" - The parsed ParsedTaskGoal can be passed directly to retrieval functions\n") diff --git a/examples/data/config/simple_struct_reader_config.json b/examples/data/config/simple_struct_reader_config.json index 8a27de457..abfcdfa92 100644 --- a/examples/data/config/simple_struct_reader_config.json +++ b/examples/data/config/simple_struct_reader_config.json @@ -1,24 +1,30 @@ { "llm": { - "backend": "ollama", + "backend": "openai", "config": { - "model_name_or_path": "qwen3:0.6b", - "temperature": 0.0, - "remove_think_prefix": true, - "max_tokens": 8192 + "model_name_or_path": "gpt-4o-mini", + "temperature": 0.8, + "max_tokens": 1024, + "top_p": 0.9, + "top_k": 50, + "api_key": "sk-xxx", + "api_base": "http://" } }, "embedder": { - "backend": "ollama", + "backend": "universal_api", "config": { - "model_name_or_path": "nomic-embed-text:latest" + "provider": "openai", + "api_key": "EMPTY", + "model_name_or_path": "bge-m3", + "base_url": "http://" } }, "chunker": { "backend": "sentence", "config": { "tokenizer_or_token_counter": "gpt2", - "chunk_size": 512, + "chunk_size": 2048, "chunk_overlap": 128, "min_sentences_per_chunk": 1 } diff --git a/examples/data/config/tree_config_shared_database.json b/examples/data/config/tree_config_shared_database.json index 889a4a592..a0a9bc3a3 100644 --- a/examples/data/config/tree_config_shared_database.json +++ b/examples/data/config/tree_config_shared_database.json @@ -1,41 +1,63 @@ { "extractor_llm": { - "backend": "ollama", + "backend": "openai", "config": { - "model_name_or_path": "qwen3:0.6b", - "temperature": 0.0, - "remove_think_prefix": true, - "max_tokens": 8192 + "model_name_or_path": "gpt-4o", + "temperature": 0.8, + "max_tokens": 1024, + "top_p": 0.9, + "top_k": 50, + "api_key": "sk-xxx", + "api_base": "http://" } }, "dispatcher_llm": { - "backend": "ollama", + "backend": "openai", "config": { - "model_name_or_path": "qwen3:0.6b", - "temperature": 0.0, - "remove_think_prefix": true, - "max_tokens": 8192 + "model_name_or_path": "gpt-4o", + "temperature": 0.8, + "max_tokens": 1024, + "top_p": 0.9, + "top_k": 50, + "api_key": "sk-xxx", + "api_base": "http://" } }, "embedder": { - "backend": "ollama", + "backend": "universal_api", "config": { - "model_name_or_path": "nomic-embed-text:latest" + "provider": "openai", + "api_key": "EMPTY", + "model_name_or_path": "bge-m3", + "base_url": "http://" + } + }, + "reranker": { + "backend": "http_bge", + "config": { + "url": "http://", + "model": "bge-reranker-v2-m3", + "timeout": 10 } }, "graph_db": { "backend": "neo4j", "config": { - "uri": "bolt://localhost:7687", + "uri": "neo4j://127.0.0.1:7687", "user": "neo4j", "password": "12345678", - "db_name": "shared-tree-textual-memory", - "user_name": "alice", + "db_name": "neo4j", + "user_name": "xxx", "auto_create": true, - "use_multi_db": false, - "embedding_dimension": 768 + "use_multi_db": true, + "embedding_dimension": 1024 } }, - "reorganize": true, + "reorganize": false, + "memory_size": { + "WorkingMemory": 200, + "LongTermMemory": 20000, + "UserMemory": 30000 + } "memory_filename": "tree_textual_memories.json" } diff --git a/examples/mem_mcp/simple_fastmcp_client.py b/examples/mem_mcp/simple_fastmcp_client.py index 1981e3066..e5c186b3b 100644 --- a/examples/mem_mcp/simple_fastmcp_client.py +++ b/examples/mem_mcp/simple_fastmcp_client.py @@ -12,66 +12,43 @@ async def main(): print("Working FastMCP Client") print("=" * 40) - async with Client("http://127.0.0.1:8000/mcp") as client: - print("Connected to MOS MCP server!") + # Connect to MCP server via HTTP + # FastMCP HTTP endpoint is at /mcp (not /mcp/v1) + async with Client("http://localhost:8002/mcp") as client: + print("Connected to MCP server") - print("Available tools:") - tools = await client.list_tools() - for tool in tools: - print("**" * 20) - print(f" - {tool.name}: {tool.description}") + print("\nTesting tool calls via Server API...") - print("Available resources:") - resources = await client.list_resources() - for resource in resources: - print(f" - {resource.uri}: {resource.description}") + # Note: 'create_user' and 'get_user_info' are not supported by the Server API. + # We assume the user already exists or the Server API handles it implicitly. + # Using a demo user ID. + user_id = "fastmcp_demo_user" - print("Testing tool calls...") - - print(" Getting user info...") - result = await client.call_tool("get_user_info", {}) - print(f" Result: {result.content[0].text}") - - print(" Creating user...") - result = await client.call_tool( - "create_user", - {"user_id": "fastmcp_user", "role": "USER", "user_name": "FastMCP Test User"}, - ) - print(f"Result: {result.content[0].text}") - - print(" register cube...") + print("\n 1. Adding memory...") result = await client.call_tool( - "register_cube", - { - "cube_name_or_path": "cube_default_user", - "user_id": "fastmcp_user", - "cube_id": "fastmcp_user", + "add_memory", + arguments={ + "memory_content": "MemOS is a great tool for memory management.", + "user_id": user_id, }, ) print(f" Result: {result}") - print(" Adding memory...") + print("\n 2. Searching memories...") result = await client.call_tool( - "add_memory", - { - "memory_content": "This is a test memory from FastMCP client.", - "cube_id": "fastmcp_user", - "user_id": "fastmcp_user", - }, + "search_memories", + arguments={"query": "MemOS", "user_id": user_id}, ) - print(f" Result: {result.content[0].text}") + print(f" Result: {result}") - print(" Searching memories...") + print("\n 3. Chatting...") result = await client.call_tool( - "search_memories", {"query": "test memory", "user_id": "fastmcp_user"} + "chat", + arguments={"query": "What is MemOS?", "user_id": user_id}, ) - print(f" Result: {result.content[0].text[:200]}...") + print(f" Result: {result}") - print(" Testing chat...") - result = await client.call_tool( - "chat", {"query": "Hello! Tell me about yourself.", "user_id": "fastmcp_user"} - ) - print(f" Result: {result.content[0].text[:200]}...") + print("\n✓ All tests completed!") if __name__ == "__main__": diff --git a/examples/mem_mcp/simple_fastmcp_serve.py b/examples/mem_mcp/simple_fastmcp_serve.py index 78c05cd05..55ad4d84d 100644 --- a/examples/mem_mcp/simple_fastmcp_serve.py +++ b/examples/mem_mcp/simple_fastmcp_serve.py @@ -1,18 +1,67 @@ import argparse +import json import os -from memos.api.mcp_serve import MOSMCPStdioServer +import requests +from dotenv import load_dotenv +from fastmcp import FastMCP + + +load_dotenv() + +# Configuration +# This points to the Server API base URL (e.g., started via server_api.py) +API_BASE_URL = os.getenv("MEMOS_API_BASE_URL", "http://localhost:8001/product") + +# Create MCP Server +mcp = FastMCP("MemOS MCP via Server API") -if __name__ == "__main__": - import argparse - from dotenv import load_dotenv +@mcp.tool() +def add_memory(memory_content: str, user_id: str, cube_id: str | None = None): + """Add memory using the Server API.""" + payload = { + "user_id": user_id, + "messages": memory_content, + "writable_cube_ids": [cube_id] if cube_id else None, + } + try: + resp = requests.post(f"{API_BASE_URL}/add", json=payload) + resp.raise_for_status() + return resp.json()["message"] + except Exception as e: + return f"Error: {e}" - load_dotenv() +@mcp.tool() +def search_memories(query: str, user_id: str, cube_ids: str | None = None): + """Search memories using the Server API.""" + payload = {"query": query, "user_id": user_id, "readable_cube_ids": cube_ids} + try: + resp = requests.post(f"{API_BASE_URL}/search", json=payload) + resp.raise_for_status() + # The Server API search response structure matches product API mostly + return json.dumps(resp.json()["data"], ensure_ascii=False) + except Exception as e: + return f"Error: {e}" + + +@mcp.tool() +def chat(query: str, user_id: str): + """Chat using the Server API.""" + payload = {"query": query, "user_id": user_id} + try: + resp = requests.post(f"{API_BASE_URL}/chat/complete", json=payload) + resp.raise_for_status() + return resp.json()["data"]["response"] + except Exception as e: + return f"Error: {e}" + + +if __name__ == "__main__": # Parse command line arguments - parser = argparse.ArgumentParser(description="MOS MCP Server") + parser = argparse.ArgumentParser(description="MOS MCP Server via API") parser.add_argument( "--transport", choices=["stdio", "http", "sse"], @@ -24,14 +73,8 @@ args = parser.parse_args() - # Set environment variables - os.environ["OPENAI_API_BASE"] = os.getenv("OPENAI_API_BASE") - os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY") - os.environ["MOS_TEXT_MEM_TYPE"] = "tree_text" # "tree_text" need set neo4j - os.environ["NEO4J_URI"] = os.getenv("NEO4J_URI") - os.environ["NEO4J_USER"] = os.getenv("NEO4J_USER") - os.environ["NEO4J_PASSWORD"] = os.getenv("NEO4J_PASSWORD") - - # Create and run MCP server - server = MOSMCPStdioServer() - server.run(transport=args.transport, host=args.host, port=args.port) + # For stdio transport, don't pass host and port + if args.transport == "stdio": + mcp.run(transport=args.transport) + else: + mcp.run(transport=args.transport, host=args.host, port=args.port) diff --git a/src/memos/api/mcp_serve.py b/src/memos/api/mcp_serve.py index 838c2a76a..ce2e41390 100644 --- a/src/memos/api/mcp_serve.py +++ b/src/memos/api/mcp_serve.py @@ -61,6 +61,19 @@ def load_default_config(user_id="default_user"): "SCHEDULER_TOP_N": "scheduler_top_n", } + # Fields that should always be kept as strings (not converted to numbers) + string_only_fields = { + "openai_api_key", + "openai_api_base", + "neo4j_uri", + "neo4j_user", + "neo4j_password", + "neo4j_db_name", + "text_mem_type", + "model_name", + "embedder_model", + } + kwargs = {"user_id": user_id} for env_key, param_key in env_mapping.items(): val = os.getenv(env_key) @@ -74,6 +87,9 @@ def load_default_config(user_id="default_user"): # Handle boolean conversions if val.lower() in ("true", "false"): kwargs[param_key] = val.lower() == "true" + # Keep certain fields as strings + elif param_key in string_only_fields: + kwargs[param_key] = val else: # Try numeric conversions (int first, then float) try: @@ -93,6 +109,10 @@ def load_default_config(user_id="default_user"): openai_api_base = kwargs.pop("openai_api_base", "https://api.openai.com/v1") text_mem_type = kwargs.pop("text_mem_type", "tree_text") + # Ensure embedder_model has a default value if not set + if "embedder_model" not in kwargs: + kwargs["embedder_model"] = os.getenv("EMBEDDER_MODEL", "nomic-embed-text:latest") + config, cube = get_default( openai_api_key=openai_api_key, openai_api_base=openai_api_base, @@ -110,6 +130,21 @@ def __init__(self): self.mos_core.register_mem_cube(cube) self._setup_tools() + +class MOSMCPServer: + """MCP Server that accepts an existing MOS instance.""" + + def __init__(self, mos_instance: MOS | None = None): + self.mcp = FastMCP("MOS Memory System") + if mos_instance is None: + # Fall back to creating from default config + config, cube = load_default_config() + self.mos_core = MOS(config=config) + self.mos_core.register_mem_cube(cube) + else: + self.mos_core = mos_instance + self._setup_tools() + def _setup_tools(self): """Setup MCP tools""" @@ -133,7 +168,10 @@ async def chat(query: str, user_id: str | None = None) -> str: response = self.mos_core.chat(query, user_id) return response except Exception as e: - return f"Chat error: {e!s}" + import traceback + + error_details = traceback.format_exc() + return f"Chat error: {e!s}\nTraceback:\n{error_details}" @self.mcp.tool() async def create_user( @@ -261,7 +299,10 @@ async def search_memories( result = self.mos_core.search(query, user_id, cube_ids) return result except Exception as e: - return {"error": str(e)} + import traceback + + error_details = traceback.format_exc() + return {"error": str(e), "traceback": error_details} @self.mcp.tool() async def add_memory( @@ -527,23 +568,24 @@ async def control_memory_scheduler(action: str) -> str: except Exception as e: return f"Error controlling memory scheduler: {e!s}" - def run(self, transport: str = "stdio", **kwargs): - """Run MCP server with specified transport""" - if transport == "stdio": - # Run stdio mode (default for local usage) - self.mcp.run(transport="stdio") - elif transport == "http": - # Run HTTP mode - host = kwargs.get("host", "localhost") - port = kwargs.get("port", 8000) - asyncio.run(self.mcp.run_http_async(host=host, port=port)) - elif transport == "sse": - # Run SSE mode (deprecated but still supported) - host = kwargs.get("host", "localhost") - port = kwargs.get("port", 8000) - self.mcp.run(transport="sse", host=host, port=port) - else: - raise ValueError(f"Unsupported transport: {transport}") + +def _run_mcp(self, transport: str = "stdio", **kwargs): + if transport == "stdio": + self.mcp.run(transport="stdio") + elif transport == "http": + host = kwargs.get("host", "localhost") + port = kwargs.get("port", 8000) + asyncio.run(self.mcp.run_http_async(host=host, port=port)) + elif transport == "sse": + host = kwargs.get("host", "localhost") + port = kwargs.get("port", 8000) + self.mcp.run(transport="sse", host=host, port=port) + else: + raise ValueError(f"Unsupported transport: {transport}") + + +MOSMCPStdioServer.run = _run_mcp +MOSMCPServer.run = _run_mcp # Usage example diff --git a/src/memos/cli.py b/src/memos/cli.py index fb3475ff3..092f2d276 100644 --- a/src/memos/cli.py +++ b/src/memos/cli.py @@ -13,7 +13,7 @@ def export_openapi(output: str) -> bool: """Export OpenAPI schema to JSON file.""" - from memos.api.start_api import app + from memos.api.server_api import app # Create directory if it doesn't exist if os.path.dirname(output): diff --git a/tests/test_openapi_sync.py b/tests/test_openapi_sync.py index 90d44dcf0..48e872d66 100644 --- a/tests/test_openapi_sync.py +++ b/tests/test_openapi_sync.py @@ -2,7 +2,7 @@ from pathlib import Path -from memos.api.start_api import app +from memos.api.server_api import app OPENAPI_JSON_PATH = Path(__file__).parent.parent / "docs" / "openapi.json" From 62ac224cbf167d26c4d4d4c8fd234e74e0cddb42 Mon Sep 17 00:00:00 2001 From: caocuilong <39516215+caocuilong@users.noreply.github.com> Date: Fri, 16 Jan 2026 15:19:09 +0800 Subject: [PATCH 36/53] Examples update (#887) * neo4j_example.py * neo4j_example.py * neo4j_example.py --- examples/basic_modules/neo4j_example.py | 73 +++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/examples/basic_modules/neo4j_example.py b/examples/basic_modules/neo4j_example.py index ea68975cc..e1c0df317 100644 --- a/examples/basic_modules/neo4j_example.py +++ b/examples/basic_modules/neo4j_example.py @@ -27,6 +27,23 @@ def embed_memory_item(memory: str) -> list[float]: return embedder.embed([memory])[0] +def get_neo4j_graph(db_name: str = "paper"): + config = GraphDBConfigFactory( + backend="neo4j", + config={ + "uri": "bolt://xxxx:7687", + "user": "neo4j", + "password": "xxxx", + "db_name": db_name, + "auto_create": True, + "embedding_dimension": 3072, + "use_multi_db": True, + }, + ) + graph = GraphStoreFactory.from_config(config) + return graph + + def example_multi_db(db_name: str = "paper"): # Step 1: Build factory config config = GraphDBConfigFactory( @@ -537,6 +554,53 @@ def example_complex_shared_db(db_name: str = "shared-traval-group-complex", comm ) +def example_complex_shared_db_search_filter(db): + embedding = embed_memory_item( + "The reward function combines " + "multiple objectives: coverage " + "maximization, energy consumption " + ) + print(f"get_node:{db.get_node(id='5364c28e-1e4b-485a-b1d5-1ba11bc5bc8b')}") + + filter_id = {"id": "a269f2bf-f4a2-43b9-aa8d-1cb2a2eb4691"} + print(f"==filter_id:{db.search_by_embedding(vector=embedding, filter=filter_id)}") + + filter_and_params = { + "and": [{"id": "a269f2bf-f4a2-43b9-aa8d-1cb2a2eb4691"}, {"source": "file123"}] + } + print( + f"==filter_and_params:{db.search_by_embedding(vector=embedding, filter=filter_and_params)}" + ) + + filter_or_params = {"or": [{"id": "a269f2bf-f4a2-43b9-aa8d-1cb2a2eb4691"}, {"id": "xxxxxxxx"}]} + print(f"==filter_or_params:{db.search_by_embedding(vector=embedding, filter=filter_or_params)}") + filter_like_params = { + "and": [ + {"memory_type": {"like": "LongTermMemory"}}, + ] + } + print( + f"==filter_like_params:{db.search_by_embedding(vector=embedding, filter=filter_like_params)}" + ) + + """ + cypher_op_map = {"gt": ">", "lt": "<", "gte": ">=", "lte": "<="} + """ + filter_lt_params = { + "and": [ + {"created_at": {"gt": "2025-11-29"}}, + ] + } + print(f"==filter_lt_params:{db.search_by_embedding(vector=embedding, filter=filter_lt_params)}") + + +def example_complex_shared_db_delete_memory(db): + print("delete node") + db.delete_node(id="582de45f-8f99-4006-8062-76eea5649d94") + print("delete edge") + db.delete_edge(source_id=1, target_id=2, type="PARENT", user_name="") + + if __name__ == "__main__": print("\n=== Example: Multi-DB ===") example_multi_db(db_name="paper") @@ -544,8 +608,17 @@ def example_complex_shared_db(db_name: str = "shared-traval-group-complex", comm print("\n=== Example: Single-DB ===") example_shared_db(db_name="shared-traval-group") + print("\n=== Example: Single-DB ===") + example_shared_db(db_name="shared-traval-group") + print("\n=== Example: Single-DB-Complex ===") example_complex_shared_db(db_name="shared-traval-group-complex-new") print("\n=== Example: Single-Community-DB-Complex ===") example_complex_shared_db(db_name="paper", community=True) + + print("\n=== Example: Single-DB-Complex searchFilter ===") + db = get_neo4j_graph(db_name="paper") + example_complex_shared_db_search_filter(db) + + example_complex_shared_db_delete_memory(db) From d00a468123a3d09274bcbf7269c50290063c8aac Mon Sep 17 00:00:00 2001 From: HanshuZhou <118414084+zhouhanshu@users.noreply.github.com> Date: Fri, 16 Jan 2026 15:22:07 +0800 Subject: [PATCH 37/53] Examples memfeedback (#885) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * update example of feedback * update example of mem_feedback --------- Co-authored-by: 周函数 --- examples/mem_feedback/example_feedback.py | 248 ++++++++++++++++++++++ 1 file changed, 248 insertions(+) create mode 100644 examples/mem_feedback/example_feedback.py diff --git a/examples/mem_feedback/example_feedback.py b/examples/mem_feedback/example_feedback.py new file mode 100644 index 000000000..8f4446863 --- /dev/null +++ b/examples/mem_feedback/example_feedback.py @@ -0,0 +1,248 @@ +import json +import os +import sys + + +# Add project root to python path to ensure src modules can be imported +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "../../../src"))) + + +def init_components(): + """ + Initialize MemOS core components. + + This function is responsible for building and configuring all basic components required for MemOS operation, including: + 1. LLM (Large Language Model): Model responsible for natural language understanding and generation (e.g., GPT-4o). + 2. Embedder: Responsible for converting text into vector representations for semantic search and similarity calculation. + 3. GraphDB (Neo4j): Graph database for persistent storage of memory nodes and their relationships. + 4. MemoryManager: Memory manager responsible for memory CRUD operations. + 5. MemReader: Memory reader for parsing and processing input text. + 6. Reranker: Reranker for refining the sorting of retrieval results. + 7. Searcher: Searcher that integrates retrieval and reranking logic. + 8. FeedbackServer (SimpleMemFeedback): Feedback service core, responsible for processing user feedback and updating memory. + + Returns: + tuple: (feedback_server, memory_manager, embedder) + """ + # Lazy import to avoid E402 (module level import not at top of file) + from memos.configs.embedder import EmbedderConfigFactory + from memos.configs.graph_db import GraphDBConfigFactory + from memos.configs.llm import LLMConfigFactory + from memos.configs.mem_reader import MemReaderConfigFactory + from memos.configs.reranker import RerankerConfigFactory + from memos.embedders.factory import EmbedderFactory + from memos.graph_dbs.factory import GraphStoreFactory + from memos.llms.factory import LLMFactory + from memos.mem_feedback.simple_feedback import SimpleMemFeedback + from memos.mem_reader.factory import MemReaderFactory + from memos.memories.textual.tree_text_memory.organize.manager import MemoryManager + from memos.memories.textual.tree_text_memory.retrieve.searcher import Searcher + from memos.reranker.factory import RerankerFactory + + print("Initializing MemOS Components...") + + # 1. LLM: Configure Large Language Model, using OpenAI compatible interface + llm_config = LLMConfigFactory.model_validate( + { + "backend": "openai", + "config": { + "model_name_or_path": os.getenv("MOS_CHAT_MODEL", "gpt-4o"), + "temperature": 0.8, + "max_tokens": 1024, + "top_p": 0.9, + "top_k": 50, + "api_key": os.getenv("OPENAI_API_KEY"), + "api_base": os.getenv("OPENAI_API_BASE"), + }, + } + ) + llm = LLMFactory.from_config(llm_config) + + # 2. Embedder: Configure embedding model for generating text vectors + embedder_config = EmbedderConfigFactory.model_validate( + { + "backend": os.getenv("MOS_EMBEDDER_BACKEND", "universal_api"), + "config": { + "provider": "openai", + "api_key": os.getenv("MOS_EMBEDDER_API_KEY", "EMPTY"), + "model_name_or_path": os.getenv("MOS_EMBEDDER_MODEL", "bge-m3"), + "base_url": os.getenv("MOS_EMBEDDER_API_BASE"), + }, + } + ) + embedder = EmbedderFactory.from_config(embedder_config) + + # 3. GraphDB: Configure Neo4j graph database connection + graph_db = GraphStoreFactory.from_config( + GraphDBConfigFactory.model_validate( + { + "backend": "neo4j", + "config": { + "uri": os.getenv("NEO4J_URI", "neo4j://127.0.0.1:7687"), + "user": os.getenv("NEO4J_USER", "neo4j"), + "password": os.getenv("NEO4J_PASSWORD", "12345678"), + "db_name": os.getenv("NEO4J_DB_NAME", "neo4j"), + "user_name": "zhs", + "auto_create": True, + "use_multi_db": False, + "embedding_dimension": int(os.getenv("EMBEDDING_DIMENSION", "1024")), + }, + } + ) + ) + + # Clear test data for specific user to ensure a clean environment for each run + graph_db.clear(user_name="cube_id_001_0115") + + # 4. MemoryManager: Core memory management, coordinating storage and retrieval + memory_manager = MemoryManager(graph_db, embedder, llm, is_reorganize=False) + + # 5. MemReader: Configure memory reader, including chunking strategy + mem_reader = MemReaderFactory.from_config( + MemReaderConfigFactory.model_validate( + { + "backend": "simple_struct", + "config": { + "llm": llm_config.model_dump(), + "embedder": embedder_config.model_dump(), + "chunker": { + "backend": "sentence", + "config": { + "tokenizer_or_token_counter": "gpt2", + "chunk_size": 512, + "chunk_overlap": 128, + "min_sentences_per_chunk": 1, + }, + }, + }, + } + ) + ) + + # 6. Reranker: Configure reranker to improve retrieval relevance + mem_reranker = RerankerFactory.from_config( + RerankerConfigFactory.model_validate( + { + "backend": os.getenv("MOS_RERANKER_BACKEND", "cosine_local"), + "config": { + "level_weights": {"topic": 1.0, "concept": 1.0, "fact": 1.0}, + "level_field": "background", + }, + } + ) + ) + + # 7. Searcher: Comprehensive searcher + searcher = Searcher(llm, graph_db, embedder, mem_reranker) + + # 8. Feedback Server: Initialize feedback service, the core of this example + feedback_server = SimpleMemFeedback( + llm=llm, + embedder=embedder, + graph_store=graph_db, + memory_manager=memory_manager, + mem_reader=mem_reader, + searcher=searcher, + reranker=mem_reranker, + pref_mem=None, + ) + + return feedback_server, memory_manager, embedder + + +def main(): + """ + Main program flow: + 1. Initialize components. + 2. Simulate a conversation scenario and existing (possibly incorrect) memory. + 3. Receive user feedback (correct memory). + 4. Process feedback and update memory store. + 5. Display processing results. + """ + # Load dotenv in main to avoid affecting module import order + from dotenv import load_dotenv + + load_dotenv() + + # Lazy import to avoid E402 + from memos.mem_feedback.utils import make_mem_item + + feedback_server, memory_manager, embedder = init_components() + print("-" * 50) + print("Initialization Done. Processing Feedback...") + print("-" * 50) + + # 1. Simulate Chat History + # Simulate a conversation between user and assistant, where the assistant's response contains a statement about user preferences. + history = [ + {"role": "user", "content": "我喜欢什么水果,不喜欢什么水果"}, + {"role": "assistant", "content": "你喜欢苹果,不喜欢香蕉"}, + ] + + # 2. Simulate Initial Memory + # We manually add a memory to the database, representing what the system currently believes to be a "fact". + # This memory content is "你喜欢苹果,不喜欢香蕉", which we will later correct via feedback. + mem_text = "你喜欢苹果,不喜欢香蕉" + memory_manager.add( + [ + make_mem_item( + mem_text, + user_id="user_id_001", + user_name="cube_id_001_0115", + session_id="session_id", + tags=["fact"], + key="food_preference", + sources=[{"type": "chat"}], + background="init from chat history", + embedding=embedder.embed([mem_text])[ + 0 + ], # Generate embedding for subsequent retrieval + info={ + "user_id": "user_id_001", + "user_name": "cube_id_001_0115", + "session_id": "session_id", + }, + ) + ], + user_name="cube_id_001_0115", + mode="sync", + ) + + # 3. Feedback Input + # The user points out the previous memory is incorrect and provides the correct information. + feedback_content = "错了,实际上我喜欢的是山竹" + + print("\nChat History:") + print(json.dumps(history, ensure_ascii=False, indent=2)) + print("\nFeedback Input:") + print(feedback_content) + + # 4. Process Feedback + # Core step: Call feedback_server to process user correction information. + # The system analyzes feedback content, retrieves relevant memories, and generates update operations (e.g., add, modify, or archive old memories). + res = feedback_server.process_feedback( + user_id="user_id_001", + user_name="cube_id_001_0115", + session_id="session_id", + chat_history=history, + feedback_content=feedback_content, + feedback_time="", + async_mode="sync", + corrected_answer="", + task_id="task_id", + info={}, + ) + + # 5. Feedback Result + print("\n" + "=" * 50) + print("Feedback Result") + print("=" * 50) + + """ + Print feedback processing results, including added or updated memory operations (add/update) + """ + print(json.dumps(res, ensure_ascii=False, indent=4, default=str)) + + +if __name__ == "__main__": + main() From d25d32739f1879dbf344cec1d7401826e8dc9d09 Mon Sep 17 00:00:00 2001 From: HanshuZhou <118414084+zhouhanshu@users.noreply.github.com> Date: Fri, 16 Jan 2026 16:51:29 +0800 Subject: [PATCH 38/53] fix:examples update for mem_reader (#866) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix:examples update for mem_reader * update readme of the examples of mem_reader --------- Co-authored-by: 周函数 --- examples/mem_reader/README.md | 90 ++ examples/mem_reader/builders.py | 78 ++ .../compare_simple_vs_multimodal.py | 461 -------- .../mem_reader/multimodal_struct_reader.py | 1042 ----------------- examples/mem_reader/parser/__init__.py | 1 - examples/mem_reader/parser/config_utils.py | 132 --- .../parser/example_assistant_parser.py | 94 -- .../parser/example_file_content_parser.py | 132 --- .../parser/example_multi_modal_parser.py | 400 ------- .../parser/example_string_parser.py | 66 -- .../parser/example_system_parser.py | 158 --- .../parser/example_text_content_parser.py | 72 -- .../mem_reader/parser/example_tool_parser.py | 101 -- .../mem_reader/parser/example_user_parser.py | 135 --- examples/mem_reader/parser/print_utils.py | 11 - examples/mem_reader/parser_demos/__init__.py | 0 examples/mem_reader/parser_demos/_base.py | 76 ++ .../mem_reader/parser_demos/demo_assistant.py | 44 + .../parser_demos/demo_file_content.py | 68 ++ .../mem_reader/parser_demos/demo_image.py | 87 ++ .../parser_demos/demo_multi_modal.py | 346 ++++++ .../mem_reader/parser_demos/demo_string.py | 30 + .../mem_reader/parser_demos/demo_system.py | 41 + .../parser_demos/demo_text_content.py | 40 + examples/mem_reader/parser_demos/demo_tool.py | 28 + examples/mem_reader/parser_demos/demo_user.py | 43 + examples/mem_reader/runners/__init__.py | 0 examples/mem_reader/runners/run_multimodal.py | 139 +++ examples/mem_reader/runners/run_simple.py | 113 ++ examples/mem_reader/samples.py | 773 ++++++++++++ examples/mem_reader/settings.py | 107 ++ examples/mem_reader/simple_struct_reader.py | 831 ------------- examples/mem_reader/utils.py | 84 ++ 33 files changed, 2187 insertions(+), 3636 deletions(-) create mode 100644 examples/mem_reader/README.md create mode 100644 examples/mem_reader/builders.py delete mode 100644 examples/mem_reader/compare_simple_vs_multimodal.py delete mode 100644 examples/mem_reader/multimodal_struct_reader.py delete mode 100644 examples/mem_reader/parser/__init__.py delete mode 100644 examples/mem_reader/parser/config_utils.py delete mode 100644 examples/mem_reader/parser/example_assistant_parser.py delete mode 100644 examples/mem_reader/parser/example_file_content_parser.py delete mode 100644 examples/mem_reader/parser/example_multi_modal_parser.py delete mode 100644 examples/mem_reader/parser/example_string_parser.py delete mode 100644 examples/mem_reader/parser/example_system_parser.py delete mode 100644 examples/mem_reader/parser/example_text_content_parser.py delete mode 100644 examples/mem_reader/parser/example_tool_parser.py delete mode 100644 examples/mem_reader/parser/example_user_parser.py delete mode 100644 examples/mem_reader/parser/print_utils.py create mode 100644 examples/mem_reader/parser_demos/__init__.py create mode 100644 examples/mem_reader/parser_demos/_base.py create mode 100644 examples/mem_reader/parser_demos/demo_assistant.py create mode 100644 examples/mem_reader/parser_demos/demo_file_content.py create mode 100644 examples/mem_reader/parser_demos/demo_image.py create mode 100644 examples/mem_reader/parser_demos/demo_multi_modal.py create mode 100644 examples/mem_reader/parser_demos/demo_string.py create mode 100644 examples/mem_reader/parser_demos/demo_system.py create mode 100644 examples/mem_reader/parser_demos/demo_text_content.py create mode 100644 examples/mem_reader/parser_demos/demo_tool.py create mode 100644 examples/mem_reader/parser_demos/demo_user.py create mode 100644 examples/mem_reader/runners/__init__.py create mode 100644 examples/mem_reader/runners/run_multimodal.py create mode 100644 examples/mem_reader/runners/run_simple.py create mode 100644 examples/mem_reader/samples.py create mode 100644 examples/mem_reader/settings.py delete mode 100644 examples/mem_reader/simple_struct_reader.py create mode 100644 examples/mem_reader/utils.py diff --git a/examples/mem_reader/README.md b/examples/mem_reader/README.md new file mode 100644 index 000000000..3677d0502 --- /dev/null +++ b/examples/mem_reader/README.md @@ -0,0 +1,90 @@ +# MemReader Examples + +This directory contains examples and sample code demonstrating how to use the `MemReader` module in MemOS. `MemReader` is responsible for parsing various types of input data (text, chat history, files, images) into structured memory formats. + +## 📂 Directory Structure + +```text +examples/mem_reader/ +├── builders.py # Factory functions to initialize Reader components +├── parser_demos/ # Demos for individual parser components +│ ├── demo_image.py # Example: Parsing image content +│ ├── demo_string.py # Example: Parsing string content +│ └── ... # Other specific parser demos +├── runners/ # Main execution scripts for running examples +│ ├── run_simple.py # Runner for SimpleStructMemReader +│ └── run_multimodal.py# Runner for MultiModalStructMemReader +├── samples.py # Sample data (chat logs, test cases) +├── settings.py # Configuration management (loads from .env) +└── utils.py # Utility functions (printing, formatting) +``` + +## 🚀 Getting Started + +### 1. Configuration + +Before running the examples, ensure you have configured your environment variables. Copy the `.env.example` file in the project root to `.env` and fill in the necessary API keys. + +The `settings.py` file loads these configurations. Key variables include: +- `OPENAI_API_KEY`: For LLM and Embeddings. +- `MOS_CHAT_MODEL`: Default model for chat (e.g., `gpt-4o`). +- `MOS_EMBEDDER_MODEL`: Model for embeddings. + +### 2. Running Examples + +We provide two main runners to demonstrate different capabilities: + +#### A. Simple Reader (`run_simple.py`) + +Demonstrates the `SimpleStructMemReader`, which is optimized for text-based chat history and documents. + +**Features:** +- **Fast Mode**: Quick parsing without LLM (regex/rule-based). +- **Fine Mode**: Detailed parsing using LLM. +- **Transfer**: Converting Fast memories to Fine memories. +- **Document Parsing**: Reading text files. + +**Usage:** +```bash +python -m examples.mem_reader.runners.run_simple +``` + +#### B. Multimodal Reader (`run_multimodal.py`) + +Demonstrates the `MultiModalStructMemReader`, which handles complex inputs like images, files, and mixed content types. + +**Features:** +- Supports **String**, **Multimodal**, and **Raw** input types. +- Configurable output format (Text/JSON). +- Selectable test cases. + +**Usage:** +```bash +# Run all examples in 'fine' mode +python -m examples.mem_reader.runners.run_multimodal --example all --mode fine + +# Run specific example (e.g., multimodal inputs) +python -m examples.mem_reader.runners.run_multimodal --example multimodal + +# View help for more options +python -m examples.mem_reader.runners.run_multimodal --help +``` + +### 3. Parser Demos + +If you want to understand how specific parsers work internally (e.g., how the system parses a User message vs. an Assistant message), check the `parser_demos/` directory. + +**Usage:** +```bash +python -m examples.mem_reader.parser_demos.demo_user +python -m examples.mem_reader.parser_demos.demo_image +``` + +## 🧩 Key Components + +- **`SimpleStructMemReader`**: Best for standard text-based chat applications. It's lightweight and efficient. +- **`MultiModalStructMemReader`**: Designed for advanced agents that handle images, file attachments, and complex tool interactions. + +## 🛠️ Customization + +You can modify `settings.py` or `builders.py` to change the underlying LLM backend (e.g., switching from OpenAI to Ollama) or adjust chunking strategies. diff --git a/examples/mem_reader/builders.py b/examples/mem_reader/builders.py new file mode 100644 index 000000000..89c39a5de --- /dev/null +++ b/examples/mem_reader/builders.py @@ -0,0 +1,78 @@ +"""Builder functions for initializing MemReader components. + +This module provides factory functions to create configured instances of +LLMs, Embedders, and MemReaders, simplifying the setup process in examples. +""" + +from typing import Any + +from memos.configs.embedder import EmbedderConfigFactory +from memos.configs.llm import LLMConfigFactory +from memos.configs.mem_reader import ( + MultiModalStructMemReaderConfig, + SimpleStructMemReaderConfig, +) +from memos.configs.parser import ParserConfigFactory +from memos.embedders.factory import EmbedderFactory +from memos.llms.factory import LLMFactory +from memos.mem_reader.multi_modal_struct import MultiModalStructMemReader +from memos.mem_reader.simple_struct import SimpleStructMemReader +from memos.parsers.factory import ParserFactory + +from .settings import get_embedder_config, get_llm_config, get_reader_config + + +def build_llm_and_embedder() -> tuple[Any, Any]: + """Initialize and return configured LLM and Embedder instances.""" + llm_config_dict = get_llm_config() + embedder_config_dict = get_embedder_config() + + llm_config = LLMConfigFactory.model_validate(llm_config_dict) + embedder_config = EmbedderConfigFactory.model_validate(embedder_config_dict) + + llm = LLMFactory.from_config(llm_config) + embedder = EmbedderFactory.from_config(embedder_config) + + return embedder, llm + + +def build_file_parser() -> Any: + """Initialize and return a configured file parser (MarkItDown). + + Returns: + Configured parser instance or None if initialization fails. + """ + try: + parser_config = ParserConfigFactory.model_validate( + { + "backend": "markitdown", + "config": {}, + } + ) + return ParserFactory.from_config(parser_config) + except Exception as e: + print(f"⚠️ Warning: Could not initialize file parser: {e}") + return None + + +def build_simple_reader() -> SimpleStructMemReader: + """Initialize and return a configured SimpleStructMemReader. + + Returns: + Configured SimpleStructMemReader instance. + """ + config_dict = get_reader_config() + # Simple reader doesn't need file parser + config = SimpleStructMemReaderConfig(**config_dict) + return SimpleStructMemReader(config) + + +def build_multimodal_reader() -> MultiModalStructMemReader: + """Initialize and return a configured MultiModalStructMemReader. + + Returns: + Configured MultiModalStructMemReader instance. + """ + config_dict = get_reader_config() + config = MultiModalStructMemReaderConfig(**config_dict) + return MultiModalStructMemReader(config) diff --git a/examples/mem_reader/compare_simple_vs_multimodal.py b/examples/mem_reader/compare_simple_vs_multimodal.py deleted file mode 100644 index fa12ac211..000000000 --- a/examples/mem_reader/compare_simple_vs_multimodal.py +++ /dev/null @@ -1,461 +0,0 @@ -"""Compare SimpleStructMemReader and MultiModalStructMemReader outputs. - -This example demonstrates the differences between simple_struct and multi_modal_struct -in both fast and fine modes. -""" - -import os -import sys - -from pathlib import Path - -from dotenv import load_dotenv - -from memos.configs.mem_reader import ( - MultiModalStructMemReaderConfig, - SimpleStructMemReaderConfig, -) -from memos.memories.textual.item import TextualMemoryItem - - -# Add src directory to path -project_root = Path(__file__).parent.parent.parent -src_path = project_root / "src" -if str(src_path) not in sys.path: - sys.path.insert(0, str(src_path)) - -# Load environment variables -load_dotenv() - - -def get_reader_config() -> dict: - """Get reader configuration from environment variables.""" - openai_api_key = os.getenv("OPENAI_API_KEY") - openai_base_url = os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1") - ollama_api_base = os.getenv("OLLAMA_API_BASE", "http://localhost:11434") - - # LLM config - llm_backend = os.getenv("MEM_READER_LLM_BACKEND", "openai") - if llm_backend == "ollama": - llm_config = { - "backend": "ollama", - "config": { - "model_name_or_path": os.getenv("MEM_READER_LLM_MODEL", "qwen3:0.6b"), - "api_base": ollama_api_base, - "temperature": float(os.getenv("MEM_READER_LLM_TEMPERATURE", "0.0")), - "remove_think_prefix": os.getenv( - "MEM_READER_LLM_REMOVE_THINK_PREFIX", "true" - ).lower() - == "true", - "max_tokens": int(os.getenv("MEM_READER_LLM_MAX_TOKENS", "8192")), - }, - } - else: # openai - llm_config = { - "backend": "openai", - "config": { - "model_name_or_path": os.getenv("MEM_READER_LLM_MODEL", "gpt-4o-mini"), - "api_key": openai_api_key or os.getenv("MEMRADER_API_KEY", "EMPTY"), - "api_base": openai_base_url, - "temperature": float(os.getenv("MEM_READER_LLM_TEMPERATURE", "0.5")), - "remove_think_prefix": os.getenv( - "MEM_READER_LLM_REMOVE_THINK_PREFIX", "true" - ).lower() - == "true", - "max_tokens": int(os.getenv("MEM_READER_LLM_MAX_TOKENS", "8192")), - }, - } - - # Embedder config - embedder_backend = os.getenv( - "MEM_READER_EMBEDDER_BACKEND", os.getenv("MOS_EMBEDDER_BACKEND", "ollama") - ) - if embedder_backend == "universal_api": - embedder_config = { - "backend": "universal_api", - "config": { - "provider": os.getenv( - "MEM_READER_EMBEDDER_PROVIDER", - os.getenv("MOS_EMBEDDER_PROVIDER", "openai"), - ), - "api_key": os.getenv( - "MEM_READER_EMBEDDER_API_KEY", - os.getenv("MOS_EMBEDDER_API_KEY", openai_api_key or "sk-xxxx"), - ), - "model_name_or_path": os.getenv( - "MEM_READER_EMBEDDER_MODEL", - os.getenv("MOS_EMBEDDER_MODEL", "text-embedding-3-large"), - ), - "base_url": os.getenv( - "MEM_READER_EMBEDDER_API_BASE", - os.getenv("MOS_EMBEDDER_API_BASE", openai_base_url), - ), - }, - } - else: # ollama - embedder_config = { - "backend": "ollama", - "config": { - "model_name_or_path": os.getenv( - "MEM_READER_EMBEDDER_MODEL", - os.getenv("MOS_EMBEDDER_MODEL", "nomic-embed-text:latest"), - ), - "api_base": ollama_api_base, - }, - } - - return { - "llm": llm_config, - "embedder": embedder_config, - "chunker": { - "backend": "sentence", - "config": { - "tokenizer_or_token_counter": "gpt2", - "chunk_size": 512, - "chunk_overlap": 128, - "min_sentences_per_chunk": 1, - }, - }, - } - - -def print_memory_item(item: TextualMemoryItem, prefix: str = "", max_length: int = 500): - """Print a memory item in a readable format.""" - print(f"{prefix}Memory ID: {item.id}") - print(f"{prefix}Memory Type: {item.metadata.memory_type}") - print(f"{prefix}Tags: {item.metadata.tags}") - memory_preview = ( - item.memory[:max_length] + "..." if len(item.memory) > max_length else item.memory - ) - print(f"{prefix}Memory: {memory_preview}") - print(f"{prefix}Key: {item.metadata.key}") - if item.metadata.background: - bg_preview = ( - item.metadata.background[:max_length] + "..." - if len(item.metadata.background) > max_length - else item.metadata.background - ) - print(f"{prefix}Background: {bg_preview}") - print(f"{prefix}Sources count: {len(item.metadata.sources) if item.metadata.sources else 0}") - print() - - -def compare_readers(): - """Compare SimpleStructMemReader and MultiModalStructMemReader.""" - print("=" * 80) - print("Comparing SimpleStructMemReader vs MultiModalStructMemReader") - print("=" * 80) - print() - - # Test data - simple chat messages - scene_data = [ - [ - {"role": "user", "chat_time": "3 May 2025", "content": "I'm feeling a bit down today."}, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "I'm sorry to hear that. Do you want to talk about what's been going on?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "It's just been a tough couple of days, you know? Everything feels a bit overwhelming, and I just can't seem to shake it off.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "It sounds like you're going through a lot right now. Sometimes it helps to talk things out. Is there something specific that's been weighing on you, or is it more of a general feeling?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "It's a mix, I guess. Work's been really stressful, and on top of that, I've been feeling kinda disconnected from the people around me.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "That can be really draining, especially when you're feeling isolated on top of the stress. Do you think there's something from your past that's contributing to how you're feeling now? Sometimes our emotions are tied to older experiences.", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "Yeah, now that you mention it… I've been thinking a lot about my childhood lately. I didn't have the easiest upbringing. My parents were always busy, and I often felt like I had to figure things out on my own. I remember one winter, I got really sick with a high fever. My parents were both working, and I didn't want to bother them. I just lay in bed, crying by myself, not knowing what to do.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "That must have been very lonely. Growing up without that support can really make you feel like you have to handle everything on your own. How do you think that experience has affected you now?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "Yeah, it was really lonely. I remember spending a lot of time doing things on my own, like drawing, because it was my only way to escape. I used to draw animals, and I created my own little world on paper. It was peaceful in a way, just me and my imagination, with no outside distractions.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "Drawing sounds like a beautiful way to express yourself and find some peace in that solitude. It must have been a very quiet and private world for you. Do you think that sense of loneliness from back then has shaped how you connect with others today?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "I think it has. I've always found it hard to let others in. I feel like I have to handle everything on my own. If I rely on someone else, I feel vulnerable, and I start to feel that loneliness again.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "It sounds like this was a protective mechanism that helped you cope with your feelings of loneliness back then. But as you've grown, it seems like this pattern might not be serving you as well anymore. Have you thought about trying to break this cycle, or finding new ways to connect with others?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "I've thought about it, though it's hard. But I also know I can't keep going like this forever. Maybe it's time to seek some help.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "It's a big step, but a positive one. Exploring your emotions and past experiences could really help you understand how they've shaped your present. Therapy could be a great place to start, as it would help you connect with both yourself and others. Would you be open to trying it?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "I'm open to trying. Thank you for encouraging me. It feels like it might be a good starting point for me.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "I'm really glad to hear that. Taking that first step is always difficult, but you've made an important decision. If you need help finding the right therapist, or just want to talk, I'm here for you.", - }, - ], - [ - { - "role": "user", - "chat_time": "3 May 2025", - "content": "This week I've been feeling a bit off, especially when playing tennis. My body just doesn't feel right.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "It sounds like you've been having some physical discomfort lately. Where specifically are you feeling unwell? Is there something particular about tennis that's been difficult?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "I just feel a bit fatigued, and every time I play tennis, my movements feel off. I used to play pretty well, but lately, I've been feeling weak and my movements aren't as coordinated as they used to be.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "Physical discomfort can definitely affect performance, especially in a sport like tennis that requires quick reactions and coordination. Have you noticed anything specific that might be causing these changes? Could it be overtraining, or is there another physical issue making you feel off?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "I think it might be due to stress and lack of sleep recently. I just feel drained all the time. Plus, I've been frustrated with my tennis performance, which makes me feel even worse, like I'm stuck in a vicious cycle.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "Stress and poor sleep quality can definitely affect your physical performance, especially in sports. When you're also feeling down about your performance, it's easy to fall into a negative cycle. Have you tried anything to relieve some of the stress, or to improve your sleep?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "I've tried some relaxation techniques, like deep breathing and simple meditation, but it doesn't seem to help much. I still can't focus during tennis, and I feel like my mind is distracted by other things.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "Relaxation techniques like deep breathing and meditation can help reduce stress, but sometimes we need a more structured approach to improve both our physical and mental state. For example, you might want to focus on specific aspects of your tennis training, or adjust your rest and recovery time. Have you thought about setting smaller goals for yourself? Like focusing on a specific tennis move each day, rather than expecting perfection right away? That might help you gradually regain confidence.", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "That's a good idea. I think I've been expecting too much from myself, which just makes me more anxious. Maybe I can start with small practice sessions and gradually find my rhythm again.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "Exactly! Setting small and clear goals will help reduce pressure and give you a sense of accomplishment. And don't forget that rest is just as important—taking time to recover will help you feel better physically and mentally. Both physical and mental recovery are key to improving your performance and health.", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "Thanks, I feel like I need to rethink a few things. Maybe I really need to be kinder to myself and take things step by step.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "You're on the right track. Rethinking things and giving yourself space and patience is so important. You've already taken the first step, now just keep moving forward, one step at a time. If you need anything, I'm always here to help.", - }, - ], - [ - { - "role": "user", - "chat_time": "3 May 2025", - "content": "Yesterday at 3 PM I had a meeting with my team about the new project. We discussed the timeline and I'm concerned we won't meet the deadline of December 15th.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "I understand your concern about the project timeline. What specific challenges do you think might prevent your team from meeting the December 15th deadline?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "We have too many requirements to implement in just two weeks. The backend team needs at least until December 10th to finish their part, which leaves almost no time for testing before the deadline.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "That's definitely a tight timeline. Have you considered prioritizing the requirements to focus on the most critical features first? You might also want to discuss with stakeholders about possibly extending the deadline or reducing the scope for this initial release.", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "That's a good point. We have a follow-up meeting scheduled for tomorrow morning at 9:30 AM. I'll suggest we prioritize features and maybe propose pushing the deadline to January 5th next year.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "That sounds like a solid approach. Coming to the meeting with both a prioritization strategy and a specific alternative deadline shows you've thought through the problem carefully. It might also help to bring some data about similar past projects and how long they took to complete, if you have that information available.", - }, - ], - ] - - info = {"user_id": "test_user", "session_id": "test_session"} - - # Get config - config_dict = get_reader_config() - - # Initialize readers - print("Initializing readers...") - simple_config = SimpleStructMemReaderConfig(**config_dict) - multimodal_config = MultiModalStructMemReaderConfig(**config_dict) - - from memos.mem_reader.multi_modal_struct import MultiModalStructMemReader - from memos.mem_reader.simple_struct import SimpleStructMemReader - - simple_reader = SimpleStructMemReader(simple_config) - multimodal_reader = MultiModalStructMemReader(multimodal_config) - print("Readers initialized.\n") - print(f"Using LLM: {config_dict['llm']['backend']}") - print(f"Using Embedder: {config_dict['embedder']['backend']}") - print() - - # Test FAST mode - print("=" * 80) - print("FAST MODE COMPARISON") - print("=" * 80) - print() - - print("-" * 80) - print("SimpleStructMemReader (FAST):") - print("-" * 80) - try: - simple_fast = simple_reader.get_memory(scene_data, "chat", info, mode="fast") - if simple_fast and len(simple_fast) > 0: - for scene_idx, scene_memories in enumerate(simple_fast): - print(f"\nScene {scene_idx + 1}:") - for item_idx, item in enumerate(scene_memories): - print_memory_item(item, prefix=f" [{item_idx + 1}] ") - else: - print(" No memories generated.") - except Exception as e: - print(f" Error: {e}") - import traceback - - traceback.print_exc() - - print("\n" + "-" * 80) - print("MultiModalStructMemReader (FAST):") - print("-" * 80) - try: - multimodal_fast = multimodal_reader.get_memory(scene_data, "chat", info, mode="fast") - if multimodal_fast and len(multimodal_fast) > 0: - for scene_idx, scene_memories in enumerate(multimodal_fast): - print(f"\nScene {scene_idx + 1}:") - for item_idx, item in enumerate(scene_memories): - print_memory_item(item, prefix=f" [{item_idx + 1}] ") - else: - print(" No memories generated.") - except Exception as e: - print(f" Error: {e}") - import traceback - - traceback.print_exc() - - # Test FINE mode - print("\n" + "=" * 80) - print("FINE MODE COMPARISON") - print("=" * 80) - print() - - print("-" * 80) - print("SimpleStructMemReader (FINE):") - print("-" * 80) - try: - simple_fine = simple_reader.get_memory(scene_data, "chat", info, mode="fine") - if simple_fine and len(simple_fine) > 0: - for scene_idx, scene_memories in enumerate(simple_fine): - print(f"\nScene {scene_idx + 1}:") - for item_idx, item in enumerate(scene_memories): - print_memory_item(item, prefix=f" [{item_idx + 1}] ") - else: - print(" No memories generated.") - except Exception as e: - print(f" Error: {e}") - import traceback - - traceback.print_exc() - - print("\n" + "-" * 80) - print("MultiModalStructMemReader (FINE):") - print("-" * 80) - try: - multimodal_fine = multimodal_reader.get_memory(scene_data, "chat", info, mode="fine") - if multimodal_fine and len(multimodal_fine) > 0: - for scene_idx, scene_memories in enumerate(multimodal_fine): - print(f"\nScene {scene_idx + 1}:") - for item_idx, item in enumerate(scene_memories): - print_memory_item(item, prefix=f" [{item_idx + 1}] ") - else: - print(" No memories generated.") - except Exception as e: - print(f" Error: {e}") - import traceback - - traceback.print_exc() - - # Summary comparison - print("\n" + "=" * 80) - print("SUMMARY") - print("=" * 80) - print() - - def count_memories(memories_list): - """Count total memories across all scenes.""" - if not memories_list: - return 0 - return sum(len(scene) for scene in memories_list if scene) - - simple_fast_count = count_memories(simple_fast) if "simple_fast" in locals() else 0 - multimodal_fast_count = count_memories(multimodal_fast) if "multimodal_fast" in locals() else 0 - simple_fine_count = count_memories(simple_fine) if "simple_fine" in locals() else 0 - multimodal_fine_count = count_memories(multimodal_fine) if "multimodal_fine" in locals() else 0 - - print(f"SimpleStructMemReader FAST: {simple_fast_count} memories") - print(f"MultiModalStructMemReader FAST: {multimodal_fast_count} memories") - print(f"SimpleStructMemReader FINE: {simple_fine_count} memories") - print(f"MultiModalStructMemReader FINE: {multimodal_fine_count} memories") - print() - - print("Key Differences:") - print("1. Both readers should produce similar results for simple text messages") - print("2. MultiModalStructMemReader can handle multimodal content (images, files, etc.)") - print("3. FINE mode uses LLM to extract structured memories from aggregated windows") - print("4. FAST mode directly aggregates messages into windows without LLM processing") - - -if __name__ == "__main__": - compare_readers() diff --git a/examples/mem_reader/multimodal_struct_reader.py b/examples/mem_reader/multimodal_struct_reader.py deleted file mode 100644 index 790b13f85..000000000 --- a/examples/mem_reader/multimodal_struct_reader.py +++ /dev/null @@ -1,1042 +0,0 @@ -#!/usr/bin/env python3 -""" -MultiModalStructMemReader Example Script - -This script demonstrates various use cases for MultiModalStructMemReader, -including different message types, modes (fast/fine), and output formats. - -Usage: - python multimodal_struct_reader.py --example all - python multimodal_struct_reader.py --example string_message --mode fast - python multimodal_struct_reader.py --example multimodal --format json -""" - -import argparse -import json -import os -import sys -import time - -from pathlib import Path -from typing import Any - -from dotenv import load_dotenv - -from memos.configs.mem_reader import MultiModalStructMemReaderConfig -from memos.mem_reader.multi_modal_struct import MultiModalStructMemReader -from memos.memories.textual.item import TextualMemoryItem - - -# Add src directory to path -src_path = Path(__file__).parent.parent.parent / "src" -sys.path.insert(0, str(src_path)) - -# Load environment variables -load_dotenv() - - -# ============================================================================ -# Test Case Definitions -# ============================================================================ - - -class TestCase: - """Base class for test cases.""" - - def __init__( - self, - name: str, - description: str, - scene_data: Any, - expected_count: dict[str, int] | None = None, - ): - """ - Initialize a test case. - - Args: - name: Test case name - description: Test case description - scene_data: Scene data to test - expected_count: Expected memory count for each mode (optional) - """ - self.name = name - self.description = description - self.scene_data = scene_data - self.expected_count = expected_count or {} - - def get_info(self) -> dict[str, Any]: - """Get info dict for this test case.""" - return { - "user_id": "test_user", - "session_id": f"session_{self.name}", - "test_case": self.name, - } - - -# String message test cases -STRING_MESSAGE_CASES = [ - TestCase( - name="string_simple", - description="Simple string message", - scene_data=["今天心情不错,喝了咖啡。"], - expected_count={"fast": 1, "fine": 1}, # StringParser returns [] in - # fast mode - ), - TestCase( - name="string_multiple", - description="Multiple string messages", - scene_data=[ - "这是第一条消息。", - "这是第二条消息。", - "这是第三条消息。", - ], - ), -] - -# Standard chat message test cases -CHAT_MESSAGE_CASES = [ - TestCase( - name="chat_simple", - description="Simple chat conversation", - scene_data=[ - [ - { - "role": "user", - "content": "Hello, how are you?", - "chat_time": "2025-01-01T10:00:00Z", - }, - { - "role": "assistant", - "content": "I'm doing well, thank you!", - "chat_time": "2025-01-01T10:00:01Z", - }, - ] - ], - ), - TestCase( - name="chat_with_system", - description="Chat with system message", - scene_data=[ - [ - { - "role": "system", - "content": [{"type": "text", "text": "You are a helpful assistant."}], - "chat_time": "2025-01-01T10:00:00Z", - }, - { - "role": "user", - "content": "What's the weather?", - "chat_time": "2025-01-01T10:00:01Z", - }, - { - "role": "assistant", - "content": "I don't have access to weather data.", - "chat_time": "2025-01-01T10:00:02Z", - }, - ] - ], - ), - TestCase( - name="chat_long_conversation", - description="Long conversation with multiple turns", - scene_data=[ - [ - { - "role": "user", - "chat_time": "3 May 2025", - "content": "I'm feeling a bit down today.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "I'm sorry to hear that. Do you want to talk about what's been going on?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "It's just been a tough couple of days.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "It sounds like you're going through a lot right now.", - }, - ] - ], - ), - TestCase( - name="chat_with_list_content", - description="", - scene_data=[ - [ - { - "role": "user", - "content": [ - { - "type": "text", - "text": "我是测试base64", - }, - { - "type": "file", - "file": { - "file_data": "Hello World", - "filename": "2102b64c-25a2-481c-a940-4325496baf39.txt", - "file_id": "90ee1bcf-5295-4b75-91a4-23fe1f7ab30a", - }, - }, - { - "type": "image_url", - "image_url": { - "url": "https://play-groud-test-1.oss-cn-shanghai.aliyuncs.com/algorithmImages/2025/12/01/ce545319ba6d4d21a0aebcb75337acc3.jpeg" - }, - }, - ], - "message_id": "1995458892790317057", - } - ] - ], - ), -] - -# Tool-related test cases -TOOL_MESSAGE_CASES = [ - TestCase( - name="tool_assistant_with_calls", - description="Assistant message with tool_calls", - scene_data=[ - [ - { - "role": "assistant", - "content": None, - "tool_calls": [ - { - "id": "tool-call-weather-1", - "type": "function", - "function": { - "name": "get_weather", - "arguments": '{"location": "北京"}', - }, - } - ], - "chat_time": "2025-11-24T10:12:00Z", - "message_id": "assistant-with-call-1", - } - ] - ], - ), - TestCase( - name="tool_with_result", - description="Tool call with result message", - scene_data=[ - [ - { - "role": "assistant", - "content": None, - "tool_calls": [ - { - "id": "tool-call-weather-1", - "type": "function", - "function": { - "name": "get_weather", - "arguments": '{"location": "北京"}', - }, - } - ], - "chat_time": "2025-11-24T10:12:00Z", - }, - { - "role": "tool", - "content": "北京今天天气晴朗,温度25°C,湿度60%。", - "tool_call_id": "tool-call-weather-1", - "chat_time": "2025-11-24T10:12:05Z", - }, - ] - ], - ), - TestCase( - name="tool_custom_format", - description="Custom tool format (tool_description, tool_input, tool_output)", - scene_data=[ - [ - { - "type": "tool_description", - "name": "get_weather", - "description": "获取指定地点的当前天气信息", - "parameters": { - "type": "object", - "properties": {"location": {"type": "string", "description": "城市名称"}}, - "required": ["location"], - }, - }, - { - "type": "tool_input", - "call_id": "call_123", - "name": "get_weather", - "argument": {"location": "北京"}, - }, - { - "type": "tool_output", - "call_id": "call_123", - "name": "get_weather", - "output": {"weather": "晴朗", "temperature": 25, "humidity": 60}, - }, - ] - ], - ), -] - -# Multimodal message test cases -MULTIMODAL_MESSAGE_CASES = [ - TestCase( - name="multimodal_text_image", - description="User message with text and image", - scene_data=[ - [ - { - "role": "user", - "content": [ - {"type": "text", "text": "帮我看看这张图片大概是什么内容?"}, - { - "type": "image_url", - "image_url": { - "url": "https://example.com/mountain_lake.jpg", - "detail": "high", - }, - }, - ], - "chat_time": "2025-11-24T10:20:00Z", - "message_id": "mm-img-1", - } - ] - ], - ), - TestCase( - name="multimodal_text_file", - description="User message with text and file", - scene_data=[ - [ - { - "role": "user", - "content": [ - {"type": "text", "text": "请阅读这个PDF,总结里面的要点。"}, - {"type": "file", "file": {"file_id": "file_123", "filename": "report.pdf"}}, - ], - "chat_time": "2025-11-24T10:21:00Z", - "message_id": "mm-file-1", - } - ] - ], - ), - TestCase( - name="oss_text_file", - description="User message with text and file", - scene_data=[ - [ - { - "role": "user", - "content": [ - {"type": "text", "text": "请阅读这个PDF,总结里面的要点。"}, - { - "type": "file", - "file": { - "file_id": "file_123", - "filename": "report.pdf", - "file_data": "@http://139.196.232.20:9090/graph-test/algorithm/2025_11_13/1763043889_1763043782_PM1%E8%BD%A6%E9%97%B4PMT%E9%9D%B4%E5%8E%8B%E8%BE%B9%E5%8E%8B%E5%8E%8B%E5%8A%9B%E6%97%A0%E6%B3%95%E5%BB%BA%E7%AB%8B%E6%95%85%E9%9A%9C%E6%8A%A5%E5%91%8A20240720.md", - }, - }, - ], - "chat_time": "2025-11-24T10:21:00Z", - "message_id": "mm-file-1", - } - ] - ], - ), - TestCase( - name="pure_data_file", - description="User message with text and file", - scene_data=[ - [ - { - "role": "user", - "content": [ - {"type": "text", "text": "请阅读这个PDF,总结里面的要点。"}, - { - "type": "file", - "file": { - "file_id": "file_123", - "filename": "report.pdf", - "file_data": "明文记忆是系统与用户对话、操作等交互中动态习得,以及外部提供的、可显式管理的结构化知识形态,通常以文档、提示模板、图结构或用户规则等形式存在。它具备编辑性、可共享性与治理友好性,适合存储需要频繁修改、可审计或多方协同使用的信息。 在 MemOS 中,明文记忆可用于动态生成推理上下文、个性化偏好注入、多代理协作共享等场景,成为连接人类输入与模型认知的关键桥梁。激活记忆是指模型在推理过程中产生的瞬时性认知状态,包括 KV cache、隐藏层激活、注意力权重等中间张量结构。它通常用于维持上下文连续性、对话一致性与行为风格控制。 MemOS 将激活记忆抽象为可调度资源,支持按需唤醒、延迟卸载与结构变换。例如,某些上下文状态可以被压缩为“半结构化记忆片段”用于未来复用,也可以在任务级别转化为参数化模块,支持短期记忆的长期化演进。这一机制为模型行为一致性、风格保持与状态持续性提供了基础。", - }, - }, - ], - "chat_time": "2025-11-24T10:21:00Z", - "message_id": "mm-file-1", - } - ] - ], - ), - TestCase( - name="local_data_file", - description="User message with text and file", - scene_data=[ - [ - { - "role": "user", - "content": [ - {"type": "text", "text": "请阅读这个PDF,总结里面的要点。"}, - { - "type": "file", - "file": { - "file_id": "file_123", - "filename": "report.pdf", - "file_data": "./my_local_file/report.pdf", - }, - }, - ], - "chat_time": "2025-11-24T10:21:00Z", - "message_id": "mm-file-1", - } - ] - ], - ), - TestCase( - name="internet_file", - description="User message with text and file", - scene_data=[ - [ - { - "role": "user", - "content": [ - {"type": "text", "text": "请阅读这个PDF,总结里面的要点。"}, - { - "type": "file", - "file": { - "file_id": "file_123", - "filename": "report.pdf", - "file_data": "https://upload.wikimedia.org/wikipedia/commons/c/cb/NLC416-16jh004830-88775_%E7%B4%85%E6%A8%93%E5%A4%A2.pdf", - }, - }, - ], - "chat_time": "2025-11-24T10:21:00Z", - "message_id": "mm-file-1", - } - ] - ], - ), - TestCase( - name="multimodal_mixed", - description="Mixed multimodal message (text + file + image)", - scene_data=[ - [ - { - "role": "user", - "content": [ - {"type": "text", "text": "请同时分析这个报告和图表。"}, - { - "type": "file", - "file": {"file_id": "file_789", "filename": "analysis_report.pdf"}, - }, - { - "type": "image_url", - "image_url": {"url": "https://example.com/chart.png", "detail": "auto"}, - }, - ], - "chat_time": "2025-11-24T10:23:00Z", - "message_id": "mixed-1", - } - ] - ], - ), - TestCase( - name="multimodal_audio", - description="Audio-only message", - scene_data=[ - [ - { - "role": "user", - "content": [ - { - "type": "input_audio", - "input_audio": {"data": "base64_encoded_audio_here", "format": "mp3"}, - } - ], - "chat_time": "2025-11-24T10:22:00Z", - "message_id": "audio-1", - } - ] - ], - ), -] - -# Raw input item test cases -RAW_INPUT_CASES = [ - TestCase( - name="raw_text_items", - description="Pure text input items without dialog context", - scene_data=[ - [ - {"type": "text", "text": "这是一段独立的文本输入,没有明确的对话上下文。"}, - {"type": "text", "text": "它依然会被抽取和写入明文记忆。"}, - ] - ], - ), - TestCase( - name="raw_file_item", - description="Pure file input by file_id", - scene_data=[ - [{"type": "file", "file": {"file_id": "file_uploaded_123", "filename": "document.pdf"}}] - ], - ), - # File parameter test cases - covering all combinations - TestCase( - name="file_only_file_id", - description="File with only file_id parameter", - scene_data=[[{"type": "file", "file": {"file_id": "file_only_id_123"}}]], - ), - TestCase( - name="file_only_filename", - description="File with only filename parameter", - scene_data=[[{"type": "file", "file": {"filename": "document_only.pdf"}}]], - ), - TestCase( - name="file_only_file_data_base64", - description="File with only file_data (base64 encoded)", - scene_data=[ - [ - { - "type": "file", - "file": { - "file_data": "data:application/pdf;base64,JVBERi0xLjQKJdPr6eEKMSAwIG9iago8PAovVHlwZSAvQ2F0YWxvZwovUGFnZXMgMiAwIFIKPj4KZW5kb2JqCjIgMCBvYmoKPDwKL1R5cGUgL1BhZ2VzCi9LaWRzIFszIDAgUl0KL0NvdW50IDEKPD4KZW5kb2JqCjMgMCBvYmoKPDwKL1R5cGUgL1BhZ2UKL1BhcmVudCAyIDAgUgovTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQovUmVzb3VyY2VzIDw8Ci9Gb250IDw8Ci9GMSA0IDAgUgo+Pgo+PgovQ29udGVudHMgNSAwIFIKPj4KZW5kb2JqCjQgMCBvYmoKPDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1R5cGUxCi9CYXNlRm9udCAvSGVsdmV0aWNhCj4+CmVuZG9iag==" - }, - } - ] - ], - ), - TestCase( - name="file_only_file_data_url", - description="File with only file_data (URL)", - scene_data=[ - [ - { - "type": "file", - "file": {"file_data": "https://example.com/documents/report.pdf"}, - } - ] - ], - ), - TestCase( - name="file_only_file_data_text", - description="File with only file_data (plain text content)", - scene_data=[ - [ - { - "type": "file", - "file": { - "file_data": "This is a plain text file content. It contains multiple lines.\nLine 2 of the file.\nLine 3 of the file." - }, - } - ] - ], - ), - TestCase( - name="file_file_data_and_file_id", - description="File with file_data and file_id", - scene_data=[ - [ - { - "type": "file", - "file": { - "file_data": "https://example.com/documents/data.pdf", - "file_id": "file_with_data_123", - }, - } - ] - ], - ), - TestCase( - name="file_file_data_and_filename", - description="File with file_data and filename", - scene_data=[ - [ - { - "type": "file", - "file": { - "file_data": "This is file content with filename.", - "filename": "content_with_name.txt", - }, - } - ] - ], - ), - TestCase( - name="file_file_id_and_filename", - description="File with file_id and filename (existing case)", - scene_data=[ - [{"type": "file", "file": {"file_id": "file_uploaded_123", "filename": "document.pdf"}}] - ], - ), - TestCase( - name="file_all_parameters", - description="File with all parameters (file_data, file_id, filename)", - scene_data=[ - [ - { - "type": "file", - "file": { - "file_data": "https://example.com/documents/complete.pdf", - "file_id": "file_complete_123", - "filename": "complete_document.pdf", - }, - } - ] - ], - ), - TestCase( - name="file_no_parameters", - description="File with no parameters (should return [File: unknown])", - scene_data=[[{"type": "file", "file": {}}]], - ), -] - -# Assistant message test cases -ASSISTANT_MESSAGE_CASES = [ - TestCase( - name="assistant_with_refusal", - description="Assistant message with refusal", - scene_data=[ - [ - { - "role": "assistant", - "content": [{"type": "text", "text": "I can help you with that."}], - "refusal": "I cannot provide information about that topic.", - "chat_time": "2025-11-24T10:30:00Z", - } - ] - ], - ), - TestCase( - name="assistant_with_audio", - description="Assistant message with audio", - scene_data=[ - [ - { - "role": "assistant", - "content": "Here's the audio response.", - "audio": {"id": "audio_response_123"}, - "chat_time": "2025-11-24T10:31:00Z", - } - ] - ], - ), -] - -# All test cases organized by category -TEST_CASES = { - "string": STRING_MESSAGE_CASES, - "chat": CHAT_MESSAGE_CASES, - "tool": TOOL_MESSAGE_CASES, - "multimodal": MULTIMODAL_MESSAGE_CASES, - "raw": RAW_INPUT_CASES, - "assistant": ASSISTANT_MESSAGE_CASES, -} - -# Flattened list of all test cases -ALL_TEST_CASES = {case.name: case for cases in TEST_CASES.values() for case in cases} - - -# ============================================================================ -# Utility Functions -# ============================================================================ - - -def print_textual_memory_item(item: TextualMemoryItem, prefix: str = "", max_length: int = 500): - """Print a memory item in a readable format.""" - print(f"{prefix}Memory ID: {item.id}") - print(f"{prefix}Memory Type: {item.metadata.memory_type}") - if item.metadata.tags: - print(f"{prefix}Tags: {item.metadata.tags}") - memory_preview = ( - item.memory[:max_length] + "..." if len(item.memory) > max_length else item.memory - ) - print(f"{prefix}Memory: {memory_preview}") - if item.metadata.key: - print(f"{prefix}Key: {item.metadata.key}") - if item.metadata.sources: - sources_count = len(item.metadata.sources) if isinstance(item.metadata.sources, list) else 1 - print(f"{prefix}Sources count: {sources_count}") - print() - - -def print_textual_memory_item_json(item: TextualMemoryItem, indent: int = 2): - """Print a memory item as formatted JSON.""" - data = item.to_dict() - if "metadata" in data and "embedding" in data["metadata"]: - embedding = data["metadata"]["embedding"] - if embedding: - data["metadata"]["embedding"] = f"[vector of {len(embedding)} dimensions]" - print(json.dumps(data, indent=indent, ensure_ascii=False)) - - -def get_reader_config() -> dict[str, Any]: - """ - Get reader configuration from environment variables. - - Returns: - Configuration dictionary for MultiModalStructMemReaderConfig - """ - openai_api_key = os.getenv("OPENAI_API_KEY") - openai_base_url = os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1") - ollama_api_base = os.getenv("OLLAMA_API_BASE", "http://localhost:11434") - - # Get LLM backend and config - llm_backend = os.getenv("MEM_READER_LLM_BACKEND", "openai") - if llm_backend == "ollama": - llm_config = { - "backend": "ollama", - "config": { - "model_name_or_path": os.getenv("MEM_READER_LLM_MODEL", "qwen3:0.6b"), - "api_base": ollama_api_base, - "temperature": float(os.getenv("MEM_READER_LLM_TEMPERATURE", "0.0")), - "remove_think_prefix": os.getenv( - "MEM_READER_LLM_REMOVE_THINK_PREFIX", "true" - ).lower() - == "true", - "max_tokens": int(os.getenv("MEM_READER_LLM_MAX_TOKENS", "8192")), - }, - } - else: # openai - llm_config = { - "backend": "openai", - "config": { - "model_name_or_path": os.getenv("MEM_READER_LLM_MODEL", "gpt-4o-mini"), - "api_key": openai_api_key or os.getenv("MEMRADER_API_KEY", "EMPTY"), - "api_base": openai_base_url, - "temperature": float(os.getenv("MEM_READER_LLM_TEMPERATURE", "0.5")), - "remove_think_prefix": os.getenv( - "MEM_READER_LLM_REMOVE_THINK_PREFIX", "true" - ).lower() - == "true", - "max_tokens": int(os.getenv("MEM_READER_LLM_MAX_TOKENS", "8192")), - }, - } - - # Get embedder backend and config - embedder_backend = os.getenv( - "MEM_READER_EMBEDDER_BACKEND", os.getenv("MOS_EMBEDDER_BACKEND", "ollama") - ) - if embedder_backend == "universal_api": - embedder_config = { - "backend": "universal_api", - "config": { - "provider": os.getenv( - "MEM_READER_EMBEDDER_PROVIDER", os.getenv("MOS_EMBEDDER_PROVIDER", "openai") - ), - "api_key": os.getenv( - "MEM_READER_EMBEDDER_API_KEY", - os.getenv("MOS_EMBEDDER_API_KEY", openai_api_key or "sk-xxxx"), - ), - "model_name_or_path": os.getenv( - "MEM_READER_EMBEDDER_MODEL", - os.getenv("MOS_EMBEDDER_MODEL", "text-embedding-3-large"), - ), - "base_url": os.getenv( - "MEM_READER_EMBEDDER_API_BASE", - os.getenv("MOS_EMBEDDER_API_BASE", openai_base_url), - ), - }, - } - else: # ollama - embedder_config = { - "backend": "ollama", - "config": { - "model_name_or_path": os.getenv( - "MEM_READER_EMBEDDER_MODEL", - os.getenv("MOS_EMBEDDER_MODEL", "nomic-embed-text:latest"), - ), - "api_base": ollama_api_base, - }, - } - - # Get direct markdown hostnames from environment variable - direct_markdown_hostnames = None - env_hostnames = os.getenv("FILE_PARSER_DIRECT_MARKDOWN_HOSTNAMES", "139.196.232.20") - if env_hostnames: - direct_markdown_hostnames = [h.strip() for h in env_hostnames.split(",") if h.strip()] - - return { - "llm": llm_config, - "embedder": embedder_config, - "chunker": { - "backend": "sentence", - "config": { - "tokenizer_or_token_counter": "gpt2", - "chunk_size": 512, - "chunk_overlap": 128, - "min_sentences_per_chunk": 1, - }, - }, - "direct_markdown_hostnames": direct_markdown_hostnames, - } - - -def count_memories(memory_results: list[list[TextualMemoryItem]]) -> int: - """Count total number of memory items across all scenes.""" - return sum(len(mem_list) for mem_list in memory_results) - - -# ============================================================================ -# Main Functions -# ============================================================================ - - -def run_test_case( - test_case: TestCase, reader: MultiModalStructMemReader, mode: str = "fast", format: str = "text" -): - """ - Run a single test case. - - Args: - test_case: Test case to run - reader: MultiModalStructMemReader instance - mode: Processing mode ("fast" or "fine") - format: Output format ("text" or "json") - """ - print(f"\n{'=' * 80}") - print(f"Test Case: {test_case.name}") - print(f"Description: {test_case.description}") - print(f"Mode: {mode.upper()}") - print(f"{'=' * 80}\n") - - info = test_case.get_info() - start_time = time.time() - - try: - memory_results = reader.get_memory(test_case.scene_data, type="chat", info=info, mode=mode) - elapsed_time = time.time() - start_time - - total_count = count_memories(memory_results) - print(f"✅ Completed in {elapsed_time:.2f}s") - print(f"📊 Generated {total_count} memory items across {len(memory_results)} scenes\n") - - # Check expected count if provided - if test_case.expected_count and mode in test_case.expected_count: - expected = test_case.expected_count[mode] - if total_count == expected: - print(f"✅ Expected count matches: {expected}") - else: - print(f"⚠️ Expected {expected}, got {total_count}") - - # Print sample results - print("\nSample Results:") - print("-" * 80) - for scene_idx, mem_list in enumerate(memory_results[:3]): # Show first 3 scenes - if not mem_list: - continue - print(f"\nScene {scene_idx + 1}:") - for item_idx, item in enumerate(mem_list[:2]): # Show first 2 items per scene - print(f"\n [Item {item_idx + 1}]") - if format == "json": - print_textual_memory_item_json(item, indent=4) - else: - print_textual_memory_item(item, prefix=" ", max_length=300) - - except Exception as e: - print(f"❌ Error: {e}") - import traceback - - traceback.print_exc() - - -def run_all_test_cases(reader: MultiModalStructMemReader, mode: str = "fast", format: str = "text"): - """Run all test cases.""" - print(f"\n{'=' * 80}") - print(f"Running All Test Cases (Mode: {mode.upper()})") - print(f"{'=' * 80}\n") - - total_cases = len(ALL_TEST_CASES) - for idx, (name, test_case) in enumerate(ALL_TEST_CASES.items(), 1): - print(f"\n[{idx}/{total_cases}] Running: {name}") - run_test_case(test_case, reader, mode=mode, format=format) - - -def run_category( - category: str, reader: MultiModalStructMemReader, mode: str = "fast", format: str = "text" -): - """Run all test cases in a category.""" - if category not in TEST_CASES: - print(f"❌ Unknown category: {category}") - print(f"Available categories: {', '.join(TEST_CASES.keys())}") - return - - cases = TEST_CASES[category] - print(f"\n{'=' * 80}") - print(f"Running Category: {category.upper()} ({len(cases)} test cases)") - print(f"Mode: {mode.upper()}") - print(f"{'=' * 80}\n") - - for idx, test_case in enumerate(cases, 1): - print(f"\n[{idx}/{len(cases)}] {test_case.name}") - run_test_case(test_case, reader, mode=mode, format=format) - - -def compare_modes(test_case: TestCase, reader: MultiModalStructMemReader, format: str = "text"): - """Compare fast and fine modes for a test case.""" - print(f"\n{'=' * 80}") - print(f"Comparing Fast vs Fine Mode: {test_case.name}") - print(f"{'=' * 80}\n") - - info = test_case.get_info() - - # Fast mode - print("⚡ FAST Mode:") - print("-" * 80) - start_time = time.time() - fast_results = reader.get_memory(test_case.scene_data, type="chat", info=info, mode="fast") - fast_time = time.time() - start_time - fast_count = count_memories(fast_results) - print(f"Time: {fast_time:.2f}s, Items: {fast_count}") - - # Fine mode - print("\n🔄 FINE Mode:") - print("-" * 80) - start_time = time.time() - fine_results = reader.get_memory(test_case.scene_data, type="chat", info=info, mode="fine") - fine_time = time.time() - start_time - fine_count = count_memories(fine_results) - print(f"Time: {fine_time:.2f}s, Items: {fine_count}") - - # Comparison - print("\n📈 Comparison:") - print(f" Fast: {fast_time:.2f}s, {fast_count} items") - print(f" Fine: {fine_time:.2f}s, {fine_count} items") - if fast_time > 0: - print(f" Speed: {fine_time / fast_time:.1f}x difference") - - # Show samples - if format == "text": - print("\n--- Fast Mode Sample (first item) ---") - if fast_results and fast_results[0]: - print_textual_memory_item(fast_results[0][0], prefix=" ", max_length=300) - - print("\n--- Fine Mode Sample (first item) ---") - if fine_results and fine_results[0]: - print_textual_memory_item(fine_results[0][0], prefix=" ", max_length=300) - - -def list_test_cases(): - """List all available test cases.""" - print("\n" + "=" * 80) - print("Available Test Cases") - print("=" * 80 + "\n") - - for category, cases in TEST_CASES.items(): - print(f"📁 {category.upper()} ({len(cases)} cases):") - for case in cases: - print(f" • {case.name}: {case.description}") - print() - - -def main(): - """Main entry point.""" - parser = argparse.ArgumentParser( - description="Test MultiModalStructMemReader with various use cases", - formatter_class=argparse.RawDescriptionHelpFormatter, - epilog=""" -Examples: - # Run all test cases in fast mode - python multimodal_struct_reader.py --example all --mode fast - - # Run a specific test case - python multimodal_struct_reader.py --example chat_simple --mode fine - - # Run a category of test cases - python multimodal_struct_reader.py --example multimodal --mode fast - - # Compare fast vs fine mode - python multimodal_struct_reader.py --example chat_simple --compare - - # List all available test cases - python multimodal_struct_reader.py --list - - # Output in JSON format - python multimodal_struct_reader.py --example chat_simple --format json - """, - ) - - parser.add_argument( - "--example", - type=str, - default="oss_text_file", - help="Test case name, category name, or 'all' to run all cases (default: all)", - ) - parser.add_argument( - "--mode", - choices=["fast", "fine"], - default="fine", - help="Processing mode: fast (quick) or fine (with LLM) (default: fast)", - ) - parser.add_argument( - "--format", - choices=["text", "json"], - default="text", - help="Output format: text (readable) or json (structured) (default: text)", - ) - parser.add_argument( - "--compare", - action="store_true", - help="Compare fast and fine modes (only works with specific test case)", - ) - parser.add_argument( - "--list", - action="store_true", - help="List all available test cases and exit", - ) - parser.add_argument( - "--max-memory-length", - type=int, - default=500, - help="Maximum length of memory content to display (default: 500)", - ) - - args = parser.parse_args() - - # List test cases and exit - if args.list: - list_test_cases() - return - - # Initialize reader - print("Initializing MultiModalStructMemReader...") - try: - config_dict = get_reader_config() - reader_config = MultiModalStructMemReaderConfig.model_validate(config_dict) - reader = MultiModalStructMemReader(reader_config) - print("✅ Reader initialized\n") - except Exception as e: - print(f"❌ Failed to initialize reader: {e}") - import traceback - - traceback.print_exc() - return - - # Run test cases - if args.example == "all": - run_all_test_cases(reader, mode=args.mode, format=args.format) - elif args.example in ALL_TEST_CASES: - test_case = ALL_TEST_CASES[args.example] - if args.compare: - compare_modes(test_case, reader, format=args.format) - else: - run_test_case(test_case, reader, mode=args.mode, format=args.format) - elif args.example in TEST_CASES: - run_category(args.example, reader, mode=args.mode, format=args.format) - else: - print(f"❌ Unknown test case or category: {args.example}") - print("\nAvailable options:") - print(" Categories:", ", ".join(TEST_CASES.keys())) - print(" Test cases:", ", ".join(ALL_TEST_CASES.keys())) - print("\nUse --list to see all available test cases") - - -if __name__ == "__main__": - main() diff --git a/examples/mem_reader/parser/__init__.py b/examples/mem_reader/parser/__init__.py deleted file mode 100644 index 3a947ae89..000000000 --- a/examples/mem_reader/parser/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Parser examples for different message types.""" diff --git a/examples/mem_reader/parser/config_utils.py b/examples/mem_reader/parser/config_utils.py deleted file mode 100644 index 225b8b5b4..000000000 --- a/examples/mem_reader/parser/config_utils.py +++ /dev/null @@ -1,132 +0,0 @@ -"""Shared configuration utilities for parser examples. - -This module provides configuration functions that match the configuration -logic in examples/mem_reader/multimodal_struct_reader.py. -""" - -import os - -from typing import Any - -from memos.configs.embedder import EmbedderConfigFactory -from memos.configs.llm import LLMConfigFactory -from memos.embedders.factory import EmbedderFactory -from memos.llms.factory import LLMFactory - - -def get_reader_config() -> dict[str, Any]: - """ - Get reader configuration from environment variables. - - Returns a dictionary that can be used to create MultiModalStructMemReaderConfig. - Matches the configuration logic in examples/mem_reader/multimodal_struct_reader.py. - - Returns: - Configuration dictionary with llm, embedder, and chunker configs - """ - openai_api_key = os.getenv("OPENAI_API_KEY") - openai_base_url = os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1") - ollama_api_base = os.getenv("OLLAMA_API_BASE", "http://localhost:11434") - - # Get LLM backend and config - llm_backend = os.getenv("MEM_READER_LLM_BACKEND", "openai") - if llm_backend == "ollama": - llm_config = { - "backend": "ollama", - "config": { - "model_name_or_path": os.getenv("MEM_READER_LLM_MODEL", "qwen3:0.6b"), - "api_base": ollama_api_base, - "temperature": float(os.getenv("MEM_READER_LLM_TEMPERATURE", "0.0")), - "remove_think_prefix": os.getenv( - "MEM_READER_LLM_REMOVE_THINK_PREFIX", "true" - ).lower() - == "true", - "max_tokens": int(os.getenv("MEM_READER_LLM_MAX_TOKENS", "8192")), - }, - } - else: # openai - llm_config = { - "backend": "openai", - "config": { - "model_name_or_path": os.getenv("MEM_READER_LLM_MODEL", "gpt-4o-mini"), - "api_key": openai_api_key or os.getenv("MEMRADER_API_KEY", "EMPTY"), - "api_base": openai_base_url, - "temperature": float(os.getenv("MEM_READER_LLM_TEMPERATURE", "0.5")), - "remove_think_prefix": os.getenv( - "MEM_READER_LLM_REMOVE_THINK_PREFIX", "true" - ).lower() - == "true", - "max_tokens": int(os.getenv("MEM_READER_LLM_MAX_TOKENS", "8192")), - }, - } - - # Get embedder backend and config - embedder_backend = os.getenv( - "MEM_READER_EMBEDDER_BACKEND", os.getenv("MOS_EMBEDDER_BACKEND", "ollama") - ) - if embedder_backend == "universal_api": - embedder_config = { - "backend": "universal_api", - "config": { - "provider": os.getenv( - "MEM_READER_EMBEDDER_PROVIDER", os.getenv("MOS_EMBEDDER_PROVIDER", "openai") - ), - "api_key": os.getenv( - "MEM_READER_EMBEDDER_API_KEY", - os.getenv("MOS_EMBEDDER_API_KEY", openai_api_key or "sk-xxxx"), - ), - "model_name_or_path": os.getenv( - "MEM_READER_EMBEDDER_MODEL", - os.getenv("MOS_EMBEDDER_MODEL", "text-embedding-3-large"), - ), - "base_url": os.getenv( - "MEM_READER_EMBEDDER_API_BASE", - os.getenv("MOS_EMBEDDER_API_BASE", openai_base_url), - ), - }, - } - else: # ollama - embedder_config = { - "backend": "ollama", - "config": { - "model_name_or_path": os.getenv( - "MEM_READER_EMBEDDER_MODEL", - os.getenv("MOS_EMBEDDER_MODEL", "nomic-embed-text:latest"), - ), - "api_base": ollama_api_base, - }, - } - - return { - "llm": llm_config, - "embedder": embedder_config, - "chunker": { - "backend": "sentence", - "config": { - "tokenizer_or_token_counter": "gpt2", - "chunk_size": 512, - "chunk_overlap": 128, - "min_sentences_per_chunk": 1, - }, - }, - } - - -def init_embedder_and_llm(): - """ - Initialize embedder and LLM from environment variables. - - Returns: - Tuple of (embedder, llm) instances - """ - config_dict = get_reader_config() - - # Initialize embedder - embedder_config = EmbedderConfigFactory.model_validate(config_dict["embedder"]) - embedder = EmbedderFactory.from_config(embedder_config) - - # Initialize LLM - llm_config = LLMConfigFactory.model_validate(config_dict["llm"]) - llm = LLMFactory.from_config(llm_config) - - return embedder, llm diff --git a/examples/mem_reader/parser/example_assistant_parser.py b/examples/mem_reader/parser/example_assistant_parser.py deleted file mode 100644 index a77f04a68..000000000 --- a/examples/mem_reader/parser/example_assistant_parser.py +++ /dev/null @@ -1,94 +0,0 @@ -"""Example demonstrating AssistantParser usage. - -AssistantParser handles assistant messages in chat conversations. -""" - -import sys - -from pathlib import Path - -from dotenv import load_dotenv - -from memos.mem_reader.read_multi_modal.assistant_parser import AssistantParser - - -# Handle imports for both script and module usage -try: - from .config_utils import init_embedder_and_llm -except ImportError: - # When running as script, add parent directory to path - sys.path.insert(0, str(Path(__file__).parent)) - from config_utils import init_embedder_and_llm - -# Load environment variables -load_dotenv() - - -def main(): - """Demonstrate AssistantParser usage.""" - print("=== AssistantParser Example ===\n") - - # 1. Initialize embedder and LLM (using shared config) - embedder, llm = init_embedder_and_llm() - - # 3. Create AssistantParser - parser = AssistantParser(embedder=embedder, llm=llm) - - # 4. Example assistant messages - assistant_messages = [ - { - "role": "assistant", - "content": "I'm sorry to hear that you're feeling down. Would you like to talk about what's been going on?", - "chat_time": "2025-01-15T10:00:30", - "message_id": "msg_001", - }, - { - "role": "assistant", - "content": "Based on the document you provided, I can see several key points: 1) The project timeline, 2) Budget considerations, and 3) Resource allocation.", - "chat_time": "2025-01-15T10:05:30", - "message_id": "msg_002", - }, - { - "role": "assistant", - "content": "Here's a Python solution for your problem:\n```python\ndef solve_problem():\n return 'solution'\n```", - "chat_time": "2025-01-15T10:10:30", - "message_id": "msg_003", - }, - ] - - print("📝 Processing assistant messages:\n") - for i, message in enumerate(assistant_messages, 1): - print(f"Assistant Message {i}:") - print(f" Content: {message['content'][:60]}...") - - # Create source from assistant message - info = {"user_id": "user1", "session_id": "session1"} - source = parser.create_source(message, info) - - print(" ✅ Created SourceMessage:") - print(f" - Type: {source.type}") - print(f" - Role: {source.role}") - print(f" - Content: {source.content[:60]}...") - print(f" - Chat Time: {source.chat_time}") - print(f" - Message ID: {source.message_id}") - print() - - # Parse in fast mode - memory_items = parser.parse_fast(message, info) - print(f" 📊 Fast mode generated {len(memory_items)} memory item(s)") - if memory_items: - print(f" - Memory: {memory_items[0].memory[:60]}...") - print(f" - Memory Type: {memory_items[0].metadata.memory_type}") - print(f" - Tags: {memory_items[0].metadata.tags}") - print() - - # Rebuild assistant message from source - rebuilt = parser.rebuild_from_source(source) - print(f" 🔄 Rebuilt message: role={rebuilt['role']}, content={rebuilt['content'][:40]}...") - print() - - print("✅ AssistantParser example completed!") - - -if __name__ == "__main__": - main() diff --git a/examples/mem_reader/parser/example_file_content_parser.py b/examples/mem_reader/parser/example_file_content_parser.py deleted file mode 100644 index 06071a70c..000000000 --- a/examples/mem_reader/parser/example_file_content_parser.py +++ /dev/null @@ -1,132 +0,0 @@ -"""Example demonstrating FileContentParser usage. - -FileContentParser handles file content parts in multimodal messages (RawMessageList). -""" - -import sys - -from pathlib import Path - -from dotenv import load_dotenv - -from memos.configs.parser import ParserConfigFactory -from memos.mem_reader.read_multi_modal.file_content_parser import FileContentParser -from memos.parsers.factory import ParserFactory - - -# Handle imports for both script and module usage -try: - from .config_utils import init_embedder_and_llm -except ImportError: - # When running as script, add parent directory to path - sys.path.insert(0, str(Path(__file__).parent)) - from config_utils import init_embedder_and_llm - -# Load environment variables -load_dotenv() - - -def main(): - """Demonstrate FileContentParser usage.""" - print("=== FileContentParser Example ===\n") - - # 1. Initialize embedder and LLM (using shared config) - embedder, llm = init_embedder_and_llm() - - # 3. Initialize parser for file content parsing (optional) - try: - parser_config = ParserConfigFactory.model_validate( - { - "backend": "markitdown", - "config": {}, - } - ) - file_parser = ParserFactory.from_config(parser_config) - except Exception as e: - print(f"⚠️ Warning: Could not initialize file parser: {e}") - print(" FileContentParser will work without a parser, but file parsing will be limited.") - file_parser = None - - # 4. Create FileContentParser - parser = FileContentParser(embedder=embedder, llm=llm, parser=file_parser) - - # 5. Example file content parts - file_content_parts = [ - { - "type": "file", - "file": { - "filename": "document.pdf", - "file_id": "file_123", - "file_data": "This is the content extracted from the PDF file...", - }, - }, - { - "type": "file", - "file": { - "filename": "report.docx", - "file_id": "file_456", - "file_data": "Report content: Analysis of Q4 performance...", - }, - }, - { - "type": "file", - "file": { - "filename": "data.csv", - "file_id": "file_789", - "path": "/path/to/data.csv", # Alternative: using path instead of file_data - }, - }, - ] - - print("📝 Processing file content parts:\n") - for i, part in enumerate(file_content_parts, 1): - print(f"File Content Part {i}:") - file_info = part.get("file", {}) - print(f" Filename: {file_info.get('filename', 'unknown')}") - print(f" File ID: {file_info.get('file_id', 'N/A')}") - - # Create source from file content part - info = {"user_id": "user1", "session_id": "session1"} - source = parser.create_source(part, info) - - print(" ✅ Created SourceMessage:") - print(f" - Type: {source.type}") - print(f" - Doc Path: {source.doc_path}") - if source.content: - print(f" - Content: {source.content[:60]}...") - if hasattr(source, "original_part") and source.original_part: - print(" - Has original_part: Yes") - print() - - # Rebuild file content part from source - rebuilt = parser.rebuild_from_source(source) - print(" 🔄 Rebuilt part:") - print(f" - Type: {rebuilt['type']}") - print(f" - Filename: {rebuilt['file'].get('filename', 'N/A')}") - print() - - # 6. Example with actual file path (if parser is available) - if file_parser: - print("📄 Testing file parsing with actual file path:\n") - # Note: This is just an example - actual file parsing would require a real file - example_file_part = { - "type": "file", - "file": { - "filename": "example.txt", - "path": "examples/mem_reader/text1.txt", # Using existing test file - }, - } - - try: - source = parser.create_source(example_file_part, info) - print(f" ✅ Created SourceMessage for file: {source.doc_path}") - # The parser would parse the file content if the file exists - except Exception as e: - print(f" ⚠️ File parsing note: {e}") - print() - - print("✅ FileContentParser example completed!") - - -if __name__ == "__main__": - main() diff --git a/examples/mem_reader/parser/example_multi_modal_parser.py b/examples/mem_reader/parser/example_multi_modal_parser.py deleted file mode 100644 index 3638d8d5e..000000000 --- a/examples/mem_reader/parser/example_multi_modal_parser.py +++ /dev/null @@ -1,400 +0,0 @@ -"""Example demonstrating MultiModalParser parser selection. - -This example verifies that different input types correctly return -the corresponding parser instances. - -MessagesType Definition (from src/memos/types/general_types.py): - MessagesType = str | MessageList | RawMessageList - - Where: - - str: Simple string messages - - MessageList: list[ChatCompletionMessageParam] - ChatCompletionMessageParam = ( - ChatCompletionSystemMessageParam | - ChatCompletionUserMessageParam | - ChatCompletionAssistantMessageParam | - ChatCompletionToolMessageParam - ) - - RawMessageList: list[RawMessageDict] - RawMessageDict = ChatCompletionContentPartTextParam | File - - Note: User/Assistant messages can have multimodal content (list of parts): - - {"type": "text", "text": "..."} - - {"type": "file", "file": {...}} - - {"type": "image_url", "image_url": {...}} - - {"type": "input_audio", "input_audio": {...}} -""" - -import sys - -from pathlib import Path - -from dotenv import load_dotenv - -from memos.mem_reader.read_multi_modal.multi_modal_parser import MultiModalParser - - -# Add src directory to path for imports -project_root = Path(__file__).parent.parent.parent.parent -src_path = project_root / "src" -if str(src_path) not in sys.path: - sys.path.insert(0, str(src_path)) - - -# Handle imports for both script and module usage -try: - from .config_utils import init_embedder_and_llm -except ImportError: - # When running as script, add parent directory to path - sys.path.insert(0, str(Path(__file__).parent)) - from config_utils import init_embedder_and_llm - -# Load environment variables -load_dotenv() - - -def parser_selection(): - """Test that different input types return the correct parser.""" - print("=== MultiModalParser Parser Selection Test ===\n") - - # 1. Initialize embedder and LLM - embedder, llm = init_embedder_and_llm() - - # 2. Create MultiModalParser - parser = MultiModalParser(embedder=embedder, llm=llm) - - # 3. Test cases: different input types - test_cases = [ - # String input -> StringParser - { - "name": "String input", - "message": "This is a simple string message", - "expected_parser_type": "StringParser", - }, - # RawMessageList: text type -> TextContentParser - { - "name": "Text content part (RawMessageList)", - "message": {"type": "text", "text": "This is a text content part"}, - "expected_parser_type": "TextContentParser", - }, - # RawMessageList: file type -> FileContentParser - { - "name": "File content part (RawMessageList)", - "message": { - "type": "file", - "file": { - "filename": "example.pdf", - "file_data": "File content here", - }, - }, - "expected_parser_type": "FileContentParser", - }, - # RawMessageList: image_url type -> None (type_parsers uses "image" key, not "image_url") - { - "name": "Image content part (RawMessageList - image_url type)", - "message": { - "type": "image_url", - "image_url": { - "url": "https://example.com/image.jpg", - "detail": "auto", - }, - }, - "expected_parser_type": None, # type_parsers has "image" key, but message has "image_url" type - "should_return_none": True, - }, - # RawMessageList: input_audio type -> None (type_parsers uses "audio" key, not "input_audio") - { - "name": "Audio content part (RawMessageList - input_audio type)", - "message": { - "type": "input_audio", - "input_audio": { - "data": "base64_encoded_audio_data", - "format": "mp3", - }, - }, - "expected_parser_type": None, # type_parsers has "audio" key, but message has "input_audio" type - "should_return_none": True, - }, - # MessageList: system role -> SystemParser - { - "name": "System message", - "message": { - "role": "system", - "content": "You are a helpful assistant.", - }, - "expected_parser_type": "SystemParser", - }, - # MessageList: user role -> UserParser - { - "name": "User message (simple)", - "message": { - "role": "user", - "content": "Hello, how are you?", - }, - "expected_parser_type": "UserParser", - }, - # MessageList: user role with multimodal content -> UserParser - { - "name": "User message (multimodal with text and file)", - "message": { - "role": "user", - "content": [ - {"type": "text", "text": "What's in this image?"}, - {"type": "file", "file": {"filename": "image.jpg", "file_data": ""}}, - ], - }, - "expected_parser_type": "UserParser", - }, - # MessageList: user role with image_url content -> UserParser - { - "name": "User message (with image_url)", - "message": { - "role": "user", - "content": [ - {"type": "text", "text": "What's in this image?"}, - { - "type": "image_url", - "image_url": {"url": "https://example.com/image.jpg"}, - }, - ], - }, - "expected_parser_type": "UserParser", - }, - # MessageList: user role with input_audio content -> UserParser - { - "name": "User message (with input_audio)", - "message": { - "role": "user", - "content": [ - {"type": "text", "text": "Listen to this audio"}, - { - "type": "input_audio", - "input_audio": {"data": "base64_data", "format": "wav"}, - }, - ], - }, - "expected_parser_type": "UserParser", - }, - # MessageList: assistant role -> AssistantParser - { - "name": "Assistant message (simple)", - "message": { - "role": "assistant", - "content": "I'm doing well, thank you!", - }, - "expected_parser_type": "AssistantParser", - }, - # MessageList: assistant role with tool_calls -> AssistantParser - { - "name": "Assistant message (with tool_calls)", - "message": { - "role": "assistant", - "content": None, - "tool_calls": [ - { - "id": "call_123", - "type": "function", - "function": { - "name": "get_weather", - "arguments": '{"location": "Beijing"}', - }, - } - ], - }, - "expected_parser_type": "AssistantParser", - }, - # MessageList: tool role -> ToolParser - { - "name": "Tool message", - "message": { - "role": "tool", - "content": "Tool execution result", - "tool_call_id": "call_123", - }, - "expected_parser_type": "ToolParser", - }, - ] - - print("Testing parser selection for different input types:\n") - all_passed = True - - for i, test_case in enumerate(test_cases, 1): - message = test_case["message"] - expected_type = test_case.get("expected_parser_type") - test_name = test_case["name"] - should_return_none = test_case.get("should_return_none", False) - - # Get parser using internal method - selected_parser = parser._get_parser(message) - - # Handle cases where None is expected - if should_return_none or expected_type is None: - if selected_parser is None: - print(f"✅ Test {i}: {test_name}") - print(" Expected: None (parser not implemented yet or not found)") - print(" Got: None") - if expected_type: - print(f" Note: {expected_type} is not yet implemented") - else: - print(f"⚠️ Test {i}: {test_name}") - print(" Expected: None") - print(f" Got: {type(selected_parser).__name__}") - print(" Note: Parser found but may not be fully implemented") - print() - continue - - # Check if parser was found - if selected_parser is None: - print(f"❌ Test {i}: {test_name}") - print(f" Expected: {expected_type}") - print(" Got: None (parser not found)") - print(f" Message: {message}\n") - all_passed = False - continue - - # Get actual parser type name - actual_type = type(selected_parser).__name__ - - # Verify parser type - if actual_type == expected_type: - print(f"✅ Test {i}: {test_name}") - print(f" Expected: {expected_type}") - print(f" Got: {actual_type}") - print(f" Parser instance: {selected_parser}") - else: - print(f"❌ Test {i}: {test_name}") - print(f" Expected: {expected_type}") - print(f" Got: {actual_type}") - print(f" Message: {message}") - all_passed = False - print() - - # Test edge cases - print("\n=== Testing Edge Cases ===\n") - - edge_cases = [ - { - "name": "Unknown message type (not dict, not str)", - "message": 12345, - "should_return_none": True, - }, - { - "name": "Dict without type or role", - "message": {"content": "Some content"}, - "should_return_none": True, - }, - { - "name": "Unknown type in RawMessageList", - "message": {"type": "unknown_type", "data": "some data"}, - "should_return_none": True, - }, - { - "name": "Unknown role in MessageList", - "message": {"role": "unknown_role", "content": "some content"}, - "should_return_none": True, - }, - { - "name": "List of messages (MessageList - not handled by _get_parser)", - "message": [ - {"role": "user", "content": "Message 1"}, - {"role": "assistant", "content": "Message 2"}, - ], - "should_return_none": True, # Lists are handled in parse(), not _get_parser() - }, - { - "name": "List of RawMessageList items (not handled by _get_parser)", - "message": [ - {"type": "text", "text": "Text content 1"}, - {"type": "file", "file": {"filename": "doc.pdf", "file_data": ""}}, - ], - "should_return_none": True, # Lists are handled in parse(), not _get_parser() - }, - ] - - for i, test_case in enumerate(edge_cases, 1): - message = test_case["message"] - should_return_none = test_case["should_return_none"] - test_name = test_case["name"] - - selected_parser = parser._get_parser(message) - - if should_return_none: - if selected_parser is None: - print(f"✅ Edge Case {i}: {test_name}") - print(" Correctly returned None") - else: - print(f"❌ Edge Case {i}: {test_name}") - print(" Expected: None") - print(f" Got: {type(selected_parser).__name__}") - all_passed = False - else: - if selected_parser is not None: - print(f"✅ Edge Case {i}: {test_name}") - print(f" Got parser: {type(selected_parser).__name__}") - else: - print(f"❌ Edge Case {i}: {test_name}") - print(" Expected: Parser") - print(" Got: None") - all_passed = False - print() - - # Summary - print("=" * 60) - if all_passed: - print("✅ All tests passed! Parser selection is working correctly.") - else: - print("❌ Some tests failed. Please check the output above.") - print("=" * 60) - - -def parser_instances(): - """Test that parser instances are correctly initialized.""" - print("\n=== Parser Instance Verification ===\n") - - embedder, llm = init_embedder_and_llm() - parser = MultiModalParser(embedder=embedder, llm=llm) - - # Verify all parser instances are initialized - parsers_to_check = { - "string_parser": "StringParser", - "system_parser": "SystemParser", - "user_parser": "UserParser", - "assistant_parser": "AssistantParser", - "tool_parser": "ToolParser", - "text_content_parser": "TextContentParser", - "file_content_parser": "FileContentParser", - } - - print("Checking parser instance initialization:\n") - all_initialized = True - - for attr_name, expected_type in parsers_to_check.items(): - parser_instance = getattr(parser, attr_name, None) - if parser_instance is None: - print(f"❌ {attr_name}: Not initialized") - all_initialized = False - else: - actual_type = type(parser_instance).__name__ - if actual_type == expected_type: - print(f"✅ {attr_name}: {actual_type}") - else: - print(f"❌ {attr_name}: Expected {expected_type}, got {actual_type}") - all_initialized = False - - print() - if all_initialized: - print("✅ All parser instances are correctly initialized!") - else: - print("❌ Some parser instances are missing or incorrect.") - print() - - -def main(): - """Run all tests.""" - parser_selection() - parser_instances() - print("\n✅ MultiModalParser example completed!") - - -if __name__ == "__main__": - main() diff --git a/examples/mem_reader/parser/example_string_parser.py b/examples/mem_reader/parser/example_string_parser.py deleted file mode 100644 index 3ec658a0e..000000000 --- a/examples/mem_reader/parser/example_string_parser.py +++ /dev/null @@ -1,66 +0,0 @@ -"""Example demonstrating StringParser usage. - -StringParser handles simple string messages that need to be converted to memory items. -""" - -import sys - -from pathlib import Path - -from dotenv import load_dotenv - -from memos.mem_reader.read_multi_modal.string_parser import StringParser - - -# Handle imports for both script and module usage -try: - from .config_utils import init_embedder_and_llm -except ImportError: - # When running as script, add parent directory to path - sys.path.insert(0, str(Path(__file__).parent)) - from config_utils import init_embedder_and_llm - -# Load environment variables -load_dotenv() - - -def main(): - """Demonstrate StringParser usage.""" - print("=== StringParser Example ===\n") - - # 1. Initialize embedder and LLM (using shared config) - embedder, llm = init_embedder_and_llm() - - # 3. Create StringParser - parser = StringParser(embedder=embedder, llm=llm) - - # 4. Example string messages - string_messages = [ - "This is a simple text message that needs to be parsed.", - "Another string message for processing.", - "StringParser handles plain text strings and converts them to SourceMessage objects.", - ] - - print("📝 Processing string messages:\n") - for i, message in enumerate(string_messages, 1): - print(f"Message {i}: {message[:50]}...") - - # Create source from string - info = {"user_id": "user1", "session_id": "session1"} - source = parser.create_source(message, info) - - print(" ✅ Created SourceMessage:") - print(f" - Type: {source.type}") - print(f" - Content: {source.content[:50]}...") - print() - - # Rebuild string from source - rebuilt = parser.rebuild_from_source(source) - print(f" 🔄 Rebuilt string: {rebuilt[:50]}...") - print() - - print("✅ StringParser example completed!") - - -if __name__ == "__main__": - main() diff --git a/examples/mem_reader/parser/example_system_parser.py b/examples/mem_reader/parser/example_system_parser.py deleted file mode 100644 index bc684a32b..000000000 --- a/examples/mem_reader/parser/example_system_parser.py +++ /dev/null @@ -1,158 +0,0 @@ -"""Example demonstrating SystemParser usage. - -SystemParser handles system messages in chat conversations. -Note: System messages support multimodal content, but only text parts are allowed -(not file, image_url, or input_audio like user messages). -""" - -import sys - -from pathlib import Path - -from dotenv import load_dotenv - - -try: - from .print_utils import pretty_print_dict -except ImportError: - # Fallback if print_utils is not available - def pretty_print_dict(d): - import json - - print(json.dumps(d, indent=2, ensure_ascii=False)) - - -from memos.mem_reader.read_multi_modal.system_parser import SystemParser - - -# Handle imports for both script and module usage -try: - from .config_utils import init_embedder_and_llm -except ImportError: - # When running as script, add parent directory to path - sys.path.insert(0, str(Path(__file__).parent)) - from config_utils import init_embedder_and_llm - -# Load environment variables -load_dotenv() - - -def main(): - """Demonstrate SystemParser usage.""" - print("=== SystemParser Example ===\n") - - # 1. Initialize embedder and LLM (using shared config) - embedder, llm = init_embedder_and_llm() - - # 3. Create SystemParser - parser = SystemParser(embedder=embedder, llm=llm) - - # 4. Example system messages (simple text) - simple_system_message = { - "role": "system", - "content": "You are a helpful assistant that provides clear and concise answers.", - "chat_time": "2025-01-15T10:00:00", - "message_id": "msg_001", - } - - print("📝 Example 1: Simple text system message\n") - pretty_print_dict(simple_system_message) - - info = {"user_id": "user1", "session_id": "session1"} - source = parser.create_source(simple_system_message, info) - - print(" ✅ Created SourceMessage:") - print(f" - Type: {source.type}") - print(f" - Role: {source.role}") - print(f" - Content: {source.content[:60]}...") - print(f" - Chat Time: {source.chat_time}") - print(f" - Message ID: {source.message_id}") - print() - - # Parse in fast mode - memory_items = parser.parse_fast(simple_system_message, info) - print(f" 📊 Fast mode generated {len(memory_items)} memory item(s)") - if memory_items: - print(f" - Memory: {memory_items[0].memory[:60]}...") - print(f" - Memory Type: {memory_items[0].metadata.memory_type}") - print(f" - Tags: {memory_items[0].metadata.tags}") - print() - - # 5. Example multimodal system message (multiple text parts) - # Note: System messages only support text parts, not file/image/audio - multimodal_system_message = { - "role": "system", - "content": [ - {"type": "text", "text": "You are a helpful assistant."}, - {"type": "text", "text": "Always provide clear and concise answers."}, - {"type": "text", "text": "If you don't know something, say so."}, - ], - "chat_time": "2025-01-15T10:05:00", - "message_id": "msg_002", - } - - print("📝 Example 2: Multimodal system message (multiple text parts)\n") - pretty_print_dict(multimodal_system_message) - print(f"Message contains {len(multimodal_system_message['content'])} text parts") - - sources = parser.create_source(multimodal_system_message, info) - if isinstance(sources, list): - print(f" ✅ Created {len(sources)} SourceMessage(s):") - for i, src in enumerate(sources, 1): - print(f" [{i}] Type: {src.type}, Role: {src.role}") - print(f" Content: {src.content[:50]}...") - else: - print(f" ✅ Created SourceMessage: Type={sources.type}") - print() - - # Parse in fast mode - memory_items = parser.parse_fast(multimodal_system_message, info) - print(f" 📊 Fast mode generated {len(memory_items)} memory item(s)") - if memory_items: - print(f" - Memory: {memory_items[0].memory[:60]}...") - print(f" - Memory Type: {memory_items[0].metadata.memory_type}") - print(f" - Tags: {memory_items[0].metadata.tags}") - # Show sources from memory item - if memory_items[0].metadata.sources: - print(f" - Sources: {len(memory_items[0].metadata.sources)} SourceMessage(s)") - print() - - # 6. Example with structured system instructions - structured_system_message = { - "role": "system", - "content": [ - { - "type": "text", - "text": "You are a coding assistant specialized in Python programming.", - }, - {"type": "text", "text": "Always write clean, well-documented code."}, - {"type": "text", "text": "Explain your reasoning when providing solutions."}, - ], - "chat_time": "2025-01-15T10:10:00", - "message_id": "msg_003", - } - - print("📝 Example 3: Structured system instructions (multiple text parts)\n") - pretty_print_dict(structured_system_message) - - sources = parser.create_source(structured_system_message, info) - if isinstance(sources, list): - print(f" ✅ Created {len(sources)} SourceMessage(s):") - for i, src in enumerate(sources, 1): - print(f" [{i}] Type: {src.type}, Role: {src.role}") - print(f" Content: {src.content[:50]}...") - print() - - # Rebuild examples - print("🔄 Rebuilding messages from sources:\n") - if isinstance(sources, list) and sources: - rebuilt = parser.rebuild_from_source(sources[0]) - else: - rebuilt = parser.rebuild_from_source(source) - if rebuilt: - pretty_print_dict(rebuilt) - print("✅ SystemParser example completed!") - - -if __name__ == "__main__": - main() diff --git a/examples/mem_reader/parser/example_text_content_parser.py b/examples/mem_reader/parser/example_text_content_parser.py deleted file mode 100644 index 1eb64d033..000000000 --- a/examples/mem_reader/parser/example_text_content_parser.py +++ /dev/null @@ -1,72 +0,0 @@ -"""Example demonstrating TextContentParser usage. - -TextContentParser handles text content parts in multimodal messages (RawMessageList). -""" - -import sys - -from pathlib import Path - -from dotenv import load_dotenv - -from memos.mem_reader.read_multi_modal.text_content_parser import TextContentParser - - -# Handle imports for both script and module usage -try: - from .config_utils import init_embedder_and_llm -except ImportError: - # When running as script, add parent directory to path - sys.path.insert(0, str(Path(__file__).parent)) - from config_utils import init_embedder_and_llm - -# Load environment variables -load_dotenv() - - -def main(): - """Demonstrate TextContentParser usage.""" - print("=== TextContentParser Example ===\n") - - # 1. Initialize embedder and LLM (using shared config) - embedder, llm = init_embedder_and_llm() - - # 3. Create TextContentParser - parser = TextContentParser(embedder=embedder, llm=llm) - - # 4. Example text content parts - text_content_parts = [ - {"type": "text", "text": "This is a simple text content part."}, - {"type": "text", "text": "TextContentParser handles text parts in multimodal messages."}, - { - "type": "text", - "text": "This parser is used when processing RawMessageList items that contain text content.", - }, - ] - - print("📝 Processing text content parts:\n") - for i, part in enumerate(text_content_parts, 1): - print(f"Text Content Part {i}:") - print(f" Text: {part['text'][:60]}...") - - # Create source from text content part - info = {"user_id": "user1", "session_id": "session1"} - source = parser.create_source(part, info) - - print(" ✅ Created SourceMessage:") - print(f" - Type: {source.type}") - print(f" - Content: {source.content[:60]}...") - if hasattr(source, "original_part") and source.original_part: - print(" - Has original_part: Yes") - print() - - # Rebuild text content part from source - rebuilt = parser.rebuild_from_source(source) - print(f" 🔄 Rebuilt part: type={rebuilt['type']}, text={rebuilt['text'][:40]}...") - print() - - print("✅ TextContentParser example completed!") - - -if __name__ == "__main__": - main() diff --git a/examples/mem_reader/parser/example_tool_parser.py b/examples/mem_reader/parser/example_tool_parser.py deleted file mode 100644 index bf3f4e333..000000000 --- a/examples/mem_reader/parser/example_tool_parser.py +++ /dev/null @@ -1,101 +0,0 @@ -"""Example demonstrating ToolParser usage. - -ToolParser handles tool/function call messages in chat conversations. -""" - -import sys - -from pathlib import Path - -from dotenv import load_dotenv - -from memos.mem_reader.read_multi_modal.tool_parser import ToolParser - - -# Handle imports for both script and module usage -try: - from .config_utils import init_embedder_and_llm -except ImportError: - # When running as script, add parent directory to path - sys.path.insert(0, str(Path(__file__).parent)) - from config_utils import init_embedder_and_llm - -# Load environment variables -load_dotenv() - - -def main(): - """Demonstrate ToolParser usage.""" - print("=== ToolParser Example ===\n") - - # 1. Initialize embedder and LLM (using shared config) - embedder, llm = init_embedder_and_llm() - - # 3. Create ToolParser - parser = ToolParser(embedder=embedder, llm=llm) - - # 4. Example tool messages - tool_messages = [ - { - "role": "tool", - "content": '{"result": "Weather in New York: 72°F, sunny"}', - "tool_call_id": "call_abc123", - "chat_time": "2025-01-15T10:00:30", - "message_id": "msg_001", - }, - { - "role": "tool", - "content": '{"status": "success", "data": {"items": [1, 2, 3]}}', - "tool_call_id": "call_def456", - "chat_time": "2025-01-15T10:05:30", - "message_id": "msg_002", - }, - { - "role": "tool", - "content": "Database query executed successfully. Retrieved 5 records.", - "tool_call_id": "call_ghi789", - "chat_time": "2025-01-15T10:10:30", - "message_id": "msg_003", - }, - ] - - print("📝 Processing tool messages:\n") - for i, message in enumerate(tool_messages, 1): - print(f"Tool Message {i}:") - print(f" Content: {message['content'][:60]}...") - print(f" Tool Call ID: {message['tool_call_id']}") - - # Create source from tool message - info = {"user_id": "user1", "session_id": "session1"} - source = parser.create_source(message, info) - - print(" ✅ Created SourceMessage:") - print(f" - Type: {source.type}") - print(f" - Role: {source.role}") - print(f" - Content: {source.content[:60]}...") - print(f" - Chat Time: {source.chat_time}") - print(f" - Message ID: {source.message_id}") - print() - - # Parse in fast mode - memory_items = parser.parse_fast(message, info) - print(f" 📊 Fast mode generated {len(memory_items)} memory item(s)") - if memory_items: - print(f" - Memory: {memory_items[0].memory[:60]}...") - print(f" - Memory Type: {memory_items[0].metadata.memory_type}") - print(f" - Tags: {memory_items[0].metadata.tags}") - print() - - # Rebuild tool message from source - rebuilt = parser.rebuild_from_source(source) - print(" 🔄 Rebuilt message:") - print(f" - Role: {rebuilt['role']}") - print(f" - Tool Call ID: {rebuilt.get('tool_call_id', 'N/A')}") - print(f" - Content: {rebuilt['content'][:40]}...") - print() - - print("✅ ToolParser example completed!") - - -if __name__ == "__main__": - main() diff --git a/examples/mem_reader/parser/example_user_parser.py b/examples/mem_reader/parser/example_user_parser.py deleted file mode 100644 index 78a75b94f..000000000 --- a/examples/mem_reader/parser/example_user_parser.py +++ /dev/null @@ -1,135 +0,0 @@ -"""Example demonstrating UserParser usage. - -UserParser handles user messages, including multimodal messages with text, files, images, etc. -""" - -import sys - -from pathlib import Path - -from dotenv import load_dotenv -from print_utils import pretty_print_dict - -from memos.mem_reader.read_multi_modal.user_parser import UserParser - - -# Handle imports for both script and module usage -try: - from .config_utils import init_embedder_and_llm -except ImportError: - # When running as script, add parent directory to path - sys.path.insert(0, str(Path(__file__).parent)) - from config_utils import init_embedder_and_llm - -# Load environment variables -load_dotenv() - - -def main(): - """Demonstrate UserParser usage.""" - print("=== UserParser Example ===\n") - - # 1. Initialize embedder and LLM (using shared config) - embedder, llm = init_embedder_and_llm() - - # 3. Create UserParser - parser = UserParser(embedder=embedder, llm=llm) - - # 4. Example user messages (simple text) - simple_user_message = { - "role": "user", - "content": "I'm feeling a bit down today. Can you help me?", - "chat_time": "2025-01-15T10:00:00", - "message_id": "msg_001", - } - - print("📝 Example 1: Simple text user message\n") - pretty_print_dict(simple_user_message) - - info = {"user_id": "user1", "session_id": "session1"} - # Parse in fast mode - memory_items = parser.parse_fast(simple_user_message, info) - print(f" 📊 Fast mode generated {len(memory_items)} memory item(s)") - if memory_items: - print(f" - Memory: {memory_items[0].memory[:60]}...") - print(f" - Memory Type: {memory_items[0].metadata.memory_type}") - print() - - # 5. Example multimodal user message (text + file) - multimodal_user_message = { - "role": "user", - "content": [ - {"type": "text", "text": "Please analyze this document:"}, - { - "type": "file", - "file": { - "filename": "report.pdf", - "file_id": "file_123", - "file_data": "This is the content of the PDF file...", - }, - }, - ], - "chat_time": "2025-01-15T10:05:00", - "message_id": "msg_002", - } - - print("📝 Example 2: Multimodal user message (text + file)\n") - pretty_print_dict(multimodal_user_message) - print(f"Message contains {len(multimodal_user_message['content'])} parts") - - # Parse in fast mode - memory_items = parser.parse_fast(multimodal_user_message, info) - print(f" 📊 Fast mode generated {len(memory_items)} memory item(s)") - for memory_item in memory_items: - sources = memory_item.metadata.sources - print(f" ✅ Created {len(sources)} SourceMessage(s):") - for i, src in enumerate(sources, 1): - print(f" [{i}] Type: {src.type}, Role: {src.role}") - if src.type == "text": - print(f" Content: {src.content[:50]}...") - elif src.type == "file": - print(f" Doc Path: {src.doc_path}") - print() - - # 6. Example with image_url (future support) - image_user_message = { - "role": "user", - "content": [ - {"type": "text", "text": "What's in this image?"}, - { - "type": "image_url", - "image_url": {"url": "https://example.com/image.jpg"}, - }, - ], - "chat_time": "2025-01-15T10:10:00", - "message_id": "msg_003", - } - print("📝 Example 3: User message with image\n") - print(f"Message contains {len(image_user_message['content'])} parts") - pretty_print_dict(image_user_message) - - # Parse in fast mode - memory_items = parser.parse_fast(image_user_message, info) - print(f" 📊 Fast mode generated {len(memory_items)} memory item(s)") - for memory_item in memory_items: - sources = memory_item.metadata.sources - print(f" ✅ Created {len(sources)} SourceMessage(s):") - for i, src in enumerate(sources, 1): - print(f" [{i}] Type: {src.type}, Role: {src.role}") - if src.type == "text": - print(f" Content: {src.content[:50]}...") - elif src.type == "file": - print(f" Doc Path: {src.doc_path}") - elif src.type == "image": - print(f" Image Path: {src.image_path}") - - # Rebuild examples - print("🔄 Rebuilding messages from sources:\n") - rebuilt_simple = parser.rebuild_from_source(sources[1]) - if rebuilt_simple: - pretty_print_dict(rebuilt_simple) - print("✅ UserParser example completed!") - - -if __name__ == "__main__": - main() diff --git a/examples/mem_reader/parser/print_utils.py b/examples/mem_reader/parser/print_utils.py deleted file mode 100644 index 5eba1fa76..000000000 --- a/examples/mem_reader/parser/print_utils.py +++ /dev/null @@ -1,11 +0,0 @@ -import pprint - - -def pretty_print_dict(d: dict): - text = pprint.pformat(d, indent=2, width=120) - border = "═" * (max(len(line) for line in text.split("\n")) + 4) - - print(f"╔{border}╗") - for line in text.split("\n"): - print(f"║ {line.ljust(len(border) - 2)} ║") - print(f"╚{border}╝") diff --git a/examples/mem_reader/parser_demos/__init__.py b/examples/mem_reader/parser_demos/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/examples/mem_reader/parser_demos/_base.py b/examples/mem_reader/parser_demos/_base.py new file mode 100644 index 000000000..883578a21 --- /dev/null +++ b/examples/mem_reader/parser_demos/_base.py @@ -0,0 +1,76 @@ +"""Base class and utilities for parser demos.""" + +from typing import Any + +from examples.mem_reader.builders import build_llm_and_embedder +from examples.mem_reader.utils import pretty_print_dict +from memos.memories.textual.item import SourceMessage + + +class BaseParserDemo: + """Base class for all parser demos.""" + + def __init__(self): + print(f"\n🚀 Initializing {self.__class__.__name__}...") + self.embedder, self.llm = build_llm_and_embedder() + self.parser = self.create_parser() + print("✅ Initialization complete.\n") + + def create_parser(self): + """Create and return the specific parser instance.""" + raise NotImplementedError + + def run(self): + """Run the main demo logic.""" + raise NotImplementedError + + def demo_source_creation( + self, message: Any, info: dict, **kwargs + ) -> SourceMessage | list[SourceMessage]: + """Demonstrate creating a SourceMessage from raw input.""" + print(f"📝 Creating SourceMessage from: {str(message)[:100]}...") + source = self.parser.create_source(message, info, **kwargs) + + if isinstance(source, list): + print(f" ✅ Created {len(source)} SourceMessage(s)") + for i, s in enumerate(source): + print(f" [{i}] Type: {s.type}, Role: {getattr(s, 'role', 'N/A')}") + else: + print(" ✅ Created SourceMessage:") + print(f" - Type: {source.type}") + if hasattr(source, "role"): + print(f" - Role: {source.role}") + if source.content: + print(f" - Content: {str(source.content)[:60]}...") + + return source + + def demo_rebuild(self, source: SourceMessage | list[SourceMessage]): + """Demonstrate rebuilding raw message from SourceMessage.""" + print("\n🔄 Rebuilding message from source...") + + # Handle list of sources (take first one for demo if it's a list) + src_to_rebuild = source[0] if isinstance(source, list) else source + + rebuilt = self.parser.rebuild_from_source(src_to_rebuild) + print(" ✅ Rebuilt result:") + if isinstance(rebuilt, dict): + pretty_print_dict(rebuilt) + else: + print(f" {rebuilt}") + + def demo_parse_fast(self, message: Any, info: dict): + """Demonstrate fast parsing (if supported).""" + if not hasattr(self.parser, "parse_fast"): + return + + print("\n⚡️ Running parse_fast...") + try: + memory_items = self.parser.parse_fast(message, info) + print(f" 📊 Generated {len(memory_items)} memory item(s)") + if memory_items: + item = memory_items[0] + print(f" - Memory: {item.memory[:60]}...") + print(f" - Type: {item.metadata.memory_type}") + except Exception as e: + print(f" ⚠️ parse_fast not applicable or failed: {e}") diff --git a/examples/mem_reader/parser_demos/demo_assistant.py b/examples/mem_reader/parser_demos/demo_assistant.py new file mode 100644 index 000000000..7c6a0a1e8 --- /dev/null +++ b/examples/mem_reader/parser_demos/demo_assistant.py @@ -0,0 +1,44 @@ +"""Demo for AssistantParser.""" + +from examples.mem_reader.samples import ASSISTANT_MESSAGE_CASES +from memos.mem_reader.read_multi_modal.assistant_parser import AssistantParser + +from ._base import BaseParserDemo + + +class AssistantParserDemo(BaseParserDemo): + def create_parser(self): + parser = AssistantParser(embedder=self.embedder, llm=self.llm) + + # Workaround: AssistantParser.rebuild_from_source is empty in src. + # Patch it to return content for demo visualization, aligning with legacy behavior. + original_rebuild = parser.rebuild_from_source + + def patched_rebuild(source): + if source.role == "assistant": + # Only handling simple text content as per legacy example scope + return { + "role": "assistant", + "content": source.content, + } + return original_rebuild(source) + + parser.rebuild_from_source = patched_rebuild + return parser + + def run(self): + print("=== AssistantParser Demo ===") + + info = {"user_id": "user1", "session_id": "session1"} + + for case in ASSISTANT_MESSAGE_CASES: + print(f"\n--- Case: {case.description} ---") + for msg in case.scene_data: + source = self.demo_source_creation(msg, info) + self.demo_rebuild(source) + self.demo_parse_fast(msg, info) + + +if __name__ == "__main__": + demo = AssistantParserDemo() + demo.run() diff --git a/examples/mem_reader/parser_demos/demo_file_content.py b/examples/mem_reader/parser_demos/demo_file_content.py new file mode 100644 index 000000000..f0d11b15f --- /dev/null +++ b/examples/mem_reader/parser_demos/demo_file_content.py @@ -0,0 +1,68 @@ +"""Demo for FileContentParser.""" + +from examples.mem_reader.builders import build_file_parser +from examples.mem_reader.samples import FILE_CONTENT_PARTS, FILE_CONTENT_REAL_FILE_PART +from memos.mem_reader.read_multi_modal.file_content_parser import FileContentParser + +from ._base import BaseParserDemo + + +class FileContentParserDemo(BaseParserDemo): + def create_parser(self): + # Initialize the underlying file parser (MarkItDown) + file_parser_impl = build_file_parser() + + return FileContentParser( + embedder=self.embedder, + llm=self.llm, + parser=file_parser_impl, + ) + + def run(self): + print("=== FileContentParser Demo ===") + + info = {"user_id": "user1", "session_id": "session1"} + + print("📝 Processing file content parts:\n") + for i, part in enumerate(FILE_CONTENT_PARTS, 1): + print(f"File Content Part {i}:") + file_info = part.get("file", {}) + print(f" Filename: {file_info.get('filename', 'unknown')}") + print(f" File ID: {file_info.get('file_id', 'N/A')}") + + # Create source from file content part + source = self.parser.create_source(part, info) + + print(" ✅ Created SourceMessage:") + print(f" - Type: {source.type}") + print(f" - Doc Path: {source.doc_path}") + if source.content: + print(f" - Content: {source.content[:60]}...") + if hasattr(source, "original_part") and source.original_part: + print(" - Has original_part: Yes") + print() + + # Rebuild file content part from source + rebuilt = self.parser.rebuild_from_source(source) + print(" 🔄 Rebuilt part:") + print(f" - Type: {rebuilt.get('type')}") + print(f" - Filename: {rebuilt.get('file', {}).get('filename', 'N/A')}") + + print() + + # 6. Example with actual file path (if parser is available) + if getattr(self.parser, "parser", None): + print("📄 Testing file parsing with actual file path:\n") + + try: + source = self.parser.create_source(FILE_CONTENT_REAL_FILE_PART, info) + print(f" ✅ Created SourceMessage for file: {source.doc_path}") + # The parser would parse the file content if the file exists + except Exception as e: + print(f" ⚠️ File parsing note: {e}") + print() + + +if __name__ == "__main__": + demo = FileContentParserDemo() + demo.run() diff --git a/examples/mem_reader/parser_demos/demo_image.py b/examples/mem_reader/parser_demos/demo_image.py new file mode 100644 index 000000000..a3ff3b334 --- /dev/null +++ b/examples/mem_reader/parser_demos/demo_image.py @@ -0,0 +1,87 @@ +"""Demo for ImageParser.""" + +import base64 +import copy + +from pathlib import Path + +from examples.mem_reader.samples import IMAGE_MESSAGE_CASES +from memos.mem_reader.read_multi_modal.image_parser import ImageParser + +from ._base import BaseParserDemo + + +class ImageParserDemo(BaseParserDemo): + def create_parser(self): + return ImageParser(embedder=self.embedder, llm=self.llm) + + def run(self): + print("🚀 Initializing ImageParserDemo...") + print("✅ Initialization complete.") + print("=== ImageParser Demo ===\n") + + info = {"user_id": "user1", "session_id": "session1"} + + test_cases = copy.deepcopy(IMAGE_MESSAGE_CASES) + + # Add Local Image (Base64) if exists + local_img_path = Path(__file__).parent.parent / "test_image.png" + if local_img_path.exists(): + with open(local_img_path, "rb") as f: + b64_data = base64.b64encode(f.read()).decode("utf-8") + test_cases.append( + { + "type": "image_url", + "image_url": { + "url": f"data:image/png;base64,{b64_data}", + "detail": "auto", + }, + "_note": "Local Image (Base64)", + } + ) + + for i, msg in enumerate(test_cases, 1): + print(f"--- Case {i}: Image URL message ---") + + # 1. Create SourceMessage + print(f"📝 Creating SourceMessage from: {msg}") + source = self.parser.create_source(msg, info) + print(" ✅ Created SourceMessage:") + print(f" - Type: {source.type}") + print(f" - URL: {getattr(source, 'url', 'N/A')}") + + # 2. Rebuild from Source + print("🔄 Rebuilding message from source...") + rebuilt = self.parser.rebuild_from_source(source) + print(f" ✅ Rebuilt result: {rebuilt}") + + # 3. Fast Parse (Expected Empty) + print("⚡️ Running parse_fast (expecting empty)...") + fast_results = self.parser.parse_fast(msg, info) + if not fast_results: + print(" ✅ Got empty list as expected (images require fine mode).") + else: + print(f" ⚠️ Unexpected fast results: {len(fast_results)} items") + + # 4. Fine Parse (Vision Model) + print("🧠 Running parse_fine (Vision Model)...") + # Note: This might fail if the configured LLM doesn't support vision or if the URL is unreachable + try: + fine_results = self.parser.parse_fine(msg, info) + if not fine_results: + print( + " ⚠️ No memories generated (LLM might not support vision or image inaccessible)." + ) + else: + print(f" 📊 Generated {len(fine_results)} memory item(s):") + for item in fine_results: + print(f" - Memory: {item.memory[:100]}...") + except Exception as e: + print(f" ❌ Error during fine parsing: {e}") + + print() + + +if __name__ == "__main__": + demo = ImageParserDemo() + demo.run() diff --git a/examples/mem_reader/parser_demos/demo_multi_modal.py b/examples/mem_reader/parser_demos/demo_multi_modal.py new file mode 100644 index 000000000..3302ef073 --- /dev/null +++ b/examples/mem_reader/parser_demos/demo_multi_modal.py @@ -0,0 +1,346 @@ +"""Demo for MultiModalParser.""" + +from examples.mem_reader.builders import build_file_parser +from memos.mem_reader.read_multi_modal.multi_modal_parser import MultiModalParser + +from ._base import BaseParserDemo + + +class MultiModalParserDemo(BaseParserDemo): + def create_parser(self): + file_parser = build_file_parser() + return MultiModalParser(embedder=self.embedder, llm=self.llm, parser=file_parser) + + def run(self): + self.parser_selection() + self.parser_instances() + print("\n✅ MultiModalParser example completed!") + + def parser_selection(self): + """Test that different input types return the correct parser.""" + print("=== MultiModalParser Parser Selection Test ===\n") + + # Test cases: different input types + test_cases = [ + # String input -> StringParser + { + "name": "String input", + "message": "This is a simple string message", + "expected_parser_type": "StringParser", + }, + # RawMessageList: text type -> TextContentParser + { + "name": "Text content part (RawMessageList)", + "message": {"type": "text", "text": "This is a text content part"}, + "expected_parser_type": "TextContentParser", + }, + # RawMessageList: file type -> FileContentParser + { + "name": "File content part (RawMessageList)", + "message": { + "type": "file", + "file": { + "filename": "example.pdf", + "file_data": "File content here", + }, + }, + "expected_parser_type": "FileContentParser", + }, + # RawMessageList: image_url type -> ImageParser + { + "name": "Image content part (RawMessageList - image_url type)", + "message": { + "type": "image_url", + "image_url": { + "url": "https://example.com/image.jpg", + "detail": "auto", + }, + }, + "expected_parser_type": "ImageParser", + }, + # RawMessageList: input_audio type -> None (type_parsers uses "audio" key, not "input_audio") + { + "name": "Audio content part (RawMessageList - input_audio type)", + "message": { + "type": "input_audio", + "input_audio": { + "data": "base64_encoded_audio_data", + "format": "mp3", + }, + }, + "expected_parser_type": None, # type_parsers has "audio" key, but message has "input_audio" type + "should_return_none": True, + }, + # MessageList: system role -> SystemParser + { + "name": "System message", + "message": { + "role": "system", + "content": "You are a helpful assistant.", + }, + "expected_parser_type": "SystemParser", + }, + # MessageList: user role -> UserParser + { + "name": "User message (simple)", + "message": { + "role": "user", + "content": "Hello, how are you?", + }, + "expected_parser_type": "UserParser", + }, + # MessageList: user role with multimodal content -> UserParser + { + "name": "User message (multimodal with text and file)", + "message": { + "role": "user", + "content": [ + {"type": "text", "text": "What's in this image?"}, + {"type": "file", "file": {"filename": "image.jpg", "file_data": ""}}, + ], + }, + "expected_parser_type": "UserParser", + }, + # MessageList: user role with image_url content -> UserParser + { + "name": "User message (with image_url)", + "message": { + "role": "user", + "content": [ + {"type": "text", "text": "What's in this image?"}, + { + "type": "image_url", + "image_url": {"url": "https://example.com/image.jpg"}, + }, + ], + }, + "expected_parser_type": "UserParser", + }, + # MessageList: user role with input_audio content -> UserParser + { + "name": "User message (with input_audio)", + "message": { + "role": "user", + "content": [ + {"type": "text", "text": "Listen to this audio"}, + { + "type": "input_audio", + "input_audio": {"data": "base64_data", "format": "wav"}, + }, + ], + }, + "expected_parser_type": "UserParser", + }, + # MessageList: assistant role -> AssistantParser + { + "name": "Assistant message (simple)", + "message": { + "role": "assistant", + "content": "I'm doing well, thank you!", + }, + "expected_parser_type": "AssistantParser", + }, + # MessageList: assistant role with tool_calls -> AssistantParser + { + "name": "Assistant message (with tool_calls)", + "message": { + "role": "assistant", + "content": None, + "tool_calls": [ + { + "id": "call_123", + "type": "function", + "function": { + "name": "get_weather", + "arguments": '{"location": "Beijing"}', + }, + } + ], + }, + "expected_parser_type": "AssistantParser", + }, + # MessageList: tool role -> ToolParser + { + "name": "Tool message", + "message": { + "role": "tool", + "content": "Tool execution result", + "tool_call_id": "call_123", + }, + "expected_parser_type": "ToolParser", + }, + ] + + print("Testing parser selection for different input types:\n") + all_passed = True + + for i, test_case in enumerate(test_cases, 1): + message = test_case["message"] + expected_type = test_case.get("expected_parser_type") + test_name = test_case["name"] + should_return_none = test_case.get("should_return_none", False) + + # Get parser using internal method + selected_parser = self.parser._get_parser(message) + + # Handle cases where None is expected + if should_return_none or expected_type is None: + if selected_parser is None: + print(f"✅ Test {i}: {test_name}") + print(" Expected: None (parser not implemented yet or not found)") + print(" Got: None") + if expected_type: + print(f" Note: {expected_type} is not yet implemented") + else: + print(f"⚠️ Test {i}: {test_name}") + print(" Expected: None") + print(f" Got: {type(selected_parser).__name__}") + print(" Note: Parser found but may not be fully implemented") + print() + continue + + # Check if parser was found + if selected_parser is None: + print(f"❌ Test {i}: {test_name}") + print(f" Expected: {expected_type}") + print(" Got: None (parser not found)") + print(f" Message: {message}\n") + all_passed = False + continue + + # Get actual parser type name + actual_type = type(selected_parser).__name__ + + # Verify parser type + if actual_type == expected_type: + print(f"✅ Test {i}: {test_name}") + print(f" Expected: {expected_type}") + print(f" Got: {actual_type}") + print(f" Parser instance: {selected_parser}") + else: + print(f"❌ Test {i}: {test_name}") + print(f" Expected: {expected_type}") + print(f" Got: {actual_type}") + print(f" Message: {message}") + all_passed = False + print() + + # Test edge cases + print("\n=== Testing Edge Cases ===\n") + + edge_cases = [ + { + "name": "Unknown message type (not dict, not str)", + "message": 12345, + "should_return_none": True, + }, + { + "name": "Dict without type or role", + "message": {"content": "Some content"}, + "should_return_none": True, + }, + { + "name": "Unknown type in RawMessageList", + "message": {"type": "unknown_type", "data": "some data"}, + "should_return_none": True, + }, + { + "name": "Unknown role in MessageList", + "message": {"role": "unknown_role", "content": "some content"}, + "should_return_none": True, + }, + { + "name": "List of messages (MessageList - not handled by _get_parser)", + "message": [ + {"role": "user", "content": "Message 1"}, + {"role": "assistant", "content": "Message 2"}, + ], + "should_return_none": True, # Lists are handled in parse(), not _get_parser() + }, + { + "name": "List of RawMessageList items (not handled by _get_parser)", + "message": [ + {"type": "text", "text": "Text content 1"}, + {"type": "file", "file": {"filename": "doc.pdf", "file_data": ""}}, + ], + "should_return_none": True, # Lists are handled in parse(), not _get_parser() + }, + ] + + for i, test_case in enumerate(edge_cases, 1): + message = test_case["message"] + should_return_none = test_case["should_return_none"] + test_name = test_case["name"] + + selected_parser = self.parser._get_parser(message) + + if should_return_none: + if selected_parser is None: + print(f"✅ Edge Case {i}: {test_name}") + print(" Correctly returned None") + else: + print(f"❌ Edge Case {i}: {test_name}") + print(" Expected: None") + print(f" Got: {type(selected_parser).__name__}") + all_passed = False + else: + if selected_parser is not None: + print(f"✅ Edge Case {i}: {test_name}") + print(f" Got parser: {type(selected_parser).__name__}") + else: + print(f"❌ Edge Case {i}: {test_name}") + print(" Expected: Parser") + print(" Got: None") + all_passed = False + print() + + # Summary + print("=" * 60) + if all_passed: + print("✅ All tests passed! Parser selection is working correctly.") + else: + print("❌ Some tests failed. Please check the output above.") + print("=" * 60) + + def parser_instances(self): + """Test that parser instances are correctly initialized.""" + print("\n=== Parser Instance Verification ===\n") + + # Verify all parser instances are initialized + parsers_to_check = { + "string_parser": "StringParser", + "system_parser": "SystemParser", + "user_parser": "UserParser", + "assistant_parser": "AssistantParser", + "tool_parser": "ToolParser", + "text_content_parser": "TextContentParser", + "file_content_parser": "FileContentParser", + } + + print("Checking parser instance initialization:\n") + all_initialized = True + + for attr_name, expected_type in parsers_to_check.items(): + parser_instance = getattr(self.parser, attr_name, None) + if parser_instance is None: + print(f"❌ {attr_name}: Not initialized") + all_initialized = False + else: + actual_type = type(parser_instance).__name__ + if actual_type == expected_type: + print(f"✅ {attr_name}: {actual_type}") + else: + print(f"❌ {attr_name}: Expected {expected_type}, got {actual_type}") + all_initialized = False + + print() + if all_initialized: + print("✅ All parser instances are correctly initialized!") + else: + print("❌ Some parser instances are missing or incorrect.") + print() + + +if __name__ == "__main__": + demo = MultiModalParserDemo() + demo.run() diff --git a/examples/mem_reader/parser_demos/demo_string.py b/examples/mem_reader/parser_demos/demo_string.py new file mode 100644 index 000000000..e6bf99f83 --- /dev/null +++ b/examples/mem_reader/parser_demos/demo_string.py @@ -0,0 +1,30 @@ +"""Demo for StringParser.""" + +from examples.mem_reader.samples import STRING_MESSAGE_CASES +from memos.mem_reader.read_multi_modal.string_parser import StringParser + +from ._base import BaseParserDemo + + +class StringParserDemo(BaseParserDemo): + def create_parser(self): + return StringParser(embedder=self.embedder, llm=self.llm) + + def run(self): + print("=== StringParser Demo ===") + + info = {"user_id": "user1", "session_id": "session1"} + + for case in STRING_MESSAGE_CASES: + print(f"\n--- Case: {case.description} ---") + print("📝 Processing string messages:\n") + for i, msg in enumerate(case.scene_data, 1): + print(f"Message {i}: {msg[:50]}...") + source = self.demo_source_creation(msg, info) + self.demo_rebuild(source) + print() + + +if __name__ == "__main__": + demo = StringParserDemo() + demo.run() diff --git a/examples/mem_reader/parser_demos/demo_system.py b/examples/mem_reader/parser_demos/demo_system.py new file mode 100644 index 000000000..8655833ef --- /dev/null +++ b/examples/mem_reader/parser_demos/demo_system.py @@ -0,0 +1,41 @@ +"""Demo for SystemParser.""" + +from examples.mem_reader.samples import SYSTEM_MESSAGE_CASES +from memos.mem_reader.read_multi_modal.system_parser import SystemParser + +from ._base import BaseParserDemo + + +class SystemParserDemo(BaseParserDemo): + def create_parser(self): + return SystemParser(embedder=self.embedder, llm=self.llm) + + def run(self): + print("=== SystemParser Demo ===") + + info = {"user_id": "user1", "session_id": "session1"} + + for case in SYSTEM_MESSAGE_CASES: + print(f"\n--- Case: {case.description} ---") + for msg in case.scene_data: + # Workaround: SystemParser in src only supports str/dict content, not list. + # Since we cannot modify src, we flatten list content here. + msg_to_process = msg + if isinstance(msg.get("content"), list): + msg_to_process = msg.copy() + content_list = msg["content"] + merged_text = "".join( + part.get("text", "") + for part in content_list + if isinstance(part, dict) and part.get("type") == "text" + ) + msg_to_process["content"] = merged_text + + source = self.demo_source_creation(msg_to_process, info) + self.demo_rebuild(source) + self.demo_parse_fast(msg_to_process, info) + + +if __name__ == "__main__": + demo = SystemParserDemo() + demo.run() diff --git a/examples/mem_reader/parser_demos/demo_text_content.py b/examples/mem_reader/parser_demos/demo_text_content.py new file mode 100644 index 000000000..4c27c6422 --- /dev/null +++ b/examples/mem_reader/parser_demos/demo_text_content.py @@ -0,0 +1,40 @@ +"""Demo for TextContentParser.""" + +from examples.mem_reader.samples import TEXT_CONTENT_PARTS +from memos.mem_reader.read_multi_modal.text_content_parser import TextContentParser + +from ._base import BaseParserDemo + + +class TextContentParserDemo(BaseParserDemo): + def create_parser(self): + return TextContentParser(embedder=self.embedder, llm=self.llm) + + def run(self): + print("=== TextContentParser Demo ===") + + info = {"user_id": "user1", "session_id": "session1"} + + for i, part in enumerate(TEXT_CONTENT_PARTS, 1): + print(f"\n--- Part {i} ---") + source = self.demo_source_creation(part, info) + + # Legacy example attempts to rebuild and access dict keys directly. + # Since current source returns None, we must handle it safely in the demo. + print("\n🔄 Rebuilding from source...") + rebuilt = self.parser.rebuild_from_source(source) + if rebuilt: + print(" ✅ Rebuilt result:") + if isinstance(rebuilt, dict): + from examples.mem_reader.utils import pretty_print_dict + + pretty_print_dict(rebuilt) + else: + print(f" {rebuilt}") + else: + print(" ⚠️ Rebuilt result is None (not implemented in source)") + + +if __name__ == "__main__": + demo = TextContentParserDemo() + demo.run() diff --git a/examples/mem_reader/parser_demos/demo_tool.py b/examples/mem_reader/parser_demos/demo_tool.py new file mode 100644 index 000000000..991f21751 --- /dev/null +++ b/examples/mem_reader/parser_demos/demo_tool.py @@ -0,0 +1,28 @@ +"""Demo for ToolParser.""" + +from examples.mem_reader.samples import TOOL_MESSAGE_CASES +from memos.mem_reader.read_multi_modal.tool_parser import ToolParser + +from ._base import BaseParserDemo + + +class ToolParserDemo(BaseParserDemo): + def create_parser(self): + return ToolParser(embedder=self.embedder, llm=self.llm) + + def run(self): + print("=== ToolParser Demo ===") + + info = {"user_id": "user1", "session_id": "session1"} + + for case in TOOL_MESSAGE_CASES: + print(f"\n--- Case: {case.description} ---") + for msg in case.scene_data: + source = self.demo_source_creation(msg, info) + self.demo_rebuild(source) + self.demo_parse_fast(msg, info) + + +if __name__ == "__main__": + demo = ToolParserDemo() + demo.run() diff --git a/examples/mem_reader/parser_demos/demo_user.py b/examples/mem_reader/parser_demos/demo_user.py new file mode 100644 index 000000000..16dafcb2d --- /dev/null +++ b/examples/mem_reader/parser_demos/demo_user.py @@ -0,0 +1,43 @@ +"""Demo for UserParser.""" + +from examples.mem_reader.samples import USER_MESSAGE_CASES +from memos.mem_reader.read_multi_modal.user_parser import UserParser + +from ._base import BaseParserDemo + + +class UserParserDemo(BaseParserDemo): + def create_parser(self): + return UserParser(embedder=self.embedder, llm=self.llm) + + def run(self): + print("=== UserParser Demo ===") + + info = {"user_id": "user1", "session_id": "session1"} + + for case in USER_MESSAGE_CASES: + print(f"\n--- Case: {case.description} ---") + for msg in case.scene_data: + sources = self.demo_source_creation(msg, info) + + # Rebuild all sources to show full multimodal support + if isinstance(sources, list): + for i, src in enumerate(sources): + print(f"\n🔄 Rebuilding source part {i + 1} ({src.type})...") + rebuilt = self.parser.rebuild_from_source(src) + print(" ✅ Rebuilt result:") + if isinstance(rebuilt, dict): + from examples.mem_reader.utils import pretty_print_dict + + pretty_print_dict(rebuilt) + else: + print(f" {rebuilt}") + else: + self.demo_rebuild(sources) + + self.demo_parse_fast(msg, info) + + +if __name__ == "__main__": + demo = UserParserDemo() + demo.run() diff --git a/examples/mem_reader/runners/__init__.py b/examples/mem_reader/runners/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/examples/mem_reader/runners/run_multimodal.py b/examples/mem_reader/runners/run_multimodal.py new file mode 100644 index 000000000..e4176e898 --- /dev/null +++ b/examples/mem_reader/runners/run_multimodal.py @@ -0,0 +1,139 @@ +"""Runner for MultiModalStructMemReader.""" + +import argparse +import json +import time +import traceback + +from examples.mem_reader.builders import build_multimodal_reader +from examples.mem_reader.samples import ( + MULTIMODAL_MESSAGE_CASES, + RAW_INPUT_CASES, + STRING_MESSAGE_CASES, +) +from examples.mem_reader.utils import print_memory_item + + +# Map example names to test cases +EXAMPLE_MAP = { + "string_message": STRING_MESSAGE_CASES, + "multimodal": MULTIMODAL_MESSAGE_CASES, + "raw_input": RAW_INPUT_CASES, +} + + +def run_multimodal_reader(): + """Run MultiModalStructMemReader with sample data.""" + parser = argparse.ArgumentParser(description="MultiModalStructMemReader Example") + parser.add_argument( + "--example", + type=str, + default="all", + choices=[*list(EXAMPLE_MAP.keys()), "all"], + help="Example to run", + ) + parser.add_argument( + "--mode", + type=str, + default="fine", + choices=["fast", "fine"], + help="Processing mode (fast/fine)", + ) + parser.add_argument( + "--format", + type=str, + default="text", + choices=["text", "json"], + help="Output format", + ) + + args = parser.parse_args() + + print("🚀 Initializing MultiModalStructMemReader...") + reader = build_multimodal_reader() + print("✅ Initialization complete.") + + # Select test cases + if args.example == "all": + test_cases = [] + for cases in EXAMPLE_MAP.values(): + test_cases.extend(cases) + else: + test_cases = EXAMPLE_MAP[args.example] + + print(f"📋 Running {len(test_cases)} test cases in '{args.mode}' mode...\n") + + results = [] + + for i, case in enumerate(test_cases): + print(f"🔹 Case {i + 1}: {case.name} - {case.description}") + + info = case.get_info() + scene_data = case.scene_data + + # Data structure adaptation logic + # Ensure scene_data is List[List[dict]] if it looks like a single conversation + # Most samples in samples.py are wrapped in [], so they are List[List[dict]]. + # Except STRING_MESSAGE_CASES which are List[str]. + if ( + isinstance(scene_data, list) + and len(scene_data) > 0 + and not isinstance(scene_data[0], list) + and not isinstance(scene_data[0], str) + ): + scene_data = [scene_data] + + try: + start_time = time.time() + + # Determine input type + input_type = "chat" + if case in EXAMPLE_MAP["string_message"]: + input_type = "string" + elif case in EXAMPLE_MAP["raw_input"]: + input_type = "raw" + + memories = reader.get_memory( + scene_data, + type=input_type, + mode=args.mode, + info=info, + ) + duration = time.time() - start_time + + result_entry = { + "case": case.name, + "description": case.description, + "duration_seconds": round(duration, 4), + "memory_count": sum(len(m) for m in memories), + "memories": [], + } + + print( + f" ✅ Processed in {duration:.4f}s. Extracted {result_entry['memory_count']} memories." + ) + + # Flatten memories for display/output + flat_memories = [item for sublist in memories for item in sublist] + + if args.format == "json": + # Convert TextualMemoryItem to dict + result_entry["memories"] = [ + m.to_dict() if hasattr(m, "to_dict") else str(m) for m in flat_memories + ] + results.append(result_entry) + else: + for item in flat_memories: + print_memory_item(item, indent=6) + print() + + except Exception as e: + print(f" ❌ Error: {e}") + traceback.print_exc() + + if args.format == "json": + print(json.dumps(results, indent=2, ensure_ascii=False)) + + +if __name__ == "__main__": + run_multimodal_reader() diff --git a/examples/mem_reader/runners/run_simple.py b/examples/mem_reader/runners/run_simple.py new file mode 100644 index 000000000..21ecd73a9 --- /dev/null +++ b/examples/mem_reader/runners/run_simple.py @@ -0,0 +1,113 @@ +"""Runner for SimpleStructMemReader.""" + +import time + +from examples.mem_reader.samples import SIMPLE_CHAT_SCENE +from examples.mem_reader.settings import get_reader_config +from examples.mem_reader.utils import print_memory_item +from memos.configs.mem_reader import SimpleStructMemReaderConfig +from memos.mem_reader.simple_struct import SimpleStructMemReader + + +def _print_memory_sets(title: str, memories): + """memories: list[list[TextualMemoryItem]]""" + total = sum(len(mem_list) for mem_list in memories) + print(f"\n{title}") + print(f"📊 Total memory items: {total}") + print(f"✅ Extracted {len(memories)} memory sets.") + for i, memory_list in enumerate(memories): + print(f"\n--- Window/Conversation {i + 1} Memories ({len(memory_list)} items) ---") + for item in memory_list: + print_memory_item(item, indent=2) + + +def run_simple_reader(): + """Run SimpleStructMemReader with sample data.""" + print("🚀 Initializing SimpleStructMemReader from JSON config...") + + # Use settings config instead of hardcoded JSON + reader_config = SimpleStructMemReaderConfig(**get_reader_config()) + reader = SimpleStructMemReader(reader_config) + print("✅ Initialization complete.") + + info = {"user_id": "simple_user", "session_id": "simple_session"} + + print("\n📝 Processing Simple Chat Scene...") + # SIMPLE_CHAT_SCENE: list[list[dict]] (multiple conversations) + + try: + # 1) FINE + print("\n🔄 Testing FINE mode (with LLM)...") + t0 = time.time() + fine_memory = reader.get_memory( + SIMPLE_CHAT_SCENE, + type="chat", + info=info, + mode="fine", + ) + fine_time = time.time() - t0 + print(f"⏱️ Fine mode time: {fine_time:.2f}s") + _print_memory_sets("=== FINE Mode Results ===", fine_memory) + + # 2) FAST + print("\n⚡ Testing FAST mode (no LLM)...") + t0 = time.time() + fast_memory = reader.get_memory( + SIMPLE_CHAT_SCENE, + type="chat", + info=info, + mode="fast", + ) + fast_time = time.time() - t0 + print(f"⏱️ Fast mode time: {fast_time:.2f}s") + _print_memory_sets("=== FAST Mode Results ===", fast_memory) + + # 3) Transfer: FAST -> FINE + # fine_transfer_simple_mem expects a flat list[TextualMemoryItem] + print("\n🔁 Transfer FAST memories -> FINE...") + flat_fast_items = [item for mem_list in fast_memory for item in mem_list] + + t0 = time.time() + transferred = reader.fine_transfer_simple_mem(flat_fast_items, type="chat") + transfer_time = time.time() - t0 + + print(f"⏱️ Transfer time: {transfer_time:.2f}s") + _print_memory_sets("=== TRANSFER Results (FAST -> FINE) ===", transferred) + + # 4) Documents (Fine only) + print("\n📄 Processing Documents (Fine Mode Only)...") + doc_paths = [ + "text1.txt", + "text2.txt", + ] + + try: + t0 = time.time() + doc_memory = reader.get_memory( + doc_paths, + type="doc", + info={"user_id": "doc_user", "session_id": "doc_session"}, + mode="fine", + ) + doc_time = time.time() - t0 + print(f"⏱️ Doc fine mode time: {doc_time:.2f}s") + _print_memory_sets("=== DOC Mode Results (FINE) ===", doc_memory) + except Exception as e: + print(f"⚠️ Document processing failed: {e}") + print(" (This is expected if document files don't exist)") + + # 5) Summary (no speedup) + print("\n📈 Summary") + print(f" Fine: {fine_time:.2f}s") + print(f" Fast: {fast_time:.2f}s") + print(f" Transfer: {transfer_time:.2f}s") + + except Exception as e: + print(f"❌ Error during processing: {e}") + import traceback + + traceback.print_exc() + + +if __name__ == "__main__": + run_simple_reader() diff --git a/examples/mem_reader/samples.py b/examples/mem_reader/samples.py new file mode 100644 index 000000000..c29177c58 --- /dev/null +++ b/examples/mem_reader/samples.py @@ -0,0 +1,773 @@ +"""Sample data for MemReader examples. + +This module contains test cases and sample data for various MemReader scenarios, +including simple chat, multimodal messages, file content, and tool usage. +""" + +from dataclasses import dataclass, field +from typing import Any + + +@dataclass +class TestCase: + """Base class for test cases.""" + + name: str + description: str + scene_data: Any + expected_count: dict[str, int] = field(default_factory=dict) + + def get_info(self) -> dict[str, Any]: + """Get info dict for this test case.""" + return { + "user_id": "test_user", + "session_id": f"session_{self.name}", + "test_case": self.name, + } + + +# ============================================================================ +# 1. Simple Chat Samples (for SimpleStructMemReader) +# ============================================================================ + +SIMPLE_CHAT_SCENE = [ + [ + {"role": "user", "chat_time": "3 May 2025", "content": "I'm feeling a bit down today."}, + { + "role": "assistant", + "chat_time": "3 May 2025", + "content": "I'm sorry to hear that. Do you want to talk about what's been going on?", + }, + { + "role": "user", + "chat_time": "3 May 2025", + "content": "It's just been a tough couple of days, you know? Everything feels a bit overwhelming, and I just can't seem to shake it off.", + }, + { + "role": "assistant", + "chat_time": "3 May 2025", + "content": "It sounds like you're going through a lot right now. Sometimes it helps to talk things out. Is there something specific that's been weighing on you, or is it more of a general feeling?", + }, + { + "role": "user", + "chat_time": "3 May 2025", + "content": "It's a mix, I guess. Work's been really stressful, and on top of that, I've been feeling kinda disconnected from the people around me.", + }, + { + "role": "assistant", + "chat_time": "3 May 2025", + "content": "That can be really draining, especially when you're feeling isolated on top of the stress. Do you think there's something from your past that's contributing to how you're feeling now? Sometimes our emotions are tied to older experiences.", + }, + { + "role": "user", + "chat_time": "3 May 2025", + "content": "Yeah, now that you mention it… I've been thinking a lot about my childhood lately. I didn't have the easiest upbringing. My parents were always busy, and I often felt like I had to figure things out on my own. I remember one winter, I got really sick with a high fever. My parents were both working, and I didn't want to bother them. I just lay in bed, crying by myself, not knowing what to do.", + }, + { + "role": "assistant", + "chat_time": "3 May 2025", + "content": "That must have been very lonely. Growing up without that support can really make you feel like you have to handle everything on your own. How do you think that experience has affected you now?", + }, + { + "role": "user", + "chat_time": "3 May 2025", + "content": "Yeah, it was really lonely. I remember spending a lot of time doing things on my own, like drawing, because it was my only way to escape. I used to draw animals, and I created my own little world on paper. It was peaceful in a way, just me and my imagination, with no outside distractions.", + }, + { + "role": "assistant", + "chat_time": "3 May 2025", + "content": "Drawing sounds like a beautiful way to express yourself and find some peace in that solitude. It must have been a very quiet and private world for you. Do you think that sense of loneliness from back then has shaped how you connect with others today?", + }, + { + "role": "user", + "chat_time": "3 May 2025", + "content": "I think it has. I've always found it hard to let others in. I feel like I have to handle everything on my own. If I rely on someone else, I feel vulnerable, and I start to feel that loneliness again.", + }, + { + "role": "assistant", + "chat_time": "3 May 2025", + "content": "It sounds like this was a protective mechanism that helped you cope with your feelings of loneliness back then. But as you've grown, it seems like this pattern might not be serving you as well anymore. Have you thought about trying to break this cycle, or finding new ways to connect with others?", + }, + ] +] + +# ============================================================================ +# 2. String Message Cases +# ============================================================================ + +STRING_MESSAGE_CASES = [ + TestCase( + name="string_simple", + description="Simple string message", + scene_data=[ + "This is a simple text message that needs to be parsed.", + "Another string message for processing.", + "StringParser handles plain text strings and converts them to SourceMessage objects.", + ], + expected_count={"fast": 1, "fine": 1}, + ), + TestCase( + name="string_multiple", + description="Multiple string messages", + scene_data=[ + "这是第一条消息。", + "这是第二条消息。", + "这是第三条消息。", + ], + ), +] + +# ============================================================================ +# 3. Chat Message Cases (Standard & Multimodal) +# ============================================================================ + +CHAT_MESSAGE_CASES = [ + TestCase( + name="chat_simple", + description="Simple chat conversation", + scene_data=[ + [ + { + "role": "user", + "content": "Hello, how are you? I'm planning to learn Python next week.", + "chat_time": "2025-01-01T10:00:00Z", + "message_id": "chat_simple_u1", + }, + { + "role": "assistant", + "content": "I'm doing well, thank you!", + "chat_time": "2025-01-01T10:00:01Z", + "message_id": "chat_simple_a1", + }, + ] + ], + ), + TestCase( + name="chat_with_system", + description="Chat with system message", + scene_data=[ + [ + { + "role": "system", + "content": "You are a helpful assistant.", + "chat_time": "2025-01-01T10:00:00Z", + "message_id": "chat_sys_s1", + }, + { + "role": "user", + "content": "What's the weather?", + "chat_time": "2025-01-01T10:00:01Z", + "message_id": "chat_sys_u1", + }, + { + "role": "assistant", + "content": "I don't have access to weather data.", + "chat_time": "2025-01-01T10:00:02Z", + "message_id": "chat_sys_a1", + }, + ] + ], + ), + TestCase( + name="chat_multimodal_complex", + description="Complex multimodal chat with text, file, and image", + scene_data=[ + [ + { + "role": "user", + "content": [ + {"type": "text", "text": "我是测试base64"}, + { + "type": "file", + "file": { + "file_data": "Hello World", + "filename": "example.txt", + "file_id": "file_123", + }, + }, + { + "type": "image_url", + "image_url": { + "url": "https://statics.memtensor.com.cn/memos/memos-banner.gif", + "detail": "auto", + }, + }, + ], + "chat_time": "2025-01-01T10:00:03Z", + "message_id": "chat_mm_u1", + } + ] + ], + ), +] + + +# ============================================================================ +# 4. Tool Message Cases +# ============================================================================ + +TOOL_MESSAGE_CASES = [ + TestCase( + name="tool_weather", + description="Weather tool result", + scene_data=[ + { + "role": "user", + "content": "I'm planning a hiking trip to New York this weekend, can you check the weather?", + "chat_time": "2025-01-15T10:00:00", + "message_id": "msg_000", + }, + { + "role": "tool", + "content": '{"result": "Weather in New York: 72°F, sunny"}', + "tool_call_id": "call_abc123", + "chat_time": "2025-01-15T10:00:30", + "message_id": "msg_001", + }, + ], + ), + TestCase( + name="tool_data", + description="Data API result", + scene_data=[ + { + "role": "user", + "content": "Please retrieve my saved reading list items.", + "chat_time": "2025-01-15T10:05:00", + "message_id": "msg_000_2", + }, + { + "role": "tool", + "content": '{"status": "success", "data": {"items": ["The Great Gatsby", "1984", "Python Crash Course"]}}', + "tool_call_id": "call_def456", + "chat_time": "2025-01-15T10:05:30", + "message_id": "msg_002", + }, + ], + ), + TestCase( + name="tool_db", + description="Database query result", + scene_data=[ + { + "role": "user", + "content": "Did I complete the registration for the upcoming workshop?", + "chat_time": "2025-01-15T10:10:00", + "message_id": "msg_000_3", + }, + { + "role": "tool", + "content": "Database query executed successfully. Found registration record for user_id=123: status=confirmed.", + "tool_call_id": "call_ghi789", + "chat_time": "2025-01-15T10:10:30", + "message_id": "msg_003", + }, + ], + ), +] + +# ============================================================================ +# 5. File Content Samples (for FileContentParser Demo) +# ============================================================================ + +FILE_CONTENT_PARTS = [ + { + "type": "file", + "file": { + "filename": "document.pdf", + "file_id": "file_123", + "file_data": "This is the content extracted from the PDF file...", + }, + }, + { + "type": "file", + "file": { + "filename": "report.docx", + "file_id": "file_456", + "file_data": "Report content: Analysis of Q4 performance...", + }, + }, + { + "type": "file", + "file": { + "filename": "data.csv", + "file_id": "file_789", + "path": "/path/to/data.csv", + }, + }, +] + +FILE_CONTENT_REAL_FILE_PART = { + "type": "file", + "file": { + "filename": "example.txt", + "path": "examples/mem_reader/text1.txt", + }, +} + +# ============================================================================ +# 6. Text Content Samples (for TextContentParser Demo) +# ============================================================================ + +TEXT_CONTENT_PARTS = [ + {"type": "text", "text": "This is a simple text content part."}, + {"type": "text", "text": "TextContentParser handles text parts in multimodal messages."}, +] + +# ============================================================================ +# 7. System Message Samples (for SystemParser Demo) +# ============================================================================ + +SYSTEM_MESSAGE_CASES = [ + TestCase( + name="system_simple", + description="Simple text system message", + scene_data=[ + { + "role": "system", + "content": "You are a helpful assistant that provides clear and concise answers.", + "chat_time": "2025-01-15T10:00:00", + "message_id": "msg_001", + } + ], + ), + TestCase( + name="system_multimodal", + description="Multimodal system message (multiple text parts)", + scene_data=[ + { + "role": "system", + "content": [ + {"type": "text", "text": "You are a helpful assistant."}, + {"type": "text", "text": "Always provide clear and concise answers."}, + {"type": "text", "text": "If you don't know something, say so."}, + ], + "chat_time": "2025-01-15T10:05:00", + "message_id": "msg_002", + } + ], + ), + TestCase( + name="system_structured", + description="Structured system instructions (multiple text parts)", + scene_data=[ + { + "role": "system", + "content": [ + { + "type": "text", + "text": "You are a coding assistant specialized in Python programming.", + }, + {"type": "text", "text": "Always write clean, well-documented code."}, + {"type": "text", "text": "Explain your reasoning when providing solutions."}, + ], + "chat_time": "2025-01-15T10:10:00", + "message_id": "msg_003", + } + ], + ), +] + +# ============================================================================ +# 8. User Message Samples (for UserParser Demo) +# ============================================================================ + +USER_MESSAGE_CASES = [ + TestCase( + name="user_simple", + description="Simple text user message", + scene_data=[ + { + "role": "user", + "content": "I'm feeling a bit down today. Can you help me?", + "chat_time": "2025-01-15T10:00:00", + "message_id": "msg_001", + } + ], + ), + TestCase( + name="user_multimodal", + description="Multimodal user message (text + file)", + scene_data=[ + { + "role": "user", + "content": [ + {"type": "text", "text": "Please analyze this document:"}, + { + "type": "file", + "file": { + "filename": "report.pdf", + "file_id": "file_123", + "file_data": "This is the content of the PDF file...", + }, + }, + ], + "chat_time": "2025-01-15T10:05:00", + "message_id": "msg_002", + } + ], + ), + TestCase( + name="user_image", + description="User message with image", + scene_data=[ + { + "role": "user", + "content": [ + {"type": "text", "text": "What's in this image?"}, + {"type": "image_url", "image_url": {"url": "https://example.com/image.jpg"}}, + ], + "chat_time": "2025-01-15T10:10:00", + "message_id": "msg_003", + } + ], + ), +] + +# ============================================================================ +# 9. Assistant Message Samples (for AssistantParser Demo) +# ============================================================================ + +ASSISTANT_MESSAGE_CASES = [ + TestCase( + name="assistant_simple", + description="Simple support message", + scene_data=[ + { + "role": "assistant", + "content": "I'm sorry to hear that you're feeling down. Would you like to talk about what's been going on?", + "chat_time": "2025-01-15T10:00:30", + "message_id": "msg_001", + } + ], + ), + TestCase( + name="assistant_analysis", + description="Document analysis response", + scene_data=[ + { + "role": "assistant", + "content": "Based on the document you provided, I can see several key points: 1) The project timeline, 2) Budget considerations, and 3) Resource allocation.", + "chat_time": "2025-01-15T10:05:30", + "message_id": "msg_002", + } + ], + ), + TestCase( + name="assistant_code", + description="Code solution", + scene_data=[ + { + "role": "assistant", + "content": "Here's a Python solution for your problem:\n```python\ndef solve_problem():\n return 'solution'\n```", + "chat_time": "2025-01-15T10:10:30", + "message_id": "msg_003", + } + ], + ), +] + +# ============================================================================ +# 10. Image Samples (for ImageParser Demo) +# ============================================================================ + +IMAGE_MESSAGE_CASES = [ + { + "type": "image_url", + "image_url": { + "url": "https://statics.memtensor.com.cn/memos/memos-banner.gif", + "detail": "auto", + }, + "_note": "Real Image (MemOS Banner)", + }, + { + "type": "image", + "image_url": "https://example.com/image2.png", + "_note": "Dummy Image (Negative Test)", + }, +] + +# ============================================================================ +# 11. Multimodal Message Cases (from Legacy) +# ============================================================================ + +MULTIMODAL_MESSAGE_CASES = [ + TestCase( + name="multimodal_text_image", + description="User message with text and image", + scene_data=[ + [ + { + "role": "user", + "content": [ + {"type": "text", "text": "帮我看看这张图片大概是什么内容?"}, + { + "type": "image_url", + "image_url": { + "url": "https://example.com/mountain_lake.jpg", + "detail": "high", + }, + }, + ], + "chat_time": "2025-11-24T10:20:00Z", + "message_id": "mm-img-1", + } + ] + ], + ), + TestCase( + name="multimodal_text_file", + description="User message with text and file", + scene_data=[ + [ + { + "role": "user", + "content": [ + {"type": "text", "text": "请阅读这个PDF,总结里面的要点。"}, + {"type": "file", "file": {"file_id": "file_123", "filename": "report.pdf"}}, + ], + "chat_time": "2025-11-24T10:21:00Z", + "message_id": "mm-file-1", + } + ] + ], + ), + TestCase( + name="oss_text_file", + description="User message with text and file", + scene_data=[ + [ + { + "role": "user", + "content": [ + {"type": "text", "text": "请阅读这个PDF,总结里面的要点。"}, + { + "type": "file", + "file": { + "file_id": "file_123", + "filename": "report.pdf", + "file_data": "@http://139.196.232.20:9090/graph-test/algorithm/2025_11_13/1763043889_1763043782_PM1%E8%BD%A6%E9%97%B4PMT%E9%9D%B4%E5%8E%8B%E8%BE%B9%E5%8E%8B%E5%8E%8B%E5%8A%9B%E6%97%A0%E6%B3%95%E5%BB%BA%E7%AB%8B%E6%95%85%E9%9A%9C%E6%8A%A5%E5%91%8A20240720.md", + }, + }, + ], + "chat_time": "2025-11-24T10:21:00Z", + "message_id": "mm-file-1", + } + ] + ], + ), + TestCase( + name="pure_data_file", + description="User message with text and file", + scene_data=[ + [ + { + "role": "user", + "content": [ + {"type": "text", "text": "请阅读这个PDF,总结里面的要点。"}, + { + "type": "file", + "file": { + "file_id": "file_123", + "filename": "report.pdf", + "file_data": "明文记忆是系统与用户对话、操作等交互中动态习得,以及外部提供的、可显式管理的结构化知识形态,通常以文档、提示模板、图结构或用户规则等形式存在。它具备编辑性、可共享性与治理友好性,适合存储需要频繁修改、可审计或多方协同使用的信息。 在 MemOS 中,明文记忆可用于动态生成推理上下文、个性化偏好注入、多代理协作共享等场景,成为连接人类输入与模型认知的关键桥梁。激活记忆是指模型在推理过程中产生的瞬时性认知状态,包括 KV cache、隐藏层激活、注意力权重等中间张量结构。它通常用于维持上下文连续性、对话一致性与行为风格控制。 MemOS 将激活记忆抽象为可调度资源,支持按需唤醒、延迟卸载与结构变换。例如,某些上下文状态可以被压缩为“半结构化记忆片段”用于未来复用,也可以在任务级别转化为参数化模块,支持短期记忆的长期化演进。这一机制为模型行为一致性、风格保持与状态持续性提供了基础。", + }, + }, + ], + "chat_time": "2025-11-24T10:21:00Z", + "message_id": "mm-file-1", + } + ] + ], + ), + TestCase( + name="local_data_file", + description="User message with text and file", + scene_data=[ + [ + { + "role": "user", + "content": [ + {"type": "text", "text": "请阅读这个PDF,总结里面的要点。"}, + { + "type": "file", + "file": { + "file_id": "file_123", + "filename": "report.pdf", + "file_data": "./my_local_file/report.pdf", + }, + }, + ], + "chat_time": "2025-11-24T10:21:00Z", + "message_id": "mm-file-1", + } + ] + ], + ), + TestCase( + name="internet_file", + description="User message with text and file", + scene_data=[ + [ + { + "role": "user", + "content": [ + {"type": "text", "text": "请阅读这个PDF,总结里面的要点。"}, + { + "type": "file", + "file": { + "file_id": "file_123", + "filename": "report.pdf", + "file_data": "https://upload.wikimedia.org/wikipedia/commons/c/cb/NLC416-16jh004830-88775_%E7%B4%85%E6%A8%93%E5%A4%A2.pdf", + }, + }, + ], + "chat_time": "2025-11-24T10:21:00Z", + "message_id": "mm-file-1", + } + ] + ], + ), + TestCase( + name="multimodal_mixed", + description="Mixed multimodal message (text + file + image)", + scene_data=[ + [ + { + "role": "user", + "content": [ + {"type": "text", "text": "请同时分析这个报告和图表。"}, + { + "type": "file", + "file": {"file_id": "file_789", "filename": "analysis_report.pdf"}, + }, + { + "type": "image_url", + "image_url": {"url": "https://example.com/chart.png", "detail": "auto"}, + }, + ], + "chat_time": "2025-11-24T10:23:00Z", + "message_id": "mixed-1", + } + ] + ], + ), + TestCase( + name="multimodal_audio", + description="Audio-only message", + scene_data=[ + [ + { + "role": "user", + "content": [ + { + "type": "input_audio", + "input_audio": {"data": "base64_encoded_audio_here", "format": "mp3"}, + } + ], + "chat_time": "2025-11-24T10:22:00Z", + "message_id": "audio-1", + } + ] + ], + ), +] + +# ============================================================================ +# 12. Raw Input Cases (from Legacy) +# ============================================================================ + +RAW_INPUT_CASES = [ + TestCase( + name="raw_text_items", + description="Pure text input items without dialog context", + scene_data=[ + [ + {"type": "text", "text": "这是一段独立的文本输入,没有明确的对话上下文。"}, + {"type": "text", "text": "它依然会被抽取和写入明文记忆。"}, + ] + ], + ), + TestCase( + name="raw_file_item", + description="Pure file input by file_id", + scene_data=[ + [{"type": "file", "file": {"file_id": "file_uploaded_123", "filename": "document.pdf"}}] + ], + ), + TestCase( + name="file_only_file_id", + description="File with only file_id parameter", + scene_data=[[{"type": "file", "file": {"file_id": "file_only_id_123"}}]], + ), + TestCase( + name="file_only_filename", + description="File with only filename parameter", + scene_data=[[{"type": "file", "file": {"filename": "document_only.pdf"}}]], + ), + TestCase( + name="file_only_file_data_base64", + description="File with only file_data (base64 encoded)", + scene_data=[ + [ + { + "type": "file", + "file": { + "file_data": "data:application/pdf;base64,JVBERi0xLjQKJdPr6eEKMSAwIG9iago8PAovVHlwZSAvQ2F0YWxvZwovUGFnZXMgMiAwIFIKPj4KZW5kb2JqCjIgMCBvYmoKPDwKL1R5cGUgL1BhZ2VzCi9LaWRzIFszIDAgUl0KL0NvdW50IDEKPD4KZW5kb2JqCjMgMCBvYmoKPDwKL1R5cGUgL1BhZ2UKL1BhcmVudCAyIDAgUgovTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQovUmVzb3VyY2VzIDw8Ci9Gb250IDw8Ci9GMSA0IDAgUgo+Pgo+PgovQ29udGVudHMgNSAwIFIKPj4KZW5kb2JqCjQgMCBvYmoKPDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1R5cGUxCi9CYXNlRm9udCAvSGVsdmV0aWNhCj4+CmVuZG9iag==" + }, + } + ] + ], + ), + TestCase( + name="file_only_file_data_url", + description="File with only file_data (URL)", + scene_data=[ + [{"type": "file", "file": {"file_data": "https://example.com/documents/report.pdf"}}] + ], + ), + TestCase( + name="file_only_file_data_text", + description="File with only file_data (plain text content)", + scene_data=[ + [ + { + "type": "file", + "file": { + "file_data": "This is a plain text file content. It contains multiple lines.\nLine 2 of the file.\nLine 3 of the file." + }, + } + ] + ], + ), + TestCase( + name="file_file_data_and_file_id", + description="File with file_data and file_id", + scene_data=[ + [ + { + "type": "file", + "file": { + "file_data": "https://example.com/documents/data.pdf", + "file_id": "file_with_data_123", + }, + } + ] + ], + ), + TestCase( + name="file_file_data_and_filename", + description="File with file_data and filename", + scene_data=[ + [ + { + "type": "file", + "file": { + "file_data": "This is file content with filename.", + "filename": "content_file.txt", + }, + } + ] + ], + ), +] diff --git a/examples/mem_reader/settings.py b/examples/mem_reader/settings.py new file mode 100644 index 000000000..0623a91de --- /dev/null +++ b/examples/mem_reader/settings.py @@ -0,0 +1,107 @@ +"""Configuration settings for MemReader examples. + +This module handles environment variables and default configurations for +LLMs, Embedders, and Chunkers used in the examples. +""" + +import os + +from typing import Any + +from dotenv import load_dotenv + + +# Load environment variables from .env file +load_dotenv() + + +def get_llm_config() -> dict[str, Any]: + """Get LLM configuration from environment variables.""" + openai_api_key = os.getenv("OPENAI_API_KEY") + openai_base_url = os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1") + ollama_api_base = os.getenv("OLLAMA_API_BASE", "http://localhost:11434") + + # Use MEMRADER_ variables from .env as primary source + reader_model = os.getenv("MEMRADER_MODEL", os.getenv("MOS_CHAT_MODEL", "gpt-4o-mini")) + reader_api_key = os.getenv("MEMRADER_API_KEY", openai_api_key) + reader_api_base = os.getenv("MEMRADER_API_BASE", openai_base_url) + + # Check for specific MemReader backend override, otherwise assume openai if keys present + llm_backend = os.getenv("MEMRADER_LLM_BACKEND", "openai") + + if llm_backend == "ollama": + return { + "backend": "ollama", + "config": { + "model_name_or_path": reader_model, + "api_base": ollama_api_base, + "temperature": float(os.getenv("MEMRADER_TEMPERATURE", "0.0")), + "remove_think_prefix": os.getenv("MEMRADER_REMOVE_THINK_PREFIX", "true").lower() + == "true", + "max_tokens": int(os.getenv("MEMRADER_MAX_TOKENS", "8192")), + }, + } + else: # openai + return { + "backend": "openai", + "config": { + "model_name_or_path": reader_model, + "api_key": reader_api_key or "EMPTY", + "api_base": reader_api_base, + "temperature": float(os.getenv("MEMRADER_TEMPERATURE", "0.5")), + "remove_think_prefix": os.getenv("MEMRADER_REMOVE_THINK_PREFIX", "true").lower() + == "true", + "max_tokens": int(os.getenv("MEMRADER_MAX_TOKENS", "8192")), + }, + } + + +def get_embedder_config() -> dict[str, Any]: + """Get Embedder configuration from environment variables.""" + openai_api_key = os.getenv("OPENAI_API_KEY") + openai_base_url = os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1") + ollama_api_base = os.getenv("OLLAMA_API_BASE", "http://localhost:11434") + + # .env uses MOS_EMBEDDER_BACKEND + embedder_backend = os.getenv("MOS_EMBEDDER_BACKEND", "ollama") + + if embedder_backend == "universal_api": + return { + "backend": "universal_api", + "config": { + "provider": os.getenv("MOS_EMBEDDER_PROVIDER", "openai"), + "api_key": os.getenv("MOS_EMBEDDER_API_KEY", openai_api_key or "sk-xxxx"), + "model_name_or_path": os.getenv("MOS_EMBEDDER_MODEL", "text-embedding-3-large"), + "base_url": os.getenv("MOS_EMBEDDER_API_BASE", openai_base_url), + }, + } + else: # ollama + return { + "backend": "ollama", + "config": { + "model_name_or_path": os.getenv("MOS_EMBEDDER_MODEL", "nomic-embed-text:latest"), + "api_base": ollama_api_base, + }, + } + + +def get_chunker_config() -> dict[str, Any]: + """Get Chunker configuration from environment variables.""" + return { + "backend": "sentence", + "config": { + "tokenizer_or_token_counter": "gpt2", + "chunk_size": 512, + "chunk_overlap": 128, + "min_sentences_per_chunk": 1, + }, + } + + +def get_reader_config() -> dict[str, Any]: + """Get full reader configuration.""" + return { + "llm": get_llm_config(), + "embedder": get_embedder_config(), + "chunker": get_chunker_config(), + } diff --git a/examples/mem_reader/simple_struct_reader.py b/examples/mem_reader/simple_struct_reader.py deleted file mode 100644 index 72dc5fd05..000000000 --- a/examples/mem_reader/simple_struct_reader.py +++ /dev/null @@ -1,831 +0,0 @@ -import argparse -import json -import os -import time - -from typing import Any - -from dotenv import load_dotenv - -from memos.configs.mem_reader import SimpleStructMemReaderConfig -from memos.mem_reader.simple_struct import SimpleStructMemReader -from memos.memories.textual.item import ( - SourceMessage, - TextualMemoryItem, - TreeNodeTextualMemoryMetadata, -) - - -# Load environment variables from .env file -load_dotenv() - - -def print_textual_memory_item( - item: TextualMemoryItem, max_memory_length: int = 200, indent: int = 0 -): - """ - Print a TextualMemoryItem in a structured format. - - Args: - item: The TextualMemoryItem to print - max_memory_length: Maximum length of memory content to display - indent: Number of spaces for indentation - """ - indent_str = " " * indent - print(f"{indent_str}{'=' * 80}") - print(f"{indent_str}TextualMemoryItem") - print(f"{indent_str}{'=' * 80}") - print(f"{indent_str}ID: {item.id}") - print( - f"{indent_str}Memory: {item.memory[:max_memory_length]}{'...' if len(item.memory) > max_memory_length else ''}" - ) - print(f"{indent_str}Memory Length: {len(item.memory)} characters") - - # Print metadata - if hasattr(item.metadata, "user_id"): - print(f"{indent_str}User ID: {item.metadata.user_id}") - if hasattr(item.metadata, "session_id"): - print(f"{indent_str}Session ID: {item.metadata.session_id}") - if hasattr(item.metadata, "memory_type"): - print(f"{indent_str}Memory Type: {item.metadata.memory_type}") - if hasattr(item.metadata, "type"): - print(f"{indent_str}Type: {item.metadata.type}") - if hasattr(item.metadata, "key") and item.metadata.key: - print(f"{indent_str}Key: {item.metadata.key}") - if hasattr(item.metadata, "tags") and item.metadata.tags: - print(f"{indent_str}Tags: {', '.join(item.metadata.tags)}") - if hasattr(item.metadata, "confidence"): - print(f"{indent_str}Confidence: {item.metadata.confidence}") - if hasattr(item.metadata, "status"): - print(f"{indent_str}Status: {item.metadata.status}") - if hasattr(item.metadata, "background") and item.metadata.background: - bg_preview = ( - item.metadata.background[:100] + "..." - if len(item.metadata.background) > 100 - else item.metadata.background - ) - print(f"{indent_str}Background: {bg_preview}") - if hasattr(item.metadata, "sources") and item.metadata.sources: - print(f"{indent_str}Sources ({len(item.metadata.sources)}):") - for i, source in enumerate(item.metadata.sources): - source_info = [] - if hasattr(source, "type"): - source_info.append(f"type={source.type}") - if hasattr(source, "role"): - source_info.append(f"role={source.role}") - if hasattr(source, "doc_path"): - source_info.append(f"doc_path={source.doc_path}") - if hasattr(source, "chat_time"): - source_info.append(f"chat_time={source.chat_time}") - if hasattr(source, "index") and source.index is not None: - source_info.append(f"index={source.index}") - print(f"{indent_str} [{i + 1}] {', '.join(source_info)}") - if hasattr(item.metadata, "created_at"): - print(f"{indent_str}Created At: {item.metadata.created_at}") - if hasattr(item.metadata, "updated_at"): - print(f"{indent_str}Updated At: {item.metadata.updated_at}") - if hasattr(item.metadata, "embedding") and item.metadata.embedding: - print(f"{indent_str}Embedding: [vector of {len(item.metadata.embedding)} dimensions]") - print(f"{indent_str}{'=' * 80}\n") - - -def print_textual_memory_item_json(item: TextualMemoryItem, indent: int = 2): - """ - Print a TextualMemoryItem as formatted JSON. - - Args: - item: The TextualMemoryItem to print - indent: JSON indentation level - """ - # Convert to dict and exclude embedding for readability - data = item.to_dict() - if "metadata" in data and "embedding" in data["metadata"]: - embedding = data["metadata"]["embedding"] - if embedding: - data["metadata"]["embedding"] = f"[vector of {len(embedding)} dimensions]" - - print(json.dumps(data, indent=indent, ensure_ascii=False)) - - -def get_reader_config() -> dict[str, Any]: - """ - Get reader configuration from environment variables. - - Returns a dictionary that can be used to create SimpleStructMemReaderConfig. - Similar to APIConfig.get_reader_config() in server_router_api.py. - - Returns: - Configuration dictionary for SimpleStructMemReaderConfig - """ - openai_api_key = os.getenv("OPENAI_API_KEY") - openai_base_url = os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1") - ollama_api_base = os.getenv("OLLAMA_API_BASE", "http://localhost:11434") - - # Get LLM backend and config - llm_backend = os.getenv("MEM_READER_LLM_BACKEND", "openai") - if llm_backend == "ollama": - llm_config = { - "backend": "ollama", - "config": { - "model_name_or_path": os.getenv("MEM_READER_LLM_MODEL", "qwen3:0.6b"), - "api_base": ollama_api_base, - "temperature": float(os.getenv("MEM_READER_LLM_TEMPERATURE", "0.0")), - "remove_think_prefix": os.getenv( - "MEM_READER_LLM_REMOVE_THINK_PREFIX", "true" - ).lower() - == "true", - "max_tokens": int(os.getenv("MEM_READER_LLM_MAX_TOKENS", "8192")), - }, - } - else: # openai - llm_config = { - "backend": "openai", - "config": { - "model_name_or_path": os.getenv("MEM_READER_LLM_MODEL", "gpt-4o-mini"), - "api_key": openai_api_key or os.getenv("MEMRADER_API_KEY", "EMPTY"), - "api_base": openai_base_url, - "temperature": float(os.getenv("MEM_READER_LLM_TEMPERATURE", "0.5")), - "remove_think_prefix": os.getenv( - "MEM_READER_LLM_REMOVE_THINK_PREFIX", "true" - ).lower() - == "true", - "max_tokens": int(os.getenv("MEM_READER_LLM_MAX_TOKENS", "8192")), - }, - } - - # Get embedder backend and config - embedder_backend = os.getenv( - "MEM_READER_EMBEDDER_BACKEND", os.getenv("MOS_EMBEDDER_BACKEND", "ollama") - ) - if embedder_backend == "universal_api": - embedder_config = { - "backend": "universal_api", - "config": { - "provider": os.getenv( - "MEM_READER_EMBEDDER_PROVIDER", os.getenv("MOS_EMBEDDER_PROVIDER", "openai") - ), - "api_key": os.getenv( - "MEM_READER_EMBEDDER_API_KEY", - os.getenv("MOS_EMBEDDER_API_KEY", openai_api_key or "sk-xxxx"), - ), - "model_name_or_path": os.getenv( - "MEM_READER_EMBEDDER_MODEL", - os.getenv("MOS_EMBEDDER_MODEL", "text-embedding-3-large"), - ), - "base_url": os.getenv( - "MEM_READER_EMBEDDER_API_BASE", - os.getenv("MOS_EMBEDDER_API_BASE", openai_base_url), - ), - }, - } - else: # ollama - embedder_config = { - "backend": "ollama", - "config": { - "model_name_or_path": os.getenv( - "MEM_READER_EMBEDDER_MODEL", - os.getenv("MOS_EMBEDDER_MODEL", "nomic-embed-text:latest"), - ), - "api_base": ollama_api_base, - }, - } - - return { - "llm": llm_config, - "embedder": embedder_config, - "chunker": { - "backend": "sentence", - "config": { - "tokenizer_or_token_counter": "gpt2", - "chunk_size": 512, - "chunk_overlap": 128, - "min_sentences_per_chunk": 1, - }, - }, - } - - -def main(): - # Parse command line arguments - parser = argparse.ArgumentParser(description="Test Mem-Reader with structured output") - parser.add_argument( - "--format", - choices=["text", "json"], - default="text", - help="Output format: 'text' for structured text, 'json' for JSON format (default: text)", - ) - parser.add_argument( - "--max-memory-length", - type=int, - default=200, - help="Maximum length of memory content to display in text format (default: 200)", - ) - args = parser.parse_args() - - # 1. Create Configuration from environment variables or JSON file - # Try to get config from environment variables first - openai_api_key = os.getenv("OPENAI_API_KEY") - if openai_api_key: - # Use environment variables (similar to server_router_api.py) - config_dict = get_reader_config() - reader_config = SimpleStructMemReaderConfig.model_validate(config_dict) - else: - # Fall back to JSON file - reader_config = SimpleStructMemReaderConfig.from_json_file( - "examples/data/config/simple_struct_reader_config.json" - ) - reader = SimpleStructMemReader(reader_config) - - # 2. Define scene data - scene_data = [ - [ - {"role": "user", "chat_time": "3 May 2025", "content": "I'm feeling a bit down today."}, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "I'm sorry to hear that. Do you want to talk about what's been going on?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "It's just been a tough couple of days, you know? Everything feels a bit overwhelming, and I just can't seem to shake it off.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "It sounds like you're going through a lot right now. Sometimes it helps to talk things out. Is there something specific that's been weighing on you, or is it more of a general feeling?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "It's a mix, I guess. Work's been really stressful, and on top of that, I've been feeling kinda disconnected from the people around me.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "That can be really draining, especially when you're feeling isolated on top of the stress. Do you think there's something from your past that's contributing to how you're feeling now? Sometimes our emotions are tied to older experiences.", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "Yeah, now that you mention it… I've been thinking a lot about my childhood lately. I didn't have the easiest upbringing. My parents were always busy, and I often felt like I had to figure things out on my own. I remember one winter, I got really sick with a high fever. My parents were both working, and I didn't want to bother them. I just lay in bed, crying by myself, not knowing what to do.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "That must have been very lonely. Growing up without that support can really make you feel like you have to handle everything on your own. How do you think that experience has affected you now?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "Yeah, it was really lonely. I remember spending a lot of time doing things on my own, like drawing, because it was my only way to escape. I used to draw animals, and I created my own little world on paper. It was peaceful in a way, just me and my imagination, with no outside distractions.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "Drawing sounds like a beautiful way to express yourself and find some peace in that solitude. It must have been a very quiet and private world for you. Do you think that sense of loneliness from back then has shaped how you connect with others today?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "I think it has. I've always found it hard to let others in. I feel like I have to handle everything on my own. If I rely on someone else, I feel vulnerable, and I start to feel that loneliness again.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "It sounds like this was a protective mechanism that helped you cope with your feelings of loneliness back then. But as you've grown, it seems like this pattern might not be serving you as well anymore. Have you thought about trying to break this cycle, or finding new ways to connect with others?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "I've thought about it, though it's hard. But I also know I can't keep going like this forever. Maybe it's time to seek some help.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "It's a big step, but a positive one. Exploring your emotions and past experiences could really help you understand how they've shaped your present. Therapy could be a great place to start, as it would help you connect with both yourself and others. Would you be open to trying it?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "I'm open to trying. Thank you for encouraging me. It feels like it might be a good starting point for me.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "I'm really glad to hear that. Taking that first step is always difficult, but you've made an important decision. If you need help finding the right therapist, or just want to talk, I'm here for you.", - }, - ], - [ - { - "role": "user", - "chat_time": "3 May 2025", - "content": "This week I've been feeling a bit off, especially when playing tennis. My body just doesn't feel right.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "It sounds like you've been having some physical discomfort lately. Where specifically are you feeling unwell? Is there something particular about tennis that's been difficult?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "I just feel a bit fatigued, and every time I play tennis, my movements feel off. I used to play pretty well, but lately, I've been feeling weak and my movements aren't as coordinated as they used to be.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "Physical discomfort can definitely affect performance, especially in a sport like tennis that requires quick reactions and coordination. Have you noticed anything specific that might be causing these changes? Could it be overtraining, or is there another physical issue making you feel off?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "I think it might be due to stress and lack of sleep recently. I just feel drained all the time. Plus, I've been frustrated with my tennis performance, which makes me feel even worse, like I'm stuck in a vicious cycle.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "Stress and poor sleep quality can definitely affect your physical performance, especially in sports. When you're also feeling down about your performance, it's easy to fall into a negative cycle. Have you tried anything to relieve some of the stress, or to improve your sleep?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "I've tried some relaxation techniques, like deep breathing and simple meditation, but it doesn't seem to help much. I still can't focus during tennis, and I feel like my mind is distracted by other things.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "Relaxation techniques like deep breathing and meditation can help reduce stress, but sometimes we need a more structured approach to improve both our physical and mental state. For example, you might want to focus on specific aspects of your tennis training, or adjust your rest and recovery time. Have you thought about setting smaller goals for yourself? Like focusing on a specific tennis move each day, rather than expecting perfection right away? That might help you gradually regain confidence.", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "That's a good idea. I think I've been expecting too much from myself, which just makes me more anxious. Maybe I can start with small practice sessions and gradually find my rhythm again.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "Exactly! Setting small and clear goals will help reduce pressure and give you a sense of accomplishment. And don't forget that rest is just as important—taking time to recover will help you feel better physically and mentally. Both physical and mental recovery are key to improving your performance and health.", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "Thanks, I feel like I need to rethink a few things. Maybe I really need to be kinder to myself and take things step by step.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "You're on the right track. Rethinking things and giving yourself space and patience is so important. You've already taken the first step, now just keep moving forward, one step at a time. If you need anything, I'm always here to help.", - }, - ], - [ - { - "role": "user", - "chat_time": "3 May 2025", - "content": "Yesterday at 3 PM I had a meeting with my team about the new project. We discussed the timeline and I'm concerned we won't meet the deadline of December 15th.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "I understand your concern about the project timeline. What specific challenges do you think might prevent your team from meeting the December 15th deadline?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "We have too many requirements to implement in just two weeks. The backend team needs at least until December 10th to finish their part, which leaves almost no time for testing before the deadline.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "That's definitely a tight timeline. Have you considered prioritizing the requirements to focus on the most critical features first? You might also want to discuss with stakeholders about possibly extending the deadline or reducing the scope for this initial release.", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "That's a good point. We have a follow-up meeting scheduled for tomorrow morning at 9:30 AM. I'll suggest we prioritize features and maybe propose pushing the deadline to January 5th next year.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "That sounds like a solid approach. Coming to the meeting with both a prioritization strategy and a specific alternative deadline shows you've thought through the problem carefully. It might also help to bring some data about similar past projects and how long they took to complete, if you have that information available.", - }, - ], - ] - - print("=== Mem-Reader Fast vs Fine Mode Comparison ===\n") - - # 3. Test Fine Mode (default) - print("🔄 Testing FINE mode (default, with LLM processing)...") - start_time = time.time() - fine_memory = reader.get_memory( - scene_data, type="chat", info={"user_id": "user1", "session_id": "session1"}, mode="fine" - ) - fine_time = time.time() - start_time - print(f"✅ Fine mode completed in {fine_time:.2f} seconds") - print(f"📊 Fine mode generated {sum(len(mem_list) for mem_list in fine_memory)} memory items") - - # 4. Test Fast Mode - print("\n⚡ Testing FAST mode (quick processing, no LLM calls)...") - start_time = time.time() - fast_memory = reader.get_memory( - scene_data, type="chat", info={"user_id": "user1", "session_id": "session1"}, mode="fast" - ) - fast_time = time.time() - start_time - print(f"✅ Fast mode completed in {fast_time:.2f} seconds") - print(f"📊 Fast mode generated {sum(len(mem_list) for mem_list in fast_memory)} memory items") - - # 5. Performance Comparison - print("\n📈 Performance Comparison:") - print(f" Fine mode: {fine_time:.2f}s") - print(f" Fast mode: {fast_time:.2f}s") - print(f" Speed improvement: {fine_time / fast_time:.1f}x faster") - - # 6. Show sample results from both modes - print("\n🔍 Sample Results Comparison:") - print("\n--- FINE Mode Results (first 3 items) ---") - for i, mem_list in enumerate(fine_memory[:3]): - for j, mem_item in enumerate(mem_list[:2]): # Show first 2 items from each list - print(f"\n[Scene {i}][Item {j}]") - if args.format == "json": - print_textual_memory_item_json(mem_item, indent=2) - else: - print_textual_memory_item( - mem_item, max_memory_length=args.max_memory_length, indent=2 - ) - - print("\n--- FAST Mode Results (first 3 items) ---") - for i, mem_list in enumerate(fast_memory[:3]): - for j, mem_item in enumerate(mem_list[:2]): # Show first 2 items from each list - print(f"\n[Scene {i}][Item {j}]") - if args.format == "json": - print_textual_memory_item_json(mem_item, indent=2) - else: - print_textual_memory_item( - mem_item, max_memory_length=args.max_memory_length, indent=2 - ) - - # 7. Example of transfer fast mode result into fine result - fast_mode_memories = [ - TextualMemoryItem( - id="4553141b-3a33-4548-b779-e677ec797a9f", - memory="user: Nate:Oh cool! I might check that one out some time soon! I do love watching classics.\nassistant: Joanna:Yep, that movie is awesome. I first watched it around 3 years ago. I even went out and got a physical copy!\nuser: Nate:Sounds cool! Have you seen it a lot? sounds like you know the movie well!\nassistant: Joanna:A few times. It's one of my favorites! I really like the idea and the acting.\nuser: Nate:Cool! I'll definitely check it out. Thanks for the recommendation!\nassistant: Joanna:No problem, Nate! Let me know if you like it!\n", - metadata=TreeNodeTextualMemoryMetadata( - user_id="nate_test", - session_id="root_session", - status="activated", - type="fact", - key="user: Nate:Oh cool", - confidence=0.9900000095367432, - source=None, - tags=["mode:fast", "lang:en", "role:assistant", "role:user"], - visibility=None, - updated_at="2025-10-16T17:16:30.094877+08:00", - memory_type="LongTermMemory", - sources=[ - SourceMessage( - type="chat", - role="user", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=0, - ), - SourceMessage( - type="chat", - role="assistant", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=1, - ), - SourceMessage( - type="chat", - role="user", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=2, - ), - SourceMessage( - type="chat", - role="assistant", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=3, - ), - SourceMessage( - type="chat", - role="user", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=4, - ), - SourceMessage( - type="chat", - role="assistant", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=5, - ), - ], - embedding=None, - created_at="2025-10-16T17:16:30.094919+08:00", - usage=[], - background="", - ), - ), - TextualMemoryItem( - id="752e42fa-92b6-491a-a430-6864a7730fba", - memory="user: Nate:It was! How about you? Do you have any hobbies you love?\nassistant: Joanna:Yeah! Besides writing, I also enjoy reading, watching movies, and exploring nature. Anything else you enjoy doing, Nate?\nuser: Nate:Playing video games and watching movies are my main hobbies.\nassistant: Joanna:Cool, Nate! So we both have similar interests. What type of movies do you like best?\nuser: Nate:I love action and sci-fi movies, the effects are so cool! What about you, what's your favorite genre?\nassistant: Joanna:I'm all about dramas and romcoms. I love getting immersed in the feelings and plots.\nuser: Nate:Wow, movies can be so powerful! Do you have any recommendations for me?\nassistant: Joanna:Yeah, totally! Have you seen this romantic drama that's all about memory and relationships? It's such a good one.\nuser: Nate:Oh cool! I might check that one out some time soon! I do love watching classics.\nassistant: Joanna:Yep, that movie is awesome. I first watched it around 3 years ago. I even went out and got a physical copy!\n", - metadata=TreeNodeTextualMemoryMetadata( - user_id="nate_test", - session_id="root_session", - status="activated", - type="fact", - key="user: Nate:It was", - confidence=0.9900000095367432, - source=None, - tags=["mode:fast", "lang:en", "role:assistant", "role:user"], - visibility=None, - updated_at="2025-10-16T17:16:30.095726+08:00", - memory_type="LongTermMemory", - sources=[ - SourceMessage( - type="chat", - role="user", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=0, - ), - SourceMessage( - type="chat", - role="assistant", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=1, - ), - SourceMessage( - type="chat", - role="user", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=2, - ), - SourceMessage( - type="chat", - role="assistant", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=3, - ), - SourceMessage( - type="chat", - role="user", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=4, - ), - SourceMessage( - type="chat", - role="assistant", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=5, - ), - SourceMessage( - type="chat", - role="user", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=6, - ), - SourceMessage( - type="chat", - role="assistant", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=7, - ), - SourceMessage( - type="chat", - role="user", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=8, - ), - SourceMessage( - type="chat", - role="assistant", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=9, - ), - ], - embedding=None, - created_at="2025-10-16T17:16:30.095767+08:00", - usage=[], - background="", - ), - ), - TextualMemoryItem( - id="c9cf448c-deee-43a8-bafd-eb15fde535b2", - memory="user: Nate:Hey Joanna! Long time no see! What's up? Anything fun going on?\nassistant: Joanna:Hey Nate! Long time no see! I've been working on a project lately - it's been pretty cool. What about you - any fun projects or hobbies?\nuser: Nate:Hey Joanna! That's cool! I won my first video game tournament last week - so exciting!\nassistant: Joanna:Wow Nate! Congrats on winning! Tell me more - what game was it?\nuser: Nate:Thanks! it's a team shooter game.\nassistant: Joanna:Wow, great job! What was is called?\nuser: Nate:The game was called Counter-Strike: Global Offensive, and me and my team had a blast to the very end!\nassistant: Joanna:Cool, Nate! Sounds like a fun experience, even if I'm not into games.\nuser: Nate:It was! How about you? Do you have any hobbies you love?\nassistant: Joanna:Yeah! Besides writing, I also enjoy reading, watching movies, and exploring nature. Anything else you enjoy doing, Nate?\n", - metadata=TreeNodeTextualMemoryMetadata( - user_id="nate_test", - session_id="root_session", - status="activated", - type="fact", - key="user: Nate:Hey Joanna", - confidence=0.9900000095367432, - source=None, - tags=["mode:fast", "lang:en", "role:assistant", "role:user"], - visibility=None, - updated_at="2025-10-16T17:16:30.098208+08:00", - memory_type="LongTermMemory", - sources=[ - SourceMessage( - type="chat", - role="user", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=0, - ), - SourceMessage( - type="chat", - role="assistant", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=1, - ), - SourceMessage( - type="chat", - role="user", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=2, - ), - SourceMessage( - type="chat", - role="assistant", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=3, - ), - SourceMessage( - type="chat", - role="user", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=4, - ), - SourceMessage( - type="chat", - role="assistant", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=5, - ), - SourceMessage( - type="chat", - role="user", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=6, - ), - SourceMessage( - type="chat", - role="assistant", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=7, - ), - SourceMessage( - type="chat", - role="user", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=8, - ), - SourceMessage( - type="chat", - role="assistant", - chat_time="7:31 pm on 21 January, 2022", - message_id=None, - content=None, - doc_path=None, - index=9, - ), - ], - embedding=None, - created_at="2025-10-16T17:16:30.098246+08:00", - usage=[], - background="", - ), - ), - ] - fine_memories = reader.fine_transfer_simple_mem(fast_mode_memories, type="chat") - print("\n--- Transfer Mode Results (first 3 items) ---") - for i, mem_list in enumerate(fine_memories[:3]): - for j, mem_item in enumerate(mem_list[:2]): # Show first 2 items from each list - print(f"\n[Scene {i}][Item {j}]") - if args.format == "json": - print_textual_memory_item_json(mem_item, indent=2) - else: - print_textual_memory_item( - mem_item, max_memory_length=args.max_memory_length, indent=2 - ) - - # 7. Example of processing documents (only in fine mode) - print("\n=== Processing Documents (Fine Mode Only) ===") - # Example document paths (you should replace these with actual document paths) - doc_paths = [ - "text1.txt", - "text2.txt", - ] - - try: - # 6. Acquiring memories from documents - doc_memory = reader.get_memory( - doc_paths, - "doc", - info={ - "user_id": "1111", - "session_id": "2222", - }, - mode="fine", - ) - total_items = sum(len(mem_list) for mem_list in doc_memory) - print(f"\n📄 Document Memory generated {total_items} items") - - # Print structured document memory items - if doc_memory: - print("\n--- Document Memory Items (first 3) ---") - for i, mem_list in enumerate(doc_memory[:3]): - for j, mem_item in enumerate(mem_list[:3]): # Show first 3 items from each document - print(f"\n[Document {i}][Item {j}]") - if args.format == "json": - print_textual_memory_item_json(mem_item, indent=2) - else: - print_textual_memory_item( - mem_item, max_memory_length=args.max_memory_length, indent=2 - ) - except Exception as e: - print(f"⚠️ Document processing failed: {e}") - print(" (This is expected if document files don't exist)") - - print("\n🎯 Summary:") - print(f" • Fast mode: {fast_time:.2f}s - Quick processing, no LLM calls") - print(f" • Fine mode: {fine_time:.2f}s - Full LLM processing for better understanding") - print(" • Use fast mode for: Real-time applications, high-throughput scenarios") - print(" • Use fine mode for: Quality analysis, detailed memory extraction") - - -if __name__ == "__main__": - main() diff --git a/examples/mem_reader/utils.py b/examples/mem_reader/utils.py new file mode 100644 index 000000000..0ac3e4d6a --- /dev/null +++ b/examples/mem_reader/utils.py @@ -0,0 +1,84 @@ +"""Utility functions for MemReader examples.""" + +import json +import pprint + +from typing import Any + +from memos.memories.textual.item import TextualMemoryItem + + +def _truncate(s: str, max_len: int | None) -> str: + if max_len is None or len(s) <= max_len: + return s + return s[:max_len] + "..." + + +def sanitize_for_print(obj: Any, *, max_str_len: int | None = 500) -> Any: + """ + Recursively sanitize data for pretty printing: + - Long strings are truncated + - Strings keep real newlines (so box printer can render multi-line) + """ + if isinstance(obj, str): + return _truncate(obj, max_str_len) + if isinstance(obj, dict): + return {k: sanitize_for_print(v, max_str_len=max_str_len) for k, v in obj.items()} + if isinstance(obj, list): + return [sanitize_for_print(v, max_str_len=max_str_len) for v in obj] + if isinstance(obj, tuple): + return tuple(sanitize_for_print(v, max_str_len=max_str_len) for v in obj) + return obj + + +def pretty_print_dict(d: dict, *, max_str_len: int | None = 500): + """Print a dictionary in a pretty bordered box (handles multiline strings).""" + d2 = sanitize_for_print(d, max_str_len=max_str_len) + + # Prefer JSON formatting if possible, fallback to pprint + try: + text = json.dumps(d2, indent=2, ensure_ascii=False) + except (TypeError, ValueError): + text = pprint.pformat(d2, indent=2, width=120) + + # Expand the JSON/pprint output into lines + lines: list[str] = [] + for line in text.splitlines(): + # If a line itself contains literal "\n" sequences (rare), leave it; + # real newlines are already split by splitlines(). + lines.append(line) + + # Prevent extremely wide boxes (optional safety) + max_len = max(len(line) for line in lines) if lines else 0 + border = "═" * (max_len + 4) + + print(f"╔{border}╗") + for line in lines: + print(f"║ {line.ljust(max_len)} ║") + print(f"╚{border}╝") + + +def print_memory_item( + item: TextualMemoryItem, + indent: int = 0, + max_memory_length: int | None = 300, # None = 不截断 +): + """Print a TextualMemoryItem in a structured format.""" + prefix = " " * indent + print(f"{prefix}--- Memory Item ---") + print(f"{prefix}Type: {item.metadata.memory_type}") + + mem = item.memory or "" + mem_preview = mem if max_memory_length is None else _truncate(mem, max_memory_length) + print(f"{prefix}Memory: {mem_preview}") + + if item.metadata.tags: + print(f"{prefix}Tags: {item.metadata.tags}") + + if item.metadata.confidence is not None: + print(f"{prefix}Confidence: {item.metadata.confidence}") + + if hasattr(item.metadata, "sources") and item.metadata.sources: + print(f"{prefix}Sources ({len(item.metadata.sources)}):") + for source in item.metadata.sources: + print(f"{prefix} - {source.type} (role: {getattr(source, 'role', 'N/A')})") From 1844b962a7a7edb9ac0f2eefe655ae2d2e0349c2 Mon Sep 17 00:00:00 2001 From: HanshuZhou <118414084+zhouhanshu@users.noreply.github.com> Date: Fri, 16 Jan 2026 16:53:16 +0800 Subject: [PATCH 39/53] update example of mem_chat (#892) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 周函数 --- ...t_w_generated_cube_explicit_memory_only.py | 231 ++++++++++-------- examples/mem_chat/simple_mem_chat.py | 33 --- 2 files changed, 126 insertions(+), 138 deletions(-) delete mode 100644 examples/mem_chat/simple_mem_chat.py diff --git a/examples/mem_chat/chat_w_generated_cube_explicit_memory_only.py b/examples/mem_chat/chat_w_generated_cube_explicit_memory_only.py index a1cce6e8a..2c72fd192 100644 --- a/examples/mem_chat/chat_w_generated_cube_explicit_memory_only.py +++ b/examples/mem_chat/chat_w_generated_cube_explicit_memory_only.py @@ -1,127 +1,148 @@ +import os +import sys + + +# Add project root to python path to ensure src modules can be imported +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "../../../src"))) + from memos.configs.mem_chat import MemChatConfigFactory from memos.configs.mem_cube import GeneralMemCubeConfig from memos.mem_chat.factory import MemChatFactory from memos.mem_cube.general import GeneralMemCube -mem_chat_config = MemChatConfigFactory.model_validate( - { - "backend": "simple", - "config": { - "user_id": "user_123", - "chat_llm": { - "backend": "ollama", - "config": { - "model_name_or_path": "qwen3:1.7b", - "temperature": 0.0, - "remove_think_prefix": True, - "max_tokens": 4096, - }, - }, - "max_turns_window": 20, - "top_k": 5, - "enable_textual_memory": True, - "enable_activation_memory": False, - "enable_parametric_memory": False, - }, - } -) -mem_chat = MemChatFactory.from_config(mem_chat_config) - -# Initialize_memory_cube -config = GeneralMemCubeConfig.model_validate( - { - "user_id": "user03alice", - "cube_id": "user03alice/mem_cube_tree", - "text_mem": { - "backend": "tree_text", - "config": { - "extractor_llm": { - "backend": "ollama", - "config": { - "model_name_or_path": "qwen3:1.7b", - "temperature": 0.0, - "remove_think_prefix": True, - "max_tokens": 8192, - }, - }, - "dispatcher_llm": { - "backend": "ollama", - "config": { - "model_name_or_path": "qwen3:1.7b", - "temperature": 0.0, - "remove_think_prefix": True, - "max_tokens": 8192, - }, - }, - "graph_db": { - "backend": "neo4j", - "config": { - "uri": "bolt://localhost:7687", - "user": "neo4j", - "password": "12345678", - "db_name": "user03alice_mem_cube_3", - "auto_create": True, - }, - }, - "embedder": { - "backend": "ollama", - "config": { - "model_name_or_path": "nomic-embed-text:latest", - }, - }, - }, - }, - "act_mem": { - "backend": "kv_cache", +def get_mem_chat_config() -> MemChatConfigFactory: + """ + Generates the configuration object for MemChat. + + MemChat is the top-level component for user interaction, responsible for managing the conversation flow, + invoking the LLM, and interacting with the memory module. + The configuration includes: + - user_id: User identifier + - chat_llm: LLM configuration used for chat (uses OpenAI compatible interface here) + - max_turns_window: Size of the conversation history window + - enable_textual_memory: Whether to enable textual memory (Explicit Memory) + """ + return MemChatConfigFactory.model_validate( + { + "backend": "simple", "config": { - "memory_filename": "activation_memory.pickle", - "extractor_llm": { - "backend": "huggingface", + "user_id": "user_123", + "chat_llm": { + "backend": "openai", "config": { - "model_name_or_path": "Qwen/Qwen3-1.7B", + # Prioritize getting sensitive information and model configuration from environment variables + "model_name_or_path": os.getenv("MOS_CHAT_MODEL", "gpt-4o"), "temperature": 0.8, "max_tokens": 1024, "top_p": 0.9, "top_k": 50, - "add_generation_prompt": True, - "remove_think_prefix": False, + "api_key": os.getenv("OPENAI_API_KEY"), + "api_base": os.getenv("OPENAI_API_BASE"), }, }, + "max_turns_window": 20, + "top_k": 5, + # Enable textual memory functionality, allowing the system to retrieve and store explicit memories + "enable_textual_memory": True, + # This example demonstrates only explicit memory, so activation memory and parametric memory are disabled + "enable_activation_memory": False, + "enable_parametric_memory": False, }, - }, - "para_mem": { - "backend": "lora", - "config": { - "memory_filename": "parametric_memory.adapter", - "extractor_llm": { - "backend": "huggingface", - "config": { - "model_name_or_path": "Qwen/Qwen3-1.7B", - "temperature": 0.8, - "max_tokens": 1024, - "top_p": 0.9, - "top_k": 50, - "add_generation_prompt": True, - "remove_think_prefix": False, + } + ) + + +def get_mem_cube_config() -> GeneralMemCubeConfig: + """ + Generates the configuration object for GeneralMemCube. + + MemCube (Memory Cube) is the core storage and management unit for memory. + GeneralMemCube is a general implementation of the memory cube, supporting extraction, vectorized storage, and retrieval of textual memory. + The configuration includes: + - user_id / cube_id: Identifiers for the user and the cube to which the memory belongs + - text_mem: Specific configuration for textual memory + - extractor_llm: LLM used to extract memory fragments from the conversation + - vector_db: Database used to store memory vectors (uses Qdrant here) + - embedder: Model used to generate text vectors (uses OpenAI compatible interface here) + """ + return GeneralMemCubeConfig.model_validate( + { + "user_id": "user03alice", + "cube_id": "user03alice/mem_cube_tree", + "text_mem": { + "backend": "general_text", + "config": { + "cube_id": "user03alice/mem_cube_general", + "memory_filename": "textual_memory.json", + "extractor_llm": { + "backend": "openai", + "config": { + "model_name_or_path": os.getenv("MOS_CHAT_MODEL", "gpt-4o"), + "temperature": 0.8, + "max_tokens": 1024, + "top_p": 0.9, + "top_k": 50, + "api_key": os.getenv("OPENAI_API_KEY"), + "api_base": os.getenv("OPENAI_API_BASE"), + }, + }, + "vector_db": { + "backend": "qdrant", + "config": { + "collection_name": "user03alice_mem_cube_general", + "vector_dimension": 1024, + "distance_metric": "cosine", + }, + }, + "embedder": { + "backend": os.getenv("MOS_EMBEDDER_BACKEND", "universal_api"), + "config": { + "provider": "openai", + "api_key": os.getenv("MOS_EMBEDDER_API_KEY", "EMPTY"), + "model_name_or_path": os.getenv("MOS_EMBEDDER_MODEL", "bge-m3"), + "base_url": os.getenv("MOS_EMBEDDER_API_BASE"), + }, }, }, }, - }, - }, -) + } + ) + + +def main(): + """ + Main program entry point: + 1. Initialize MemChat (Conversation Controller) + 2. Initialize MemCube (Memory Storage) + 3. Mount MemCube to MemChat + 4. Start the chat loop + 5. Save memory after the chat ends + """ + print("Initializing MemChat...") + mem_chat_config = get_mem_chat_config() + mem_chat = MemChatFactory.from_config(mem_chat_config) + + print("Initializing MemCube...") + mem_cube_config = get_mem_cube_config() + mem_cube = GeneralMemCube(mem_cube_config) -# Initialize the MemCube with the configuration -mem_cube = GeneralMemCube(config) + # Mount the initialized memory cube onto the chat system + # This allows MemChat to perform memory retrieval (search) and organization (organize) via mem_cube during the conversation + mem_chat.mem_cube = mem_cube -# TODO: Read memory and prepare data -# Hope to read user docs and save in a file + print("Starting Chat Session...") + try: + mem_chat.run() + except KeyboardInterrupt: + print("\nChat session interrupted.") + finally: + # Ensure memory is persisted to disk before the program exits + # The dump method saves the in-memory memory state to the specified path + print("Saving memory cube...") + mem_chat.mem_cube.dump("new_cube_path") + print("Memory cube saved to 'new_cube_path'.") -# TODO: Organize MemoryCube -# Call Tree.add() -# save in memory cube -# chat and search and organize -mem_chat.mem_cube = mem_cube -mem_chat.run() -mem_chat.mem_cube.dump("new_cube_path") +if __name__ == "__main__": + main() diff --git a/examples/mem_chat/simple_mem_chat.py b/examples/mem_chat/simple_mem_chat.py deleted file mode 100644 index a6b4f5cbe..000000000 --- a/examples/mem_chat/simple_mem_chat.py +++ /dev/null @@ -1,33 +0,0 @@ -from memos.configs.mem_chat import MemChatConfigFactory -from memos.mem_chat.factory import MemChatFactory -from memos.mem_cube.general import GeneralMemCube - - -config = MemChatConfigFactory.model_validate( - { - "backend": "simple", - "config": { - "user_id": "user_123", - "chat_llm": { - "backend": "huggingface", - "config": { - "model_name_or_path": "Qwen/Qwen3-1.7B", - "temperature": 0.1, - "remove_think_prefix": True, - "max_tokens": 4096, - }, - }, - "max_turns_window": 20, - "top_k": 5, - "enable_textual_memory": True, - "enable_activation_memory": False, - "enable_parametric_memory": False, - }, - } -) -mem_chat = MemChatFactory.from_config(config) -mem_chat.mem_cube = GeneralMemCube.init_from_dir("examples/data/mem_cube_2") - -mem_chat.run() - -mem_chat.mem_cube.dump("tmp/mem_cube") From b12e41b7619cb8baf25c7149a62e75f3ea2d4b06 Mon Sep 17 00:00:00 2001 From: Wenqiang Wei Date: Sun, 18 Jan 2026 16:12:18 +0800 Subject: [PATCH 40/53] fix: example config bug --- examples/data/config/tree_config_shared_database.json | 2 +- src/memos/llms/hf.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/data/config/tree_config_shared_database.json b/examples/data/config/tree_config_shared_database.json index a0a9bc3a3..6dd1a9220 100644 --- a/examples/data/config/tree_config_shared_database.json +++ b/examples/data/config/tree_config_shared_database.json @@ -58,6 +58,6 @@ "WorkingMemory": 200, "LongTermMemory": 20000, "UserMemory": 30000 - } + }, "memory_filename": "tree_textual_memories.json" } diff --git a/src/memos/llms/hf.py b/src/memos/llms/hf.py index b5fc4ba13..0dd841c1a 100644 --- a/src/memos/llms/hf.py +++ b/src/memos/llms/hf.py @@ -51,7 +51,7 @@ def __init__(self, config: HFLLMConfig): self.config.model_name_or_path, torch_dtype="auto", device_map="auto" ) self.tokenizer = AutoTokenizer.from_pretrained( - self.config.model_name_or_path, use_fast=True + self.config.model_name_or_path, use_fast=True, force_download=True ) # Logits processors for sampling From 48e11da21ad0abc32d3ccc60d0187feb52e12768 Mon Sep 17 00:00:00 2001 From: bittergreen Date: Sun, 18 Jan 2026 19:15:06 +0800 Subject: [PATCH 41/53] docs: Delete deprecated examples. --- examples/basic_modules/nebular_example.py | 361 ------------------ examples/basic_modules/parser.py | 15 - .../tree_textual_memory_reasoner.py | 167 -------- 3 files changed, 543 deletions(-) delete mode 100644 examples/basic_modules/nebular_example.py delete mode 100644 examples/basic_modules/parser.py delete mode 100644 examples/basic_modules/tree_textual_memory_reasoner.py diff --git a/examples/basic_modules/nebular_example.py b/examples/basic_modules/nebular_example.py deleted file mode 100644 index 13f88e3f3..000000000 --- a/examples/basic_modules/nebular_example.py +++ /dev/null @@ -1,361 +0,0 @@ -import json -import os - -from datetime import datetime, timezone - -import numpy as np - -from dotenv import load_dotenv - -from memos.configs.embedder import EmbedderConfigFactory -from memos.configs.graph_db import GraphDBConfigFactory -from memos.embedders.factory import EmbedderFactory -from memos.graph_dbs.factory import GraphStoreFactory -from memos.memories.textual.item import TextualMemoryItem, TreeNodeTextualMemoryMetadata - - -load_dotenv() - - -def show(nebular_data): - from memos.configs.graph_db import Neo4jGraphDBConfig - from memos.graph_dbs.neo4j import Neo4jGraphDB - - tree_config = Neo4jGraphDBConfig.from_json_file("../../examples/data/config/neo4j_config.json") - tree_config.use_multi_db = True - tree_config.db_name = "nebular-show2" - - neo4j_db = Neo4jGraphDB(tree_config) - neo4j_db.clear() - neo4j_db.import_graph(nebular_data) - - -embedder_config = EmbedderConfigFactory.model_validate( - { - "backend": "universal_api", - "config": { - "provider": "openai", - "api_key": os.getenv("OPENAI_API_KEY", "sk-xxxxx"), - "model_name_or_path": "text-embedding-3-large", - "base_url": os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1"), - }, - } -) -embedder = EmbedderFactory.from_config(embedder_config) -embedder_dimension = 3072 - - -def embed_memory_item(memory: str) -> list[float]: - embedding = embedder.embed([memory])[0] - embedding_np = np.array(embedding, dtype=np.float32) - embedding_list = embedding_np.tolist() - return embedding_list - - -def example_shared_db(db_name: str = "shared-traval-group"): - """ - Example: Single(Shared)-DB multi-tenant (logical isolation) - Multiple users' data in the same Neo4j DB with user_name as a tag. - """ - # users - user_list = ["travel_member_alice", "travel_member_bob"] - - for user_name in user_list: - # Step 1: Build factory config - config = GraphDBConfigFactory( - backend="nebular", - config={ - "uri": json.loads(os.getenv("NEBULAR_HOSTS", "localhost")), - "user": os.getenv("NEBULAR_USER", "root"), - "password": os.getenv("NEBULAR_PASSWORD", "xxxxxx"), - "space": db_name, - "user_name": user_name, - "use_multi_db": False, - "auto_create": True, - "embedding_dimension": embedder_dimension, - }, - ) - - # Step 2: Instantiate graph store - graph = GraphStoreFactory.from_config(config) - print(f"\n[INFO] Working in shared DB: {db_name}, for user: {user_name}") - graph.clear() - - # Step 3: Create topic node - topic = TextualMemoryItem( - memory="This research addresses long-term multi-UAV navigation for energy-efficient communication coverage.", - metadata=TreeNodeTextualMemoryMetadata( - memory_type="LongTermMemory", - key="Multi-UAV Long-Term Coverage", - hierarchy_level="topic", - type="fact", - memory_time="2024-01-01", - source="file", - sources=["paper://multi-uav-coverage/intro"], - status="activated", - confidence=95.0, - tags=["UAV", "coverage", "multi-agent"], - entities=["UAV", "coverage", "navigation"], - visibility="public", - updated_at=datetime.now().isoformat(), - embedding=embed_memory_item( - "This research addresses long-term " - "multi-UAV navigation for " - "energy-efficient communication " - "coverage." - ), - ), - ) - - graph.add_node( - id=topic.id, memory=topic.memory, metadata=topic.metadata.model_dump(exclude_none=True) - ) - - # Step 4: Add a concept for each user - concept = TextualMemoryItem( - memory=f"Itinerary plan for {user_name}", - metadata=TreeNodeTextualMemoryMetadata( - memory_type="LongTermMemory", - key="Multi-UAV Long-Term Coverage", - hierarchy_level="concept", - type="fact", - memory_time="2024-01-01", - source="file", - sources=["paper://multi-uav-coverage/intro"], - status="activated", - confidence=95.0, - tags=["UAV", "coverage", "multi-agent"], - entities=["UAV", "coverage", "navigation"], - visibility="public", - updated_at=datetime.now().isoformat(), - embedding=embed_memory_item(f"Itinerary plan for {user_name}"), - ), - ) - - graph.add_node( - id=concept.id, - memory=concept.memory, - metadata=concept.metadata.model_dump(exclude_none=True), - ) - - # Link concept to topic - graph.add_edge(source_id=concept.id, target_id=topic.id, type="RELATE_TO") - print(f"[INFO] Added nodes for {user_name}") - - # Step 5: Query and print ALL for verification - print("\n=== Export entire DB (for verification, includes ALL users) ===") - graph = GraphStoreFactory.from_config(config) - all_graph_data = graph.export_graph() - print(str(all_graph_data)[:1000]) - - # Step 6: Search for alice's data only - print("\n=== Search for travel_member_alice ===") - config_alice = GraphDBConfigFactory( - backend="nebular", - config={ - "uri": json.loads(os.getenv("NEBULAR_HOSTS", "localhost")), - "user": os.getenv("NEBULAR_USER", "root"), - "password": os.getenv("NEBULAR_PASSWORD", "xxxxxx"), - "space": db_name, - "user_name": user_list[0], - "auto_create": True, - "embedding_dimension": embedder_dimension, - "use_multi_db": False, - }, - ) - graph_alice = GraphStoreFactory.from_config(config_alice) - nodes = graph_alice.search_by_embedding(vector=embed_memory_item("travel itinerary"), top_k=3) - for node in nodes: - print(str(graph_alice.get_node(node["id"]))[:1000]) - - -def run_user_session( - user_name: str, - db_name: str, - topic_text: str, - concept_texts: list[str], - fact_texts: list[str], -): - print(f"\n=== {user_name} starts building their memory graph ===") - - # Manually initialize correct GraphDB class - config = GraphDBConfigFactory( - backend="nebular", - config={ - "uri": json.loads(os.getenv("NEBULAR_HOSTS", "localhost")), - "user": os.getenv("NEBULAR_USER", "root"), - "password": os.getenv("NEBULAR_PASSWORD", "xxxxxx"), - "space": db_name, - "user_name": user_name, - "use_multi_db": False, - "auto_create": True, - "embedding_dimension": embedder_dimension, - }, - ) - graph = GraphStoreFactory.from_config(config) - - # Start with a clean slate for this user - graph.clear() - - now = datetime.now(timezone.utc).isoformat() - - # === Step 1: Create a root topic node (e.g., user's research focus) === - topic = TextualMemoryItem( - memory=topic_text, - metadata=TreeNodeTextualMemoryMetadata( - memory_type="LongTermMemory", - key="Research Topic", - hierarchy_level="topic", - type="fact", - memory_time="2024-01-01", - status="activated", - visibility="public", - tags=["research", "rl"], - updated_at=now, - embedding=embed_memory_item(topic_text), - ), - ) - graph.add_node(topic.id, topic.memory, topic.metadata.model_dump(exclude_none=True)) - - # === Step 2: Create two concept nodes linked to the topic === - concept_items = [] - for i, text in enumerate(concept_texts): - concept = TextualMemoryItem( - memory=text, - metadata=TreeNodeTextualMemoryMetadata( - memory_type="LongTermMemory", - key=f"Concept {i + 1}", - hierarchy_level="concept", - type="fact", - memory_time="2024-01-01", - status="activated", - visibility="public", - updated_at=now, - embedding=embed_memory_item(text), - tags=["concept"], - confidence=90 + i, - ), - ) - graph.add_node(concept.id, concept.memory, concept.metadata.model_dump(exclude_none=True)) - graph.add_edge(topic.id, concept.id, type="PARENT") - concept_items.append(concept) - - # === Step 3: Create supporting facts under each concept === - for i, text in enumerate(fact_texts): - fact = TextualMemoryItem( - memory=text, - metadata=TreeNodeTextualMemoryMetadata( - memory_type="WorkingMemory", - key=f"Fact {i + 1}", - hierarchy_level="fact", - type="fact", - memory_time="2024-01-01", - status="activated", - visibility="public", - updated_at=now, - embedding=embed_memory_item(text), - confidence=85.0, - tags=["fact"], - ), - ) - graph.add_node(fact.id, fact.memory, fact.metadata.model_dump(exclude_none=True)) - graph.add_edge(concept_items[i % len(concept_items)].id, fact.id, type="PARENT") - - # === Step 4: Retrieve memory using semantic search === - vector = embed_memory_item("How is memory retrieved?") - search_result = graph.search_by_embedding(vector, top_k=2) - for r in search_result: - node = graph.get_node(r["id"]) - print("🔍 Search result:", node["memory"]) - - # === Step 5: Tag-based neighborhood discovery === - neighbors = graph.get_neighbors_by_tag(["concept"], exclude_ids=[], top_k=2) - print("📎 Tag-related nodes:", [neighbor["memory"] for neighbor in neighbors]) - - # === Step 6: Retrieve children (facts) of first concept === - children = graph.get_children_with_embeddings(concept_items[0].id) - print("📍 Children of concept:", [child["memory"] for child in children]) - - # === Step 7: Export a local subgraph and grouped statistics === - subgraph = graph.get_subgraph(topic.id, depth=2) - print("📌 Subgraph node count:", len(subgraph["neighbors"])) - - stats = graph.get_grouped_counts(["memory_type", "status"]) - print("📊 Grouped counts:", stats) - - # === Step 8: Demonstrate updates and cleanup === - graph.update_node( - concept_items[0].id, {"confidence": 99.0, "created_at": "2025-07-24T20:11:56.375687"} - ) - graph.remove_oldest_memory("WorkingMemory", keep_latest=1) - graph.delete_edge(topic.id, concept_items[0].id, type="PARENT") - graph.delete_node(concept_items[1].id) - - # === Step 9: Export and re-import the entire graph structure === - exported = graph.export_graph() - graph.import_graph(exported) - print("📦 Graph exported and re-imported, total nodes:", len(exported["nodes"])) - - # ==================================== - # 🔍 Step 10: extra function - # ==================================== - print(f"\n=== 🔍 Extra Tests for user: {user_name} ===") - - print(" - Memory count:", graph.get_memory_count("LongTermMemory")) - print(" - Node count:", graph.count_nodes("LongTermMemory")) - print(" - All LongTermMemory items:", graph.get_all_memory_items("LongTermMemory")) - - if len(exported["edges"]) > 0: - n1, n2 = exported["edges"][0]["source"], exported["edges"][0]["target"] - print(" - Edge exists?", graph.edge_exists(n1, n2, exported["edges"][0]["type"])) - print(" - Edges for node:", graph.get_edges(n1)) - - filters = [{"field": "memory_type", "op": "=", "value": "LongTermMemory"}] - print(" - Metadata query result:", graph.get_by_metadata(filters)) - print( - " - Optimization candidates:", graph.get_structure_optimization_candidates("LongTermMemory") - ) - try: - graph.drop_database() - except ValueError as e: - print(" - drop_database raised ValueError as expected:", e) - - -def example_complex_shared_db(db_name: str = "shared-traval-group-complex"): - # User 1: Alice explores structured memory for LLMs - run_user_session( - user_name="alice", - db_name=db_name, - topic_text="Alice studies structured memory and long-term memory optimization in LLMs.", - concept_texts=[ - "Short-term memory can be simulated using WorkingMemory blocks.", - "A structured memory graph improves retrieval precision for agents.", - ], - fact_texts=[ - "Embedding search is used to find semantically similar memory items.", - "User memories are stored as node-edge structures that support hierarchical reasoning.", - ], - ) - - # User 2: Bob focuses on GNN-based reasoning - run_user_session( - user_name="bob", - db_name=db_name, - topic_text="Bob investigates how graph neural networks can support knowledge reasoning.", - concept_texts=[ - "GNNs can learn high-order relations among entities.", - "Attention mechanisms in graphs improve inference precision.", - ], - fact_texts=[ - "GAT outperforms GCN in graph classification tasks.", - "Multi-hop reasoning helps answer complex queries.", - ], - ) - - -if __name__ == "__main__": - print("\n=== Example: Single-DB ===") - example_shared_db(db_name="shared_traval_group-new") - - print("\n=== Example: Single-DB-Complex ===") - example_complex_shared_db(db_name="shared-traval-group-complex-new2") diff --git a/examples/basic_modules/parser.py b/examples/basic_modules/parser.py deleted file mode 100644 index c063964b7..000000000 --- a/examples/basic_modules/parser.py +++ /dev/null @@ -1,15 +0,0 @@ -from memos.configs.parser import ParserConfigFactory -from memos.parsers.factory import ParserFactory - - -config = ParserConfigFactory.model_validate( - { - "backend": "markitdown", - "config": {}, - } -) -parser = ParserFactory.from_config(config) -file_path = "README.md" -markdown_text = parser.parse(file_path) -print("Markdown text:\n", markdown_text) -print("==" * 20) diff --git a/examples/basic_modules/tree_textual_memory_reasoner.py b/examples/basic_modules/tree_textual_memory_reasoner.py deleted file mode 100644 index 369787458..000000000 --- a/examples/basic_modules/tree_textual_memory_reasoner.py +++ /dev/null @@ -1,167 +0,0 @@ -from memos import log -from memos.configs.embedder import EmbedderConfigFactory -from memos.configs.graph_db import GraphDBConfigFactory -from memos.configs.llm import LLMConfigFactory -from memos.embedders.factory import EmbedderFactory -from memos.graph_dbs.factory import GraphStoreFactory -from memos.llms.factory import LLMFactory -from memos.memories.textual.item import TextualMemoryItem, TreeNodeTextualMemoryMetadata -from memos.memories.textual.tree_text_memory.retrieve.reasoner import MemoryReasoner -from memos.memories.textual.tree_text_memory.retrieve.retrieval_mid_structs import ParsedTaskGoal - - -logger = log.get_logger(__name__) - -embedder_config = EmbedderConfigFactory.model_validate( - { - "backend": "ollama", - "config": { - "model_name_or_path": "nomic-embed-text:latest", - }, - } -) -embedder = EmbedderFactory.from_config(embedder_config) - -# Step 1: Load LLM config and instantiate -config = LLMConfigFactory.model_validate( - { - "backend": "ollama", - "config": { - "model_name_or_path": "qwen3:0.6b", - "temperature": 0.7, - "max_tokens": 1024, - }, - } -) -llm = LLMFactory.from_config(config) - -# Step 1: Prepare a mock ParsedTaskGoal -parsed_goal = ParsedTaskGoal( - memories=[ - "Multi-UAV Long-Term Coverage", - "Coverage Metrics", - "Reward Function Design", - "Energy Model", - "CT and FT Definition", - "Reward Components", - "Energy Cost Components", - ], - keys=["UAV", "coverage", "energy", "reward"], - tags=[], - goal_type="explanation", -) - -query = "How can multiple UAVs coordinate to maximize coverage while saving energy?" -query_embedding = embedder.embed([query])[0] - - -# Step 2: Initialize graph store -graph_config = GraphDBConfigFactory( - backend="neo4j", - config={ - "uri": "bolt://localhost:7687", - "user": "neo4j", - "password": "12345678", - "db_name": "user06alice", - "auto_create": True, - }, -) -graph_store = GraphStoreFactory.from_config(graph_config) - -ranked_memories = [ - TextualMemoryItem( - id="a88db9ce-3c77-4e83-8d61-aa9ef95c957e", - memory="Coverage performance is measured using CT (Coverage Time) and FT (Fairness Time) metrics.", - metadata=TreeNodeTextualMemoryMetadata( - user_id=None, - session_id=None, - status="activated", - type="fact", - memory_time="2024-01-01", - source="file", - confidence=91.0, - entities=["CT", "FT"], - tags=["coverage", "fairness", "metrics"], - visibility="public", - updated_at="2025-06-11T11:51:24.438001", - memory_type="LongTermMemory", - key="Coverage Metrics", - value="CT and FT used for long-term area and fairness evaluation", - hierarchy_level="concept", - sources=["paper://multi-uav-coverage/metrics"], - embedding=[0.01] * 768, - ), - ), - TextualMemoryItem( - id="c34f5e6b-2d34-4e6f-8c9b-abcdef123456", - memory="The capital of France is Paris, which is known for the Eiffel Tower.", - metadata=TreeNodeTextualMemoryMetadata( - user_id=None, - session_id=None, - status="activated", - type="fact", - memory_time="2024-01-01", - source="file", - confidence=90.0, - entities=["France", "Paris", "Eiffel Tower"], - tags=["geography", "city", "landmark"], - visibility="public", - updated_at="2025-06-11T11:51:24.438001", - memory_type="LongTermMemory", - key="Geography Fact", - value="Paris is the capital of France", - hierarchy_level="concept", - sources=["wikipedia://paris"], - embedding=[0.03] * 768, - ), - ), - TextualMemoryItem( - id="d56a7b8c-3e45-4f7a-9dab-fedcba654321", - memory="Total energy cost is calculated from both mechanical movement and communication transmission.", - metadata=TreeNodeTextualMemoryMetadata( - user_id=None, - session_id=None, - status="activated", - type="fact", - memory_time="2024-01-01", - source="file", - confidence=89.0, - entities=["movement power", "transmission power"], - tags=["energy", "movement", "transmission"], - visibility="public", - updated_at="2025-06-11T11:51:24.438001", - memory_type="LongTermMemory", - key="Energy Cost Components", - value="Includes movement and communication energy", - hierarchy_level="fact", - sources=["paper://multi-uav-coverage/energy-detail"], - embedding=[0.04] * 768, - ), - ), -] - -# Step 7: Init memory retriever -reasoner = MemoryReasoner(llm=llm) - - -# Step 8: Print retrieved memory items before ranking -print("\n=== Retrieved Memory Items (Before Rerank) ===") -for idx, item in enumerate(ranked_memories): - print(f"[Original #{idx + 1}] ID: {item.id}") - print(f"Memory: {item.memory[:200]}...\n") - -# Step 9: Rerank -reasoned_memories = reasoner.reason( - query=query, - ranked_memories=ranked_memories, - parsed_goal=parsed_goal, -) - -# Step 10: Print ranked reasoned memory items with original positions -print("\n=== Memory Items After Reason (Sorted) ===") -id_to_original_rank = {item.id: i + 1 for i, item in enumerate(ranked_memories)} - -for idx, item in enumerate(reasoned_memories): - original_rank = id_to_original_rank.get(item.id, "-") - print(f"[Reasoned #{idx + 1}] ID: {item.id} (Original #{original_rank})") - print(f"Memory: {item.memory[:200]}...\n") From 84ca7a545162221bb6b3f63c358ea34134446519 Mon Sep 17 00:00:00 2001 From: bittergreen Date: Sun, 18 Jan 2026 19:19:52 +0800 Subject: [PATCH 42/53] docs: Adding clear instructions as comments for examples in basic_modules. --- examples/basic_modules/embedder.py | 14 +++++++++++++- examples/basic_modules/llm.py | 8 ++++++++ examples/basic_modules/reranker.py | 17 +++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/examples/basic_modules/embedder.py b/examples/basic_modules/embedder.py index 7cc7942da..d35dc1797 100644 --- a/examples/basic_modules/embedder.py +++ b/examples/basic_modules/embedder.py @@ -3,7 +3,10 @@ # Scenario 1: Using EmbedderFactory - +# Prerequisites: +# 1. Install Ollama: https://ollama.com/ +# 2. Start Ollama server: `ollama serve` +# 3. Pull the model: `ollama pull nomic-embed-text` config = EmbedderConfigFactory.model_validate( { "backend": "ollama", @@ -33,6 +36,9 @@ # Scenario 3: Using SenTranEmbedder +# Prerequisites: +# 1. Ensure `einops` is installed: `pip install einops` (Required for some HF models like nomic-bert) +# 2. The model `nomic-ai/nomic-embed-text-v1.5` will be downloaded automatically from HuggingFace. config_hf = EmbedderConfigFactory.model_validate( { @@ -49,6 +55,9 @@ print("==" * 20) # === Scenario 4: Using UniversalAPIEmbedder(OpenAI) === +# Prerequisites: +# 1. Set a valid OPENAI_API_KEY +# 2. Ensure the base_url is reachable config_api = EmbedderConfigFactory.model_validate( { @@ -68,6 +77,9 @@ print("Embedding preview:", embedding_api[0][:10]) # === Scenario 5: Using UniversalAPIEmbedder(Azure) === +# Prerequisites: +# 1. Set a valid AZURE_API_KEY +# 2. Ensure the base_url is reachable config_api = EmbedderConfigFactory.model_validate( { diff --git a/examples/basic_modules/llm.py b/examples/basic_modules/llm.py index d33fc9544..fb157c991 100644 --- a/examples/basic_modules/llm.py +++ b/examples/basic_modules/llm.py @@ -5,6 +5,10 @@ # Scenario 1: Using LLMFactory with Ollama Backend # This is the most recommended way! 🌟 +# Prerequisites: +# 1. Install Ollama: https://ollama.com/ +# 2. Start Ollama server: `ollama serve` +# 3. Need python ollama package(>=0.5.0,<0.6.0) config = LLMConfigFactory.model_validate( { @@ -46,6 +50,10 @@ # Scenario 3: Using LLMFactory with OpenAI Backend +# Prerequisites: +# 1. You need a valid OpenAI API key to run this scenario. +# 2. Replace 'sk-xxxx' with your actual API key below. + config = LLMConfigFactory.model_validate( { diff --git a/examples/basic_modules/reranker.py b/examples/basic_modules/reranker.py index 47bf1405c..e5a869789 100644 --- a/examples/basic_modules/reranker.py +++ b/examples/basic_modules/reranker.py @@ -50,6 +50,7 @@ def show_ranked(title: str, ranked: list[tuple[TextualMemoryItem, float]], top_n def main(): # ------------------------------- # 1) Build the embedder (real vectors) + # You may need to set valid OPENAI_API_KEY and OPENAI_API_BASE in your environment variables. # ------------------------------- embedder_cfg = EmbedderConfigFactory.model_validate( { @@ -62,6 +63,22 @@ def main(): }, } ) + """ + # ------------------------------- + # Optional: Build the embedder (using local sentence-transformers) + # ------------------------------- + # Use a local model so no API key is required. + embedder_cfg = EmbedderConfigFactory.model_validate( + { + "backend": "sentence_transformer", + "config": { + "model_name_or_path": "nomic-ai/nomic-embed-text-v1.5", + "trust_remote_code": True, + }, + } + ) + """ + embedder = EmbedderFactory.from_config(embedder_cfg) # ------------------------------- From 31cd681a7d94a003a63e3037dfe2ab0b3362d8ab Mon Sep 17 00:00:00 2001 From: bittergreen Date: Sun, 18 Jan 2026 19:22:00 +0800 Subject: [PATCH 43/53] fix: fixing bugs relevant to examples in basic_module. --- examples/data/config/tree_config_shared_database.json | 2 +- src/memos/graph_dbs/neo4j.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/data/config/tree_config_shared_database.json b/examples/data/config/tree_config_shared_database.json index a0a9bc3a3..6dd1a9220 100644 --- a/examples/data/config/tree_config_shared_database.json +++ b/examples/data/config/tree_config_shared_database.json @@ -58,6 +58,6 @@ "WorkingMemory": 200, "LongTermMemory": 20000, "UserMemory": 30000 - } + }, "memory_filename": "tree_textual_memories.json" } diff --git a/src/memos/graph_dbs/neo4j.py b/src/memos/graph_dbs/neo4j.py index 64aedc8f4..2cf9ae32f 100644 --- a/src/memos/graph_dbs/neo4j.py +++ b/src/memos/graph_dbs/neo4j.py @@ -1687,7 +1687,7 @@ def _parse_node(self, node_data: dict[str, Any]) -> dict[str, Any]: node.pop("user_name", None) # serialization - if node["sources"]: + if node.get("sources"): for idx in range(len(node["sources"])): if not ( isinstance(node["sources"][idx], str) From 95563f88e6c5783f823b10c153ca0a6badb7b8f1 Mon Sep 17 00:00:00 2001 From: bittergreen Date: Sun, 18 Jan 2026 20:53:09 +0800 Subject: [PATCH 44/53] doc: Adding clear instructions as comments for examples in mem_scheduler. --- examples/mem_scheduler/api_w_scheduler.py | 9 +++++++++ examples/mem_scheduler/memos_w_scheduler.py | 7 +++++++ examples/mem_scheduler/redis_example.py | 8 ++++++++ examples/mem_scheduler/run_async_tasks.py | 9 +++++++++ 4 files changed, 33 insertions(+) diff --git a/examples/mem_scheduler/api_w_scheduler.py b/examples/mem_scheduler/api_w_scheduler.py index ba3d64bf1..b02161c12 100644 --- a/examples/mem_scheduler/api_w_scheduler.py +++ b/examples/mem_scheduler/api_w_scheduler.py @@ -1,3 +1,12 @@ +""" +# Prerequisites & Configuration +# To run this script, you must have the following services +# running and configured in your .env file (or environment variables): +# 1. Redis (Required for TaskStatusTracker and Scheduler Queue) +# 2. Graph Database (Required for Memory Storage) +# 3. Vector Database (Required if using Neo4j Community or Preference Memory) +""" + import sys from pathlib import Path diff --git a/examples/mem_scheduler/memos_w_scheduler.py b/examples/mem_scheduler/memos_w_scheduler.py index 55e966b5a..b7250a677 100644 --- a/examples/mem_scheduler/memos_w_scheduler.py +++ b/examples/mem_scheduler/memos_w_scheduler.py @@ -1,3 +1,10 @@ +# Prerequisites & Configuration +# To run this script, you must have the following services +# running and configured in your .env file (or environment variables): +# 1. Redis (Required for TaskStatusTracker and Scheduler Queue) +# 2. Graph Database (Required for Memory Storage) +# 3. Vector Database (Required if using Neo4j Community or Preference Memory) + import asyncio import json import os diff --git a/examples/mem_scheduler/redis_example.py b/examples/mem_scheduler/redis_example.py index 9f7ca4139..00989c424 100644 --- a/examples/mem_scheduler/redis_example.py +++ b/examples/mem_scheduler/redis_example.py @@ -1,3 +1,11 @@ +# Prerequisites: +# 1. Ensure a Redis server is running locally on the default port (6379). +# You can start it with: `redis-server` +# On macOS with Homebrew: `/opt/homebrew/bin/redis-server` or `brew services start redis` +# On Linux: `sudo service redis-server start` +# 2. If Redis is running on a different host/port, update the configuration or environment variables accordingly. + + import sys import time diff --git a/examples/mem_scheduler/run_async_tasks.py b/examples/mem_scheduler/run_async_tasks.py index 7f544c3da..fbb5a7bcc 100644 --- a/examples/mem_scheduler/run_async_tasks.py +++ b/examples/mem_scheduler/run_async_tasks.py @@ -1,3 +1,12 @@ +""" +# Prerequisites & Configuration +# To run this script, you must have the following services +# running and configured in your .env file (or environment variables): +# 1. Redis (Required for TaskStatusTracker and Scheduler Queue) +# 2. Graph Database (Required for Memory Storage) +# 3. Vector Database (Required if using Neo4j Community or Preference Memory) +""" + from pathlib import Path from time import sleep From 47df601f292f00a0391161bbb7cc2fdc7cc7b444 Mon Sep 17 00:00:00 2001 From: bittergreen Date: Sun, 18 Jan 2026 21:31:25 +0800 Subject: [PATCH 45/53] fix: Fix example bug caused by using the default SchedulerLocalQueue(without .show_task_status method). --- examples/mem_scheduler/show_redis_status.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/examples/mem_scheduler/show_redis_status.py b/examples/mem_scheduler/show_redis_status.py index d88e86655..94a915588 100644 --- a/examples/mem_scheduler/show_redis_status.py +++ b/examples/mem_scheduler/show_redis_status.py @@ -1,10 +1,25 @@ +""" +# Prerequisites: +# 1. Ensure a Redis server is running locally on the default port (6379). +# You can start it with: `redis-server` +# On macOS with Homebrew: `/opt/homebrew/bin/redis-server` or `brew services start redis` +# On Linux: `sudo service redis-server start` +# 2. If Redis is running on a different host/port, update the configuration or environment variables accordingly. +""" + import time -from memos.api.routers.server_router import mem_scheduler +from memos.mem_scheduler.task_schedule_modules.orchestrator import SchedulerOrchestrator from memos.mem_scheduler.task_schedule_modules.redis_queue import SchedulerRedisQueue -queue = mem_scheduler.memos_message_queue.memos_message_queue +# Explicitly initialize Redis queue for monitoring +queue = SchedulerRedisQueue( + max_len=None, + consumer_group="scheduler_group", + consumer_name="monitor_consumer", + orchestrator=SchedulerOrchestrator(), +) def fetch_status( From d0f3bab577786252edc206f17707487d05e0b898 Mon Sep 17 00:00:00 2001 From: CaralHsi Date: Mon, 19 Jan 2026 14:16:39 +0800 Subject: [PATCH 46/53] revert: "doc: Examples update and related minor bug fix" (#899) Revert "doc: Examples update and related minor bug fix" --- examples/basic_modules/embedder.py | 14 +- examples/basic_modules/llm.py | 8 - examples/basic_modules/nebular_example.py | 361 ++++++++++++++++++ examples/basic_modules/parser.py | 15 + examples/basic_modules/reranker.py | 17 - .../tree_textual_memory_reasoner.py | 167 ++++++++ examples/mem_scheduler/api_w_scheduler.py | 9 - examples/mem_scheduler/memos_w_scheduler.py | 7 - examples/mem_scheduler/redis_example.py | 8 - examples/mem_scheduler/run_async_tasks.py | 9 - examples/mem_scheduler/show_redis_status.py | 19 +- src/memos/graph_dbs/neo4j.py | 2 +- 12 files changed, 547 insertions(+), 89 deletions(-) create mode 100644 examples/basic_modules/nebular_example.py create mode 100644 examples/basic_modules/parser.py create mode 100644 examples/basic_modules/tree_textual_memory_reasoner.py diff --git a/examples/basic_modules/embedder.py b/examples/basic_modules/embedder.py index d35dc1797..7cc7942da 100644 --- a/examples/basic_modules/embedder.py +++ b/examples/basic_modules/embedder.py @@ -3,10 +3,7 @@ # Scenario 1: Using EmbedderFactory -# Prerequisites: -# 1. Install Ollama: https://ollama.com/ -# 2. Start Ollama server: `ollama serve` -# 3. Pull the model: `ollama pull nomic-embed-text` + config = EmbedderConfigFactory.model_validate( { "backend": "ollama", @@ -36,9 +33,6 @@ # Scenario 3: Using SenTranEmbedder -# Prerequisites: -# 1. Ensure `einops` is installed: `pip install einops` (Required for some HF models like nomic-bert) -# 2. The model `nomic-ai/nomic-embed-text-v1.5` will be downloaded automatically from HuggingFace. config_hf = EmbedderConfigFactory.model_validate( { @@ -55,9 +49,6 @@ print("==" * 20) # === Scenario 4: Using UniversalAPIEmbedder(OpenAI) === -# Prerequisites: -# 1. Set a valid OPENAI_API_KEY -# 2. Ensure the base_url is reachable config_api = EmbedderConfigFactory.model_validate( { @@ -77,9 +68,6 @@ print("Embedding preview:", embedding_api[0][:10]) # === Scenario 5: Using UniversalAPIEmbedder(Azure) === -# Prerequisites: -# 1. Set a valid AZURE_API_KEY -# 2. Ensure the base_url is reachable config_api = EmbedderConfigFactory.model_validate( { diff --git a/examples/basic_modules/llm.py b/examples/basic_modules/llm.py index fb157c991..d33fc9544 100644 --- a/examples/basic_modules/llm.py +++ b/examples/basic_modules/llm.py @@ -5,10 +5,6 @@ # Scenario 1: Using LLMFactory with Ollama Backend # This is the most recommended way! 🌟 -# Prerequisites: -# 1. Install Ollama: https://ollama.com/ -# 2. Start Ollama server: `ollama serve` -# 3. Need python ollama package(>=0.5.0,<0.6.0) config = LLMConfigFactory.model_validate( { @@ -50,10 +46,6 @@ # Scenario 3: Using LLMFactory with OpenAI Backend -# Prerequisites: -# 1. You need a valid OpenAI API key to run this scenario. -# 2. Replace 'sk-xxxx' with your actual API key below. - config = LLMConfigFactory.model_validate( { diff --git a/examples/basic_modules/nebular_example.py b/examples/basic_modules/nebular_example.py new file mode 100644 index 000000000..13f88e3f3 --- /dev/null +++ b/examples/basic_modules/nebular_example.py @@ -0,0 +1,361 @@ +import json +import os + +from datetime import datetime, timezone + +import numpy as np + +from dotenv import load_dotenv + +from memos.configs.embedder import EmbedderConfigFactory +from memos.configs.graph_db import GraphDBConfigFactory +from memos.embedders.factory import EmbedderFactory +from memos.graph_dbs.factory import GraphStoreFactory +from memos.memories.textual.item import TextualMemoryItem, TreeNodeTextualMemoryMetadata + + +load_dotenv() + + +def show(nebular_data): + from memos.configs.graph_db import Neo4jGraphDBConfig + from memos.graph_dbs.neo4j import Neo4jGraphDB + + tree_config = Neo4jGraphDBConfig.from_json_file("../../examples/data/config/neo4j_config.json") + tree_config.use_multi_db = True + tree_config.db_name = "nebular-show2" + + neo4j_db = Neo4jGraphDB(tree_config) + neo4j_db.clear() + neo4j_db.import_graph(nebular_data) + + +embedder_config = EmbedderConfigFactory.model_validate( + { + "backend": "universal_api", + "config": { + "provider": "openai", + "api_key": os.getenv("OPENAI_API_KEY", "sk-xxxxx"), + "model_name_or_path": "text-embedding-3-large", + "base_url": os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1"), + }, + } +) +embedder = EmbedderFactory.from_config(embedder_config) +embedder_dimension = 3072 + + +def embed_memory_item(memory: str) -> list[float]: + embedding = embedder.embed([memory])[0] + embedding_np = np.array(embedding, dtype=np.float32) + embedding_list = embedding_np.tolist() + return embedding_list + + +def example_shared_db(db_name: str = "shared-traval-group"): + """ + Example: Single(Shared)-DB multi-tenant (logical isolation) + Multiple users' data in the same Neo4j DB with user_name as a tag. + """ + # users + user_list = ["travel_member_alice", "travel_member_bob"] + + for user_name in user_list: + # Step 1: Build factory config + config = GraphDBConfigFactory( + backend="nebular", + config={ + "uri": json.loads(os.getenv("NEBULAR_HOSTS", "localhost")), + "user": os.getenv("NEBULAR_USER", "root"), + "password": os.getenv("NEBULAR_PASSWORD", "xxxxxx"), + "space": db_name, + "user_name": user_name, + "use_multi_db": False, + "auto_create": True, + "embedding_dimension": embedder_dimension, + }, + ) + + # Step 2: Instantiate graph store + graph = GraphStoreFactory.from_config(config) + print(f"\n[INFO] Working in shared DB: {db_name}, for user: {user_name}") + graph.clear() + + # Step 3: Create topic node + topic = TextualMemoryItem( + memory="This research addresses long-term multi-UAV navigation for energy-efficient communication coverage.", + metadata=TreeNodeTextualMemoryMetadata( + memory_type="LongTermMemory", + key="Multi-UAV Long-Term Coverage", + hierarchy_level="topic", + type="fact", + memory_time="2024-01-01", + source="file", + sources=["paper://multi-uav-coverage/intro"], + status="activated", + confidence=95.0, + tags=["UAV", "coverage", "multi-agent"], + entities=["UAV", "coverage", "navigation"], + visibility="public", + updated_at=datetime.now().isoformat(), + embedding=embed_memory_item( + "This research addresses long-term " + "multi-UAV navigation for " + "energy-efficient communication " + "coverage." + ), + ), + ) + + graph.add_node( + id=topic.id, memory=topic.memory, metadata=topic.metadata.model_dump(exclude_none=True) + ) + + # Step 4: Add a concept for each user + concept = TextualMemoryItem( + memory=f"Itinerary plan for {user_name}", + metadata=TreeNodeTextualMemoryMetadata( + memory_type="LongTermMemory", + key="Multi-UAV Long-Term Coverage", + hierarchy_level="concept", + type="fact", + memory_time="2024-01-01", + source="file", + sources=["paper://multi-uav-coverage/intro"], + status="activated", + confidence=95.0, + tags=["UAV", "coverage", "multi-agent"], + entities=["UAV", "coverage", "navigation"], + visibility="public", + updated_at=datetime.now().isoformat(), + embedding=embed_memory_item(f"Itinerary plan for {user_name}"), + ), + ) + + graph.add_node( + id=concept.id, + memory=concept.memory, + metadata=concept.metadata.model_dump(exclude_none=True), + ) + + # Link concept to topic + graph.add_edge(source_id=concept.id, target_id=topic.id, type="RELATE_TO") + print(f"[INFO] Added nodes for {user_name}") + + # Step 5: Query and print ALL for verification + print("\n=== Export entire DB (for verification, includes ALL users) ===") + graph = GraphStoreFactory.from_config(config) + all_graph_data = graph.export_graph() + print(str(all_graph_data)[:1000]) + + # Step 6: Search for alice's data only + print("\n=== Search for travel_member_alice ===") + config_alice = GraphDBConfigFactory( + backend="nebular", + config={ + "uri": json.loads(os.getenv("NEBULAR_HOSTS", "localhost")), + "user": os.getenv("NEBULAR_USER", "root"), + "password": os.getenv("NEBULAR_PASSWORD", "xxxxxx"), + "space": db_name, + "user_name": user_list[0], + "auto_create": True, + "embedding_dimension": embedder_dimension, + "use_multi_db": False, + }, + ) + graph_alice = GraphStoreFactory.from_config(config_alice) + nodes = graph_alice.search_by_embedding(vector=embed_memory_item("travel itinerary"), top_k=3) + for node in nodes: + print(str(graph_alice.get_node(node["id"]))[:1000]) + + +def run_user_session( + user_name: str, + db_name: str, + topic_text: str, + concept_texts: list[str], + fact_texts: list[str], +): + print(f"\n=== {user_name} starts building their memory graph ===") + + # Manually initialize correct GraphDB class + config = GraphDBConfigFactory( + backend="nebular", + config={ + "uri": json.loads(os.getenv("NEBULAR_HOSTS", "localhost")), + "user": os.getenv("NEBULAR_USER", "root"), + "password": os.getenv("NEBULAR_PASSWORD", "xxxxxx"), + "space": db_name, + "user_name": user_name, + "use_multi_db": False, + "auto_create": True, + "embedding_dimension": embedder_dimension, + }, + ) + graph = GraphStoreFactory.from_config(config) + + # Start with a clean slate for this user + graph.clear() + + now = datetime.now(timezone.utc).isoformat() + + # === Step 1: Create a root topic node (e.g., user's research focus) === + topic = TextualMemoryItem( + memory=topic_text, + metadata=TreeNodeTextualMemoryMetadata( + memory_type="LongTermMemory", + key="Research Topic", + hierarchy_level="topic", + type="fact", + memory_time="2024-01-01", + status="activated", + visibility="public", + tags=["research", "rl"], + updated_at=now, + embedding=embed_memory_item(topic_text), + ), + ) + graph.add_node(topic.id, topic.memory, topic.metadata.model_dump(exclude_none=True)) + + # === Step 2: Create two concept nodes linked to the topic === + concept_items = [] + for i, text in enumerate(concept_texts): + concept = TextualMemoryItem( + memory=text, + metadata=TreeNodeTextualMemoryMetadata( + memory_type="LongTermMemory", + key=f"Concept {i + 1}", + hierarchy_level="concept", + type="fact", + memory_time="2024-01-01", + status="activated", + visibility="public", + updated_at=now, + embedding=embed_memory_item(text), + tags=["concept"], + confidence=90 + i, + ), + ) + graph.add_node(concept.id, concept.memory, concept.metadata.model_dump(exclude_none=True)) + graph.add_edge(topic.id, concept.id, type="PARENT") + concept_items.append(concept) + + # === Step 3: Create supporting facts under each concept === + for i, text in enumerate(fact_texts): + fact = TextualMemoryItem( + memory=text, + metadata=TreeNodeTextualMemoryMetadata( + memory_type="WorkingMemory", + key=f"Fact {i + 1}", + hierarchy_level="fact", + type="fact", + memory_time="2024-01-01", + status="activated", + visibility="public", + updated_at=now, + embedding=embed_memory_item(text), + confidence=85.0, + tags=["fact"], + ), + ) + graph.add_node(fact.id, fact.memory, fact.metadata.model_dump(exclude_none=True)) + graph.add_edge(concept_items[i % len(concept_items)].id, fact.id, type="PARENT") + + # === Step 4: Retrieve memory using semantic search === + vector = embed_memory_item("How is memory retrieved?") + search_result = graph.search_by_embedding(vector, top_k=2) + for r in search_result: + node = graph.get_node(r["id"]) + print("🔍 Search result:", node["memory"]) + + # === Step 5: Tag-based neighborhood discovery === + neighbors = graph.get_neighbors_by_tag(["concept"], exclude_ids=[], top_k=2) + print("📎 Tag-related nodes:", [neighbor["memory"] for neighbor in neighbors]) + + # === Step 6: Retrieve children (facts) of first concept === + children = graph.get_children_with_embeddings(concept_items[0].id) + print("📍 Children of concept:", [child["memory"] for child in children]) + + # === Step 7: Export a local subgraph and grouped statistics === + subgraph = graph.get_subgraph(topic.id, depth=2) + print("📌 Subgraph node count:", len(subgraph["neighbors"])) + + stats = graph.get_grouped_counts(["memory_type", "status"]) + print("📊 Grouped counts:", stats) + + # === Step 8: Demonstrate updates and cleanup === + graph.update_node( + concept_items[0].id, {"confidence": 99.0, "created_at": "2025-07-24T20:11:56.375687"} + ) + graph.remove_oldest_memory("WorkingMemory", keep_latest=1) + graph.delete_edge(topic.id, concept_items[0].id, type="PARENT") + graph.delete_node(concept_items[1].id) + + # === Step 9: Export and re-import the entire graph structure === + exported = graph.export_graph() + graph.import_graph(exported) + print("📦 Graph exported and re-imported, total nodes:", len(exported["nodes"])) + + # ==================================== + # 🔍 Step 10: extra function + # ==================================== + print(f"\n=== 🔍 Extra Tests for user: {user_name} ===") + + print(" - Memory count:", graph.get_memory_count("LongTermMemory")) + print(" - Node count:", graph.count_nodes("LongTermMemory")) + print(" - All LongTermMemory items:", graph.get_all_memory_items("LongTermMemory")) + + if len(exported["edges"]) > 0: + n1, n2 = exported["edges"][0]["source"], exported["edges"][0]["target"] + print(" - Edge exists?", graph.edge_exists(n1, n2, exported["edges"][0]["type"])) + print(" - Edges for node:", graph.get_edges(n1)) + + filters = [{"field": "memory_type", "op": "=", "value": "LongTermMemory"}] + print(" - Metadata query result:", graph.get_by_metadata(filters)) + print( + " - Optimization candidates:", graph.get_structure_optimization_candidates("LongTermMemory") + ) + try: + graph.drop_database() + except ValueError as e: + print(" - drop_database raised ValueError as expected:", e) + + +def example_complex_shared_db(db_name: str = "shared-traval-group-complex"): + # User 1: Alice explores structured memory for LLMs + run_user_session( + user_name="alice", + db_name=db_name, + topic_text="Alice studies structured memory and long-term memory optimization in LLMs.", + concept_texts=[ + "Short-term memory can be simulated using WorkingMemory blocks.", + "A structured memory graph improves retrieval precision for agents.", + ], + fact_texts=[ + "Embedding search is used to find semantically similar memory items.", + "User memories are stored as node-edge structures that support hierarchical reasoning.", + ], + ) + + # User 2: Bob focuses on GNN-based reasoning + run_user_session( + user_name="bob", + db_name=db_name, + topic_text="Bob investigates how graph neural networks can support knowledge reasoning.", + concept_texts=[ + "GNNs can learn high-order relations among entities.", + "Attention mechanisms in graphs improve inference precision.", + ], + fact_texts=[ + "GAT outperforms GCN in graph classification tasks.", + "Multi-hop reasoning helps answer complex queries.", + ], + ) + + +if __name__ == "__main__": + print("\n=== Example: Single-DB ===") + example_shared_db(db_name="shared_traval_group-new") + + print("\n=== Example: Single-DB-Complex ===") + example_complex_shared_db(db_name="shared-traval-group-complex-new2") diff --git a/examples/basic_modules/parser.py b/examples/basic_modules/parser.py new file mode 100644 index 000000000..c063964b7 --- /dev/null +++ b/examples/basic_modules/parser.py @@ -0,0 +1,15 @@ +from memos.configs.parser import ParserConfigFactory +from memos.parsers.factory import ParserFactory + + +config = ParserConfigFactory.model_validate( + { + "backend": "markitdown", + "config": {}, + } +) +parser = ParserFactory.from_config(config) +file_path = "README.md" +markdown_text = parser.parse(file_path) +print("Markdown text:\n", markdown_text) +print("==" * 20) diff --git a/examples/basic_modules/reranker.py b/examples/basic_modules/reranker.py index e5a869789..47bf1405c 100644 --- a/examples/basic_modules/reranker.py +++ b/examples/basic_modules/reranker.py @@ -50,7 +50,6 @@ def show_ranked(title: str, ranked: list[tuple[TextualMemoryItem, float]], top_n def main(): # ------------------------------- # 1) Build the embedder (real vectors) - # You may need to set valid OPENAI_API_KEY and OPENAI_API_BASE in your environment variables. # ------------------------------- embedder_cfg = EmbedderConfigFactory.model_validate( { @@ -63,22 +62,6 @@ def main(): }, } ) - """ - # ------------------------------- - # Optional: Build the embedder (using local sentence-transformers) - # ------------------------------- - # Use a local model so no API key is required. - embedder_cfg = EmbedderConfigFactory.model_validate( - { - "backend": "sentence_transformer", - "config": { - "model_name_or_path": "nomic-ai/nomic-embed-text-v1.5", - "trust_remote_code": True, - }, - } - ) - """ - embedder = EmbedderFactory.from_config(embedder_cfg) # ------------------------------- diff --git a/examples/basic_modules/tree_textual_memory_reasoner.py b/examples/basic_modules/tree_textual_memory_reasoner.py new file mode 100644 index 000000000..369787458 --- /dev/null +++ b/examples/basic_modules/tree_textual_memory_reasoner.py @@ -0,0 +1,167 @@ +from memos import log +from memos.configs.embedder import EmbedderConfigFactory +from memos.configs.graph_db import GraphDBConfigFactory +from memos.configs.llm import LLMConfigFactory +from memos.embedders.factory import EmbedderFactory +from memos.graph_dbs.factory import GraphStoreFactory +from memos.llms.factory import LLMFactory +from memos.memories.textual.item import TextualMemoryItem, TreeNodeTextualMemoryMetadata +from memos.memories.textual.tree_text_memory.retrieve.reasoner import MemoryReasoner +from memos.memories.textual.tree_text_memory.retrieve.retrieval_mid_structs import ParsedTaskGoal + + +logger = log.get_logger(__name__) + +embedder_config = EmbedderConfigFactory.model_validate( + { + "backend": "ollama", + "config": { + "model_name_or_path": "nomic-embed-text:latest", + }, + } +) +embedder = EmbedderFactory.from_config(embedder_config) + +# Step 1: Load LLM config and instantiate +config = LLMConfigFactory.model_validate( + { + "backend": "ollama", + "config": { + "model_name_or_path": "qwen3:0.6b", + "temperature": 0.7, + "max_tokens": 1024, + }, + } +) +llm = LLMFactory.from_config(config) + +# Step 1: Prepare a mock ParsedTaskGoal +parsed_goal = ParsedTaskGoal( + memories=[ + "Multi-UAV Long-Term Coverage", + "Coverage Metrics", + "Reward Function Design", + "Energy Model", + "CT and FT Definition", + "Reward Components", + "Energy Cost Components", + ], + keys=["UAV", "coverage", "energy", "reward"], + tags=[], + goal_type="explanation", +) + +query = "How can multiple UAVs coordinate to maximize coverage while saving energy?" +query_embedding = embedder.embed([query])[0] + + +# Step 2: Initialize graph store +graph_config = GraphDBConfigFactory( + backend="neo4j", + config={ + "uri": "bolt://localhost:7687", + "user": "neo4j", + "password": "12345678", + "db_name": "user06alice", + "auto_create": True, + }, +) +graph_store = GraphStoreFactory.from_config(graph_config) + +ranked_memories = [ + TextualMemoryItem( + id="a88db9ce-3c77-4e83-8d61-aa9ef95c957e", + memory="Coverage performance is measured using CT (Coverage Time) and FT (Fairness Time) metrics.", + metadata=TreeNodeTextualMemoryMetadata( + user_id=None, + session_id=None, + status="activated", + type="fact", + memory_time="2024-01-01", + source="file", + confidence=91.0, + entities=["CT", "FT"], + tags=["coverage", "fairness", "metrics"], + visibility="public", + updated_at="2025-06-11T11:51:24.438001", + memory_type="LongTermMemory", + key="Coverage Metrics", + value="CT and FT used for long-term area and fairness evaluation", + hierarchy_level="concept", + sources=["paper://multi-uav-coverage/metrics"], + embedding=[0.01] * 768, + ), + ), + TextualMemoryItem( + id="c34f5e6b-2d34-4e6f-8c9b-abcdef123456", + memory="The capital of France is Paris, which is known for the Eiffel Tower.", + metadata=TreeNodeTextualMemoryMetadata( + user_id=None, + session_id=None, + status="activated", + type="fact", + memory_time="2024-01-01", + source="file", + confidence=90.0, + entities=["France", "Paris", "Eiffel Tower"], + tags=["geography", "city", "landmark"], + visibility="public", + updated_at="2025-06-11T11:51:24.438001", + memory_type="LongTermMemory", + key="Geography Fact", + value="Paris is the capital of France", + hierarchy_level="concept", + sources=["wikipedia://paris"], + embedding=[0.03] * 768, + ), + ), + TextualMemoryItem( + id="d56a7b8c-3e45-4f7a-9dab-fedcba654321", + memory="Total energy cost is calculated from both mechanical movement and communication transmission.", + metadata=TreeNodeTextualMemoryMetadata( + user_id=None, + session_id=None, + status="activated", + type="fact", + memory_time="2024-01-01", + source="file", + confidence=89.0, + entities=["movement power", "transmission power"], + tags=["energy", "movement", "transmission"], + visibility="public", + updated_at="2025-06-11T11:51:24.438001", + memory_type="LongTermMemory", + key="Energy Cost Components", + value="Includes movement and communication energy", + hierarchy_level="fact", + sources=["paper://multi-uav-coverage/energy-detail"], + embedding=[0.04] * 768, + ), + ), +] + +# Step 7: Init memory retriever +reasoner = MemoryReasoner(llm=llm) + + +# Step 8: Print retrieved memory items before ranking +print("\n=== Retrieved Memory Items (Before Rerank) ===") +for idx, item in enumerate(ranked_memories): + print(f"[Original #{idx + 1}] ID: {item.id}") + print(f"Memory: {item.memory[:200]}...\n") + +# Step 9: Rerank +reasoned_memories = reasoner.reason( + query=query, + ranked_memories=ranked_memories, + parsed_goal=parsed_goal, +) + +# Step 10: Print ranked reasoned memory items with original positions +print("\n=== Memory Items After Reason (Sorted) ===") +id_to_original_rank = {item.id: i + 1 for i, item in enumerate(ranked_memories)} + +for idx, item in enumerate(reasoned_memories): + original_rank = id_to_original_rank.get(item.id, "-") + print(f"[Reasoned #{idx + 1}] ID: {item.id} (Original #{original_rank})") + print(f"Memory: {item.memory[:200]}...\n") diff --git a/examples/mem_scheduler/api_w_scheduler.py b/examples/mem_scheduler/api_w_scheduler.py index b02161c12..ba3d64bf1 100644 --- a/examples/mem_scheduler/api_w_scheduler.py +++ b/examples/mem_scheduler/api_w_scheduler.py @@ -1,12 +1,3 @@ -""" -# Prerequisites & Configuration -# To run this script, you must have the following services -# running and configured in your .env file (or environment variables): -# 1. Redis (Required for TaskStatusTracker and Scheduler Queue) -# 2. Graph Database (Required for Memory Storage) -# 3. Vector Database (Required if using Neo4j Community or Preference Memory) -""" - import sys from pathlib import Path diff --git a/examples/mem_scheduler/memos_w_scheduler.py b/examples/mem_scheduler/memos_w_scheduler.py index b7250a677..55e966b5a 100644 --- a/examples/mem_scheduler/memos_w_scheduler.py +++ b/examples/mem_scheduler/memos_w_scheduler.py @@ -1,10 +1,3 @@ -# Prerequisites & Configuration -# To run this script, you must have the following services -# running and configured in your .env file (or environment variables): -# 1. Redis (Required for TaskStatusTracker and Scheduler Queue) -# 2. Graph Database (Required for Memory Storage) -# 3. Vector Database (Required if using Neo4j Community or Preference Memory) - import asyncio import json import os diff --git a/examples/mem_scheduler/redis_example.py b/examples/mem_scheduler/redis_example.py index 00989c424..9f7ca4139 100644 --- a/examples/mem_scheduler/redis_example.py +++ b/examples/mem_scheduler/redis_example.py @@ -1,11 +1,3 @@ -# Prerequisites: -# 1. Ensure a Redis server is running locally on the default port (6379). -# You can start it with: `redis-server` -# On macOS with Homebrew: `/opt/homebrew/bin/redis-server` or `brew services start redis` -# On Linux: `sudo service redis-server start` -# 2. If Redis is running on a different host/port, update the configuration or environment variables accordingly. - - import sys import time diff --git a/examples/mem_scheduler/run_async_tasks.py b/examples/mem_scheduler/run_async_tasks.py index fbb5a7bcc..7f544c3da 100644 --- a/examples/mem_scheduler/run_async_tasks.py +++ b/examples/mem_scheduler/run_async_tasks.py @@ -1,12 +1,3 @@ -""" -# Prerequisites & Configuration -# To run this script, you must have the following services -# running and configured in your .env file (or environment variables): -# 1. Redis (Required for TaskStatusTracker and Scheduler Queue) -# 2. Graph Database (Required for Memory Storage) -# 3. Vector Database (Required if using Neo4j Community or Preference Memory) -""" - from pathlib import Path from time import sleep diff --git a/examples/mem_scheduler/show_redis_status.py b/examples/mem_scheduler/show_redis_status.py index 94a915588..d88e86655 100644 --- a/examples/mem_scheduler/show_redis_status.py +++ b/examples/mem_scheduler/show_redis_status.py @@ -1,25 +1,10 @@ -""" -# Prerequisites: -# 1. Ensure a Redis server is running locally on the default port (6379). -# You can start it with: `redis-server` -# On macOS with Homebrew: `/opt/homebrew/bin/redis-server` or `brew services start redis` -# On Linux: `sudo service redis-server start` -# 2. If Redis is running on a different host/port, update the configuration or environment variables accordingly. -""" - import time -from memos.mem_scheduler.task_schedule_modules.orchestrator import SchedulerOrchestrator +from memos.api.routers.server_router import mem_scheduler from memos.mem_scheduler.task_schedule_modules.redis_queue import SchedulerRedisQueue -# Explicitly initialize Redis queue for monitoring -queue = SchedulerRedisQueue( - max_len=None, - consumer_group="scheduler_group", - consumer_name="monitor_consumer", - orchestrator=SchedulerOrchestrator(), -) +queue = mem_scheduler.memos_message_queue.memos_message_queue def fetch_status( diff --git a/src/memos/graph_dbs/neo4j.py b/src/memos/graph_dbs/neo4j.py index 2cf9ae32f..64aedc8f4 100644 --- a/src/memos/graph_dbs/neo4j.py +++ b/src/memos/graph_dbs/neo4j.py @@ -1687,7 +1687,7 @@ def _parse_node(self, node_data: dict[str, Any]) -> dict[str, Any]: node.pop("user_name", None) # serialization - if node.get("sources"): + if node["sources"]: for idx in range(len(node["sources"])): if not ( isinstance(node["sources"][idx], str) From 0cd396030fe16d068ef48081bd775b8708ce3481 Mon Sep 17 00:00:00 2001 From: Qi Weng Date: Mon, 19 Jan 2026 15:16:37 +0800 Subject: [PATCH 47/53] doc: Examples update and related minor bug fix (#900) Revert "revert: "doc: Examples update and related minor bug fix" (#899)" The test failed because of other reasons than commits in this pr, so we revert this revert. This reverts commit d0f3bab577786252edc206f17707487d05e0b898. Co-authored-by: CaralHsi --- examples/basic_modules/embedder.py | 14 +- examples/basic_modules/llm.py | 8 + examples/basic_modules/nebular_example.py | 361 ------------------ examples/basic_modules/parser.py | 15 - examples/basic_modules/reranker.py | 17 + .../tree_textual_memory_reasoner.py | 167 -------- examples/mem_scheduler/api_w_scheduler.py | 9 + examples/mem_scheduler/memos_w_scheduler.py | 7 + examples/mem_scheduler/redis_example.py | 8 + examples/mem_scheduler/run_async_tasks.py | 9 + examples/mem_scheduler/show_redis_status.py | 19 +- src/memos/graph_dbs/neo4j.py | 2 +- 12 files changed, 89 insertions(+), 547 deletions(-) delete mode 100644 examples/basic_modules/nebular_example.py delete mode 100644 examples/basic_modules/parser.py delete mode 100644 examples/basic_modules/tree_textual_memory_reasoner.py diff --git a/examples/basic_modules/embedder.py b/examples/basic_modules/embedder.py index 7cc7942da..d35dc1797 100644 --- a/examples/basic_modules/embedder.py +++ b/examples/basic_modules/embedder.py @@ -3,7 +3,10 @@ # Scenario 1: Using EmbedderFactory - +# Prerequisites: +# 1. Install Ollama: https://ollama.com/ +# 2. Start Ollama server: `ollama serve` +# 3. Pull the model: `ollama pull nomic-embed-text` config = EmbedderConfigFactory.model_validate( { "backend": "ollama", @@ -33,6 +36,9 @@ # Scenario 3: Using SenTranEmbedder +# Prerequisites: +# 1. Ensure `einops` is installed: `pip install einops` (Required for some HF models like nomic-bert) +# 2. The model `nomic-ai/nomic-embed-text-v1.5` will be downloaded automatically from HuggingFace. config_hf = EmbedderConfigFactory.model_validate( { @@ -49,6 +55,9 @@ print("==" * 20) # === Scenario 4: Using UniversalAPIEmbedder(OpenAI) === +# Prerequisites: +# 1. Set a valid OPENAI_API_KEY +# 2. Ensure the base_url is reachable config_api = EmbedderConfigFactory.model_validate( { @@ -68,6 +77,9 @@ print("Embedding preview:", embedding_api[0][:10]) # === Scenario 5: Using UniversalAPIEmbedder(Azure) === +# Prerequisites: +# 1. Set a valid AZURE_API_KEY +# 2. Ensure the base_url is reachable config_api = EmbedderConfigFactory.model_validate( { diff --git a/examples/basic_modules/llm.py b/examples/basic_modules/llm.py index d33fc9544..fb157c991 100644 --- a/examples/basic_modules/llm.py +++ b/examples/basic_modules/llm.py @@ -5,6 +5,10 @@ # Scenario 1: Using LLMFactory with Ollama Backend # This is the most recommended way! 🌟 +# Prerequisites: +# 1. Install Ollama: https://ollama.com/ +# 2. Start Ollama server: `ollama serve` +# 3. Need python ollama package(>=0.5.0,<0.6.0) config = LLMConfigFactory.model_validate( { @@ -46,6 +50,10 @@ # Scenario 3: Using LLMFactory with OpenAI Backend +# Prerequisites: +# 1. You need a valid OpenAI API key to run this scenario. +# 2. Replace 'sk-xxxx' with your actual API key below. + config = LLMConfigFactory.model_validate( { diff --git a/examples/basic_modules/nebular_example.py b/examples/basic_modules/nebular_example.py deleted file mode 100644 index 13f88e3f3..000000000 --- a/examples/basic_modules/nebular_example.py +++ /dev/null @@ -1,361 +0,0 @@ -import json -import os - -from datetime import datetime, timezone - -import numpy as np - -from dotenv import load_dotenv - -from memos.configs.embedder import EmbedderConfigFactory -from memos.configs.graph_db import GraphDBConfigFactory -from memos.embedders.factory import EmbedderFactory -from memos.graph_dbs.factory import GraphStoreFactory -from memos.memories.textual.item import TextualMemoryItem, TreeNodeTextualMemoryMetadata - - -load_dotenv() - - -def show(nebular_data): - from memos.configs.graph_db import Neo4jGraphDBConfig - from memos.graph_dbs.neo4j import Neo4jGraphDB - - tree_config = Neo4jGraphDBConfig.from_json_file("../../examples/data/config/neo4j_config.json") - tree_config.use_multi_db = True - tree_config.db_name = "nebular-show2" - - neo4j_db = Neo4jGraphDB(tree_config) - neo4j_db.clear() - neo4j_db.import_graph(nebular_data) - - -embedder_config = EmbedderConfigFactory.model_validate( - { - "backend": "universal_api", - "config": { - "provider": "openai", - "api_key": os.getenv("OPENAI_API_KEY", "sk-xxxxx"), - "model_name_or_path": "text-embedding-3-large", - "base_url": os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1"), - }, - } -) -embedder = EmbedderFactory.from_config(embedder_config) -embedder_dimension = 3072 - - -def embed_memory_item(memory: str) -> list[float]: - embedding = embedder.embed([memory])[0] - embedding_np = np.array(embedding, dtype=np.float32) - embedding_list = embedding_np.tolist() - return embedding_list - - -def example_shared_db(db_name: str = "shared-traval-group"): - """ - Example: Single(Shared)-DB multi-tenant (logical isolation) - Multiple users' data in the same Neo4j DB with user_name as a tag. - """ - # users - user_list = ["travel_member_alice", "travel_member_bob"] - - for user_name in user_list: - # Step 1: Build factory config - config = GraphDBConfigFactory( - backend="nebular", - config={ - "uri": json.loads(os.getenv("NEBULAR_HOSTS", "localhost")), - "user": os.getenv("NEBULAR_USER", "root"), - "password": os.getenv("NEBULAR_PASSWORD", "xxxxxx"), - "space": db_name, - "user_name": user_name, - "use_multi_db": False, - "auto_create": True, - "embedding_dimension": embedder_dimension, - }, - ) - - # Step 2: Instantiate graph store - graph = GraphStoreFactory.from_config(config) - print(f"\n[INFO] Working in shared DB: {db_name}, for user: {user_name}") - graph.clear() - - # Step 3: Create topic node - topic = TextualMemoryItem( - memory="This research addresses long-term multi-UAV navigation for energy-efficient communication coverage.", - metadata=TreeNodeTextualMemoryMetadata( - memory_type="LongTermMemory", - key="Multi-UAV Long-Term Coverage", - hierarchy_level="topic", - type="fact", - memory_time="2024-01-01", - source="file", - sources=["paper://multi-uav-coverage/intro"], - status="activated", - confidence=95.0, - tags=["UAV", "coverage", "multi-agent"], - entities=["UAV", "coverage", "navigation"], - visibility="public", - updated_at=datetime.now().isoformat(), - embedding=embed_memory_item( - "This research addresses long-term " - "multi-UAV navigation for " - "energy-efficient communication " - "coverage." - ), - ), - ) - - graph.add_node( - id=topic.id, memory=topic.memory, metadata=topic.metadata.model_dump(exclude_none=True) - ) - - # Step 4: Add a concept for each user - concept = TextualMemoryItem( - memory=f"Itinerary plan for {user_name}", - metadata=TreeNodeTextualMemoryMetadata( - memory_type="LongTermMemory", - key="Multi-UAV Long-Term Coverage", - hierarchy_level="concept", - type="fact", - memory_time="2024-01-01", - source="file", - sources=["paper://multi-uav-coverage/intro"], - status="activated", - confidence=95.0, - tags=["UAV", "coverage", "multi-agent"], - entities=["UAV", "coverage", "navigation"], - visibility="public", - updated_at=datetime.now().isoformat(), - embedding=embed_memory_item(f"Itinerary plan for {user_name}"), - ), - ) - - graph.add_node( - id=concept.id, - memory=concept.memory, - metadata=concept.metadata.model_dump(exclude_none=True), - ) - - # Link concept to topic - graph.add_edge(source_id=concept.id, target_id=topic.id, type="RELATE_TO") - print(f"[INFO] Added nodes for {user_name}") - - # Step 5: Query and print ALL for verification - print("\n=== Export entire DB (for verification, includes ALL users) ===") - graph = GraphStoreFactory.from_config(config) - all_graph_data = graph.export_graph() - print(str(all_graph_data)[:1000]) - - # Step 6: Search for alice's data only - print("\n=== Search for travel_member_alice ===") - config_alice = GraphDBConfigFactory( - backend="nebular", - config={ - "uri": json.loads(os.getenv("NEBULAR_HOSTS", "localhost")), - "user": os.getenv("NEBULAR_USER", "root"), - "password": os.getenv("NEBULAR_PASSWORD", "xxxxxx"), - "space": db_name, - "user_name": user_list[0], - "auto_create": True, - "embedding_dimension": embedder_dimension, - "use_multi_db": False, - }, - ) - graph_alice = GraphStoreFactory.from_config(config_alice) - nodes = graph_alice.search_by_embedding(vector=embed_memory_item("travel itinerary"), top_k=3) - for node in nodes: - print(str(graph_alice.get_node(node["id"]))[:1000]) - - -def run_user_session( - user_name: str, - db_name: str, - topic_text: str, - concept_texts: list[str], - fact_texts: list[str], -): - print(f"\n=== {user_name} starts building their memory graph ===") - - # Manually initialize correct GraphDB class - config = GraphDBConfigFactory( - backend="nebular", - config={ - "uri": json.loads(os.getenv("NEBULAR_HOSTS", "localhost")), - "user": os.getenv("NEBULAR_USER", "root"), - "password": os.getenv("NEBULAR_PASSWORD", "xxxxxx"), - "space": db_name, - "user_name": user_name, - "use_multi_db": False, - "auto_create": True, - "embedding_dimension": embedder_dimension, - }, - ) - graph = GraphStoreFactory.from_config(config) - - # Start with a clean slate for this user - graph.clear() - - now = datetime.now(timezone.utc).isoformat() - - # === Step 1: Create a root topic node (e.g., user's research focus) === - topic = TextualMemoryItem( - memory=topic_text, - metadata=TreeNodeTextualMemoryMetadata( - memory_type="LongTermMemory", - key="Research Topic", - hierarchy_level="topic", - type="fact", - memory_time="2024-01-01", - status="activated", - visibility="public", - tags=["research", "rl"], - updated_at=now, - embedding=embed_memory_item(topic_text), - ), - ) - graph.add_node(topic.id, topic.memory, topic.metadata.model_dump(exclude_none=True)) - - # === Step 2: Create two concept nodes linked to the topic === - concept_items = [] - for i, text in enumerate(concept_texts): - concept = TextualMemoryItem( - memory=text, - metadata=TreeNodeTextualMemoryMetadata( - memory_type="LongTermMemory", - key=f"Concept {i + 1}", - hierarchy_level="concept", - type="fact", - memory_time="2024-01-01", - status="activated", - visibility="public", - updated_at=now, - embedding=embed_memory_item(text), - tags=["concept"], - confidence=90 + i, - ), - ) - graph.add_node(concept.id, concept.memory, concept.metadata.model_dump(exclude_none=True)) - graph.add_edge(topic.id, concept.id, type="PARENT") - concept_items.append(concept) - - # === Step 3: Create supporting facts under each concept === - for i, text in enumerate(fact_texts): - fact = TextualMemoryItem( - memory=text, - metadata=TreeNodeTextualMemoryMetadata( - memory_type="WorkingMemory", - key=f"Fact {i + 1}", - hierarchy_level="fact", - type="fact", - memory_time="2024-01-01", - status="activated", - visibility="public", - updated_at=now, - embedding=embed_memory_item(text), - confidence=85.0, - tags=["fact"], - ), - ) - graph.add_node(fact.id, fact.memory, fact.metadata.model_dump(exclude_none=True)) - graph.add_edge(concept_items[i % len(concept_items)].id, fact.id, type="PARENT") - - # === Step 4: Retrieve memory using semantic search === - vector = embed_memory_item("How is memory retrieved?") - search_result = graph.search_by_embedding(vector, top_k=2) - for r in search_result: - node = graph.get_node(r["id"]) - print("🔍 Search result:", node["memory"]) - - # === Step 5: Tag-based neighborhood discovery === - neighbors = graph.get_neighbors_by_tag(["concept"], exclude_ids=[], top_k=2) - print("📎 Tag-related nodes:", [neighbor["memory"] for neighbor in neighbors]) - - # === Step 6: Retrieve children (facts) of first concept === - children = graph.get_children_with_embeddings(concept_items[0].id) - print("📍 Children of concept:", [child["memory"] for child in children]) - - # === Step 7: Export a local subgraph and grouped statistics === - subgraph = graph.get_subgraph(topic.id, depth=2) - print("📌 Subgraph node count:", len(subgraph["neighbors"])) - - stats = graph.get_grouped_counts(["memory_type", "status"]) - print("📊 Grouped counts:", stats) - - # === Step 8: Demonstrate updates and cleanup === - graph.update_node( - concept_items[0].id, {"confidence": 99.0, "created_at": "2025-07-24T20:11:56.375687"} - ) - graph.remove_oldest_memory("WorkingMemory", keep_latest=1) - graph.delete_edge(topic.id, concept_items[0].id, type="PARENT") - graph.delete_node(concept_items[1].id) - - # === Step 9: Export and re-import the entire graph structure === - exported = graph.export_graph() - graph.import_graph(exported) - print("📦 Graph exported and re-imported, total nodes:", len(exported["nodes"])) - - # ==================================== - # 🔍 Step 10: extra function - # ==================================== - print(f"\n=== 🔍 Extra Tests for user: {user_name} ===") - - print(" - Memory count:", graph.get_memory_count("LongTermMemory")) - print(" - Node count:", graph.count_nodes("LongTermMemory")) - print(" - All LongTermMemory items:", graph.get_all_memory_items("LongTermMemory")) - - if len(exported["edges"]) > 0: - n1, n2 = exported["edges"][0]["source"], exported["edges"][0]["target"] - print(" - Edge exists?", graph.edge_exists(n1, n2, exported["edges"][0]["type"])) - print(" - Edges for node:", graph.get_edges(n1)) - - filters = [{"field": "memory_type", "op": "=", "value": "LongTermMemory"}] - print(" - Metadata query result:", graph.get_by_metadata(filters)) - print( - " - Optimization candidates:", graph.get_structure_optimization_candidates("LongTermMemory") - ) - try: - graph.drop_database() - except ValueError as e: - print(" - drop_database raised ValueError as expected:", e) - - -def example_complex_shared_db(db_name: str = "shared-traval-group-complex"): - # User 1: Alice explores structured memory for LLMs - run_user_session( - user_name="alice", - db_name=db_name, - topic_text="Alice studies structured memory and long-term memory optimization in LLMs.", - concept_texts=[ - "Short-term memory can be simulated using WorkingMemory blocks.", - "A structured memory graph improves retrieval precision for agents.", - ], - fact_texts=[ - "Embedding search is used to find semantically similar memory items.", - "User memories are stored as node-edge structures that support hierarchical reasoning.", - ], - ) - - # User 2: Bob focuses on GNN-based reasoning - run_user_session( - user_name="bob", - db_name=db_name, - topic_text="Bob investigates how graph neural networks can support knowledge reasoning.", - concept_texts=[ - "GNNs can learn high-order relations among entities.", - "Attention mechanisms in graphs improve inference precision.", - ], - fact_texts=[ - "GAT outperforms GCN in graph classification tasks.", - "Multi-hop reasoning helps answer complex queries.", - ], - ) - - -if __name__ == "__main__": - print("\n=== Example: Single-DB ===") - example_shared_db(db_name="shared_traval_group-new") - - print("\n=== Example: Single-DB-Complex ===") - example_complex_shared_db(db_name="shared-traval-group-complex-new2") diff --git a/examples/basic_modules/parser.py b/examples/basic_modules/parser.py deleted file mode 100644 index c063964b7..000000000 --- a/examples/basic_modules/parser.py +++ /dev/null @@ -1,15 +0,0 @@ -from memos.configs.parser import ParserConfigFactory -from memos.parsers.factory import ParserFactory - - -config = ParserConfigFactory.model_validate( - { - "backend": "markitdown", - "config": {}, - } -) -parser = ParserFactory.from_config(config) -file_path = "README.md" -markdown_text = parser.parse(file_path) -print("Markdown text:\n", markdown_text) -print("==" * 20) diff --git a/examples/basic_modules/reranker.py b/examples/basic_modules/reranker.py index 47bf1405c..e5a869789 100644 --- a/examples/basic_modules/reranker.py +++ b/examples/basic_modules/reranker.py @@ -50,6 +50,7 @@ def show_ranked(title: str, ranked: list[tuple[TextualMemoryItem, float]], top_n def main(): # ------------------------------- # 1) Build the embedder (real vectors) + # You may need to set valid OPENAI_API_KEY and OPENAI_API_BASE in your environment variables. # ------------------------------- embedder_cfg = EmbedderConfigFactory.model_validate( { @@ -62,6 +63,22 @@ def main(): }, } ) + """ + # ------------------------------- + # Optional: Build the embedder (using local sentence-transformers) + # ------------------------------- + # Use a local model so no API key is required. + embedder_cfg = EmbedderConfigFactory.model_validate( + { + "backend": "sentence_transformer", + "config": { + "model_name_or_path": "nomic-ai/nomic-embed-text-v1.5", + "trust_remote_code": True, + }, + } + ) + """ + embedder = EmbedderFactory.from_config(embedder_cfg) # ------------------------------- diff --git a/examples/basic_modules/tree_textual_memory_reasoner.py b/examples/basic_modules/tree_textual_memory_reasoner.py deleted file mode 100644 index 369787458..000000000 --- a/examples/basic_modules/tree_textual_memory_reasoner.py +++ /dev/null @@ -1,167 +0,0 @@ -from memos import log -from memos.configs.embedder import EmbedderConfigFactory -from memos.configs.graph_db import GraphDBConfigFactory -from memos.configs.llm import LLMConfigFactory -from memos.embedders.factory import EmbedderFactory -from memos.graph_dbs.factory import GraphStoreFactory -from memos.llms.factory import LLMFactory -from memos.memories.textual.item import TextualMemoryItem, TreeNodeTextualMemoryMetadata -from memos.memories.textual.tree_text_memory.retrieve.reasoner import MemoryReasoner -from memos.memories.textual.tree_text_memory.retrieve.retrieval_mid_structs import ParsedTaskGoal - - -logger = log.get_logger(__name__) - -embedder_config = EmbedderConfigFactory.model_validate( - { - "backend": "ollama", - "config": { - "model_name_or_path": "nomic-embed-text:latest", - }, - } -) -embedder = EmbedderFactory.from_config(embedder_config) - -# Step 1: Load LLM config and instantiate -config = LLMConfigFactory.model_validate( - { - "backend": "ollama", - "config": { - "model_name_or_path": "qwen3:0.6b", - "temperature": 0.7, - "max_tokens": 1024, - }, - } -) -llm = LLMFactory.from_config(config) - -# Step 1: Prepare a mock ParsedTaskGoal -parsed_goal = ParsedTaskGoal( - memories=[ - "Multi-UAV Long-Term Coverage", - "Coverage Metrics", - "Reward Function Design", - "Energy Model", - "CT and FT Definition", - "Reward Components", - "Energy Cost Components", - ], - keys=["UAV", "coverage", "energy", "reward"], - tags=[], - goal_type="explanation", -) - -query = "How can multiple UAVs coordinate to maximize coverage while saving energy?" -query_embedding = embedder.embed([query])[0] - - -# Step 2: Initialize graph store -graph_config = GraphDBConfigFactory( - backend="neo4j", - config={ - "uri": "bolt://localhost:7687", - "user": "neo4j", - "password": "12345678", - "db_name": "user06alice", - "auto_create": True, - }, -) -graph_store = GraphStoreFactory.from_config(graph_config) - -ranked_memories = [ - TextualMemoryItem( - id="a88db9ce-3c77-4e83-8d61-aa9ef95c957e", - memory="Coverage performance is measured using CT (Coverage Time) and FT (Fairness Time) metrics.", - metadata=TreeNodeTextualMemoryMetadata( - user_id=None, - session_id=None, - status="activated", - type="fact", - memory_time="2024-01-01", - source="file", - confidence=91.0, - entities=["CT", "FT"], - tags=["coverage", "fairness", "metrics"], - visibility="public", - updated_at="2025-06-11T11:51:24.438001", - memory_type="LongTermMemory", - key="Coverage Metrics", - value="CT and FT used for long-term area and fairness evaluation", - hierarchy_level="concept", - sources=["paper://multi-uav-coverage/metrics"], - embedding=[0.01] * 768, - ), - ), - TextualMemoryItem( - id="c34f5e6b-2d34-4e6f-8c9b-abcdef123456", - memory="The capital of France is Paris, which is known for the Eiffel Tower.", - metadata=TreeNodeTextualMemoryMetadata( - user_id=None, - session_id=None, - status="activated", - type="fact", - memory_time="2024-01-01", - source="file", - confidence=90.0, - entities=["France", "Paris", "Eiffel Tower"], - tags=["geography", "city", "landmark"], - visibility="public", - updated_at="2025-06-11T11:51:24.438001", - memory_type="LongTermMemory", - key="Geography Fact", - value="Paris is the capital of France", - hierarchy_level="concept", - sources=["wikipedia://paris"], - embedding=[0.03] * 768, - ), - ), - TextualMemoryItem( - id="d56a7b8c-3e45-4f7a-9dab-fedcba654321", - memory="Total energy cost is calculated from both mechanical movement and communication transmission.", - metadata=TreeNodeTextualMemoryMetadata( - user_id=None, - session_id=None, - status="activated", - type="fact", - memory_time="2024-01-01", - source="file", - confidence=89.0, - entities=["movement power", "transmission power"], - tags=["energy", "movement", "transmission"], - visibility="public", - updated_at="2025-06-11T11:51:24.438001", - memory_type="LongTermMemory", - key="Energy Cost Components", - value="Includes movement and communication energy", - hierarchy_level="fact", - sources=["paper://multi-uav-coverage/energy-detail"], - embedding=[0.04] * 768, - ), - ), -] - -# Step 7: Init memory retriever -reasoner = MemoryReasoner(llm=llm) - - -# Step 8: Print retrieved memory items before ranking -print("\n=== Retrieved Memory Items (Before Rerank) ===") -for idx, item in enumerate(ranked_memories): - print(f"[Original #{idx + 1}] ID: {item.id}") - print(f"Memory: {item.memory[:200]}...\n") - -# Step 9: Rerank -reasoned_memories = reasoner.reason( - query=query, - ranked_memories=ranked_memories, - parsed_goal=parsed_goal, -) - -# Step 10: Print ranked reasoned memory items with original positions -print("\n=== Memory Items After Reason (Sorted) ===") -id_to_original_rank = {item.id: i + 1 for i, item in enumerate(ranked_memories)} - -for idx, item in enumerate(reasoned_memories): - original_rank = id_to_original_rank.get(item.id, "-") - print(f"[Reasoned #{idx + 1}] ID: {item.id} (Original #{original_rank})") - print(f"Memory: {item.memory[:200]}...\n") diff --git a/examples/mem_scheduler/api_w_scheduler.py b/examples/mem_scheduler/api_w_scheduler.py index ba3d64bf1..b02161c12 100644 --- a/examples/mem_scheduler/api_w_scheduler.py +++ b/examples/mem_scheduler/api_w_scheduler.py @@ -1,3 +1,12 @@ +""" +# Prerequisites & Configuration +# To run this script, you must have the following services +# running and configured in your .env file (or environment variables): +# 1. Redis (Required for TaskStatusTracker and Scheduler Queue) +# 2. Graph Database (Required for Memory Storage) +# 3. Vector Database (Required if using Neo4j Community or Preference Memory) +""" + import sys from pathlib import Path diff --git a/examples/mem_scheduler/memos_w_scheduler.py b/examples/mem_scheduler/memos_w_scheduler.py index 55e966b5a..b7250a677 100644 --- a/examples/mem_scheduler/memos_w_scheduler.py +++ b/examples/mem_scheduler/memos_w_scheduler.py @@ -1,3 +1,10 @@ +# Prerequisites & Configuration +# To run this script, you must have the following services +# running and configured in your .env file (or environment variables): +# 1. Redis (Required for TaskStatusTracker and Scheduler Queue) +# 2. Graph Database (Required for Memory Storage) +# 3. Vector Database (Required if using Neo4j Community or Preference Memory) + import asyncio import json import os diff --git a/examples/mem_scheduler/redis_example.py b/examples/mem_scheduler/redis_example.py index 9f7ca4139..00989c424 100644 --- a/examples/mem_scheduler/redis_example.py +++ b/examples/mem_scheduler/redis_example.py @@ -1,3 +1,11 @@ +# Prerequisites: +# 1. Ensure a Redis server is running locally on the default port (6379). +# You can start it with: `redis-server` +# On macOS with Homebrew: `/opt/homebrew/bin/redis-server` or `brew services start redis` +# On Linux: `sudo service redis-server start` +# 2. If Redis is running on a different host/port, update the configuration or environment variables accordingly. + + import sys import time diff --git a/examples/mem_scheduler/run_async_tasks.py b/examples/mem_scheduler/run_async_tasks.py index 7f544c3da..fbb5a7bcc 100644 --- a/examples/mem_scheduler/run_async_tasks.py +++ b/examples/mem_scheduler/run_async_tasks.py @@ -1,3 +1,12 @@ +""" +# Prerequisites & Configuration +# To run this script, you must have the following services +# running and configured in your .env file (or environment variables): +# 1. Redis (Required for TaskStatusTracker and Scheduler Queue) +# 2. Graph Database (Required for Memory Storage) +# 3. Vector Database (Required if using Neo4j Community or Preference Memory) +""" + from pathlib import Path from time import sleep diff --git a/examples/mem_scheduler/show_redis_status.py b/examples/mem_scheduler/show_redis_status.py index d88e86655..94a915588 100644 --- a/examples/mem_scheduler/show_redis_status.py +++ b/examples/mem_scheduler/show_redis_status.py @@ -1,10 +1,25 @@ +""" +# Prerequisites: +# 1. Ensure a Redis server is running locally on the default port (6379). +# You can start it with: `redis-server` +# On macOS with Homebrew: `/opt/homebrew/bin/redis-server` or `brew services start redis` +# On Linux: `sudo service redis-server start` +# 2. If Redis is running on a different host/port, update the configuration or environment variables accordingly. +""" + import time -from memos.api.routers.server_router import mem_scheduler +from memos.mem_scheduler.task_schedule_modules.orchestrator import SchedulerOrchestrator from memos.mem_scheduler.task_schedule_modules.redis_queue import SchedulerRedisQueue -queue = mem_scheduler.memos_message_queue.memos_message_queue +# Explicitly initialize Redis queue for monitoring +queue = SchedulerRedisQueue( + max_len=None, + consumer_group="scheduler_group", + consumer_name="monitor_consumer", + orchestrator=SchedulerOrchestrator(), +) def fetch_status( diff --git a/src/memos/graph_dbs/neo4j.py b/src/memos/graph_dbs/neo4j.py index 8698b6f73..d0ae5a555 100644 --- a/src/memos/graph_dbs/neo4j.py +++ b/src/memos/graph_dbs/neo4j.py @@ -1705,7 +1705,7 @@ def _parse_node(self, node_data: dict[str, Any]) -> dict[str, Any]: node.pop("user_name", None) # serialization - if node["sources"]: + if node.get("sources"): for idx in range(len(node["sources"])): if not ( isinstance(node["sources"][idx], str) From 35d2ed6a9db4e49b1f9b3715ae511e3187dbfb62 Mon Sep 17 00:00:00 2001 From: CaralHsi Date: Mon, 19 Jan 2026 21:00:19 +0800 Subject: [PATCH 48/53] feat: delete useless example (#904) --- examples/api/product_api.py | 170 -------- examples/basic_modules/qdrant_vec_db.py | 143 ------- .../core_memories/textual_internet_memoy.py | 241 ----------- examples/mem_api/pipeline_test.py | 178 -------- examples/mem_chunk/markdown_chunk.py | 33 -- .../chat_w_generated_cube_explicit_memory.py | 180 -------- examples/mem_os/chat_w_scheduler.py | 74 ---- examples/mem_os/cot_usage_example.py | 342 --------------- examples/mem_os/easy_memos.py | 21 - .../mem_os/locomo_shared_database_memos.py | 203 --------- examples/mem_os/multi_user_memos_example.py | 162 ------- examples/mem_os/naive_memos.py | 30 -- examples/mem_os/persistent_memos_example.py | 192 --------- examples/mem_os/simple_memos.py | 42 -- examples/mem_os/simple_openapi_memos.py | 300 ------------- .../simple_openapi_memos_neo4j_community.py | 315 -------------- examples/mem_os/simple_prefs_memos_product.py | 399 ------------------ examples/mem_os/simple_treekvcache_memos.py | 46 -- examples/mem_os/simple_vllm_memos.py | 61 --- .../mem_user/user_manager_factory_example.py | 111 ----- 20 files changed, 3243 deletions(-) delete mode 100644 examples/api/product_api.py delete mode 100644 examples/basic_modules/qdrant_vec_db.py delete mode 100644 examples/core_memories/textual_internet_memoy.py delete mode 100644 examples/mem_api/pipeline_test.py delete mode 100644 examples/mem_chunk/markdown_chunk.py delete mode 100644 examples/mem_os/chat_w_generated_cube_explicit_memory.py delete mode 100644 examples/mem_os/chat_w_scheduler.py delete mode 100644 examples/mem_os/cot_usage_example.py delete mode 100644 examples/mem_os/easy_memos.py delete mode 100644 examples/mem_os/locomo_shared_database_memos.py delete mode 100644 examples/mem_os/multi_user_memos_example.py delete mode 100644 examples/mem_os/naive_memos.py delete mode 100644 examples/mem_os/persistent_memos_example.py delete mode 100644 examples/mem_os/simple_memos.py delete mode 100644 examples/mem_os/simple_openapi_memos.py delete mode 100644 examples/mem_os/simple_openapi_memos_neo4j_community.py delete mode 100644 examples/mem_os/simple_prefs_memos_product.py delete mode 100644 examples/mem_os/simple_treekvcache_memos.py delete mode 100644 examples/mem_os/simple_vllm_memos.py delete mode 100644 examples/mem_user/user_manager_factory_example.py diff --git a/examples/api/product_api.py b/examples/api/product_api.py deleted file mode 100644 index e364ce483..000000000 --- a/examples/api/product_api.py +++ /dev/null @@ -1,170 +0,0 @@ -#!/usr/bin/env python3 -""" -Simulate full MemOS Product API workflow: -1. Register user -2. Add memory -3. Search memory -4. Chat (stream) -""" - -import json - -import requests - - -BASE_URL = "http://0.0.0.0:8001/product" -HEADERS = {"Content-Type": "application/json"} - -index = "24" -USER_ID = f"memos_user_id_{index}" -USER_NAME = f"memos_user_alice_{index}" -MEM_CUBE_ID = f"memos_cube_id_{index}" -SESSION_ID = f"memos_session_id_{index}" -SESSION_ID2 = f"memos_session_id_{index}_s2" - - -def register_user(): - url = f"{BASE_URL}/users/register" - data = { - "user_id": USER_ID, - "user_name": USER_NAME, - "interests": "memory,retrieval,test", - "mem_cube_id": MEM_CUBE_ID, - } - print(f"[*] Registering user {USER_ID} ...") - resp = requests.post(url, headers=HEADERS, data=json.dumps(data), timeout=30) - print(resp.status_code, resp.text) - return resp.json() - - -def add_memory(): - url = f"{BASE_URL}/add" - data = { - "user_id": USER_ID, - "memory_content": "今天我在测试 MemOS 的记忆添加与检索流程。", - "messages": [{"role": "user", "content": "我今天在做系统测试"}], - "doc_path": None, - "mem_cube_id": MEM_CUBE_ID, - "source": "test_script", - "user_profile": False, - "session_id": SESSION_ID, - } - print("[*] Adding memory ...") - resp = requests.post(url, headers=HEADERS, data=json.dumps(data), timeout=30) - print(resp.status_code, resp.text) - return resp.json() - - -def search_memory(query="系统测试"): - url = f"{BASE_URL}/search" - data = { - "user_id": USER_ID, - "query": query, - "mem_cube_id": MEM_CUBE_ID, - "top_k": 5, - "session_id": SESSION_ID, - } - print("[*] Searching memory ...") - resp = requests.post(url, headers=HEADERS, data=json.dumps(data), timeout=30) - print(resp.status_code, resp.text) - return resp.json() - - -def chat_stream(query: str, session_id: str, history: list | None = None): - url = f"{BASE_URL}/chat" - data = { - "user_id": USER_ID, - "query": query, - "mem_cube_id": MEM_CUBE_ID, - "history": history, - "internet_search": False, - "moscube": False, - "session_id": session_id, - } - - print("[*] Starting streaming chat ...") - - with requests.post(url, headers=HEADERS, data=json.dumps(data), stream=True) as resp: - for raw_line in resp.iter_lines(): - if not raw_line: - continue - line = raw_line.decode("utf-8", errors="ignore") - - payload = line.removeprefix("data: ").strip() - if payload == "[DONE]": - print("[done]") - break - - try: - msg = json.loads(payload) - msg_type = msg.get("type") - msg_data = msg.get("data") or msg.get("content") - - if msg_type == "text": - print(msg_data, end="", flush=True) - elif msg_type == "reference": - print(f"\n[参考记忆] {msg_data}") - elif msg_type == "status": - pass - elif msg_type == "suggestion": - print(f"\n[建议] {msg_data}") - elif msg_type == "end": - print("\n[✅ Chat End]") - else: - print(f"\n[{msg_type}] {msg_data}") - except Exception: - try: - print(payload.encode("latin-1").decode("utf-8"), end="") - except Exception: - print(payload) - - -def feedback_memory(feedback_content: str, history: list | None = None): - url = f"{BASE_URL}/feedback" - data = { - "user_id": USER_ID, - "writable_cube_ids": [MEM_CUBE_ID], - "history": history, - "feedback_content": feedback_content, - "async_mode": "sync", - "corrected_answer": "false", - } - - print("[*] Feedbacking memory ...") - resp = requests.post(url, headers=HEADERS, data=json.dumps(data), timeout=30) - print(resp.status_code, resp.text) - return resp.json() - - -if __name__ == "__main__": - print("===== STEP 1: Register User =====") - register_user() - - print("\n===== STEP 2: Add Memory =====") - add_memory() - - print("\n===== STEP 3: Search Memory =====") - search_memory() - - print("\n===== STEP 4: Stream Chat =====") - chat_stream("我很开心,我今天吃了好吃的拉面", SESSION_ID, history=[]) - chat_stream( - "我刚和你说什么", - SESSION_ID, - history=[ - {"role": "user", "content": "我很开心,我今天吃了好吃的拉面"}, - {"role": "assistant", "content": "🉑"}, - ], - ) - - print("\n===== STEP 5: Stream Chat =====") - chat_stream("我刚和你说什么了呢", SESSION_ID2, history=[]) - - print("\n===== STEP 6: Feedback Memory =====") - feedback_memory( - feedback_content="错啦,我今天没有吃拉面", - history=[ - {"role": "user", "content": "我刚和你说什么了呢"}, - {"role": "assistant", "content": "你今天吃了好吃的拉面"}, - ], - ) diff --git a/examples/basic_modules/qdrant_vec_db.py b/examples/basic_modules/qdrant_vec_db.py deleted file mode 100644 index a16cd95ee..000000000 --- a/examples/basic_modules/qdrant_vec_db.py +++ /dev/null @@ -1,143 +0,0 @@ -import uuid - -from memos import settings -from memos.configs.vec_db import VectorDBConfigFactory -from memos.vec_dbs.factory import VecDBFactory - - -config = VectorDBConfigFactory.model_validate( - { - "backend": "qdrant", - "config": { - "collection_name": "test_collection", - "vector_dimension": 4, - "distance_metric": "cosine", - "path": str(settings.MEMOS_DIR / "qdrant"), - }, - } -) -vec_db = VecDBFactory.from_config(config) - -# ============== BATCH OPERATIONS ============== -print("\n" + "=" * 50) -print("BATCH DOCUMENT ADDITION") - -# Add batch data -batch_data = [ - { - "id": str(uuid.uuid4()), - "vector": [0.5, 0.6, 0.7, 0.8], - "payload": {"text": "Document A", "category": "type1"}, - }, - { - "id": str(uuid.uuid4()), - "vector": [0.4, 0.5, 0.6, 0.7], - "payload": {"text": "Document B", "category": "type2"}, - }, - { - "id": str(uuid.uuid4()), - "vector": [0.3, 0.4, 0.5, 0.6], - "payload": {"text": "Document C", "category": "type1"}, - }, -] -vec_db.add(batch_data) -print(f"✓ Added {len(batch_data)} documents") - -# ============== SEARCH OPERATIONS ============== -print("\n" + "=" * 50) -print("VECTOR SEARCH") - -# Search for similar items -query_vector = [5.0, 6.0, 7.0, 8.0] -results = vec_db.search(query_vector, top_k=2) -print(f"Query vector: {query_vector}") -print("\nResults:") -for i, result in enumerate(results, 1): - print(f" {i}. ID: {result.id}") - print(f" Score: {result.score}") - print(f" Payload: {result.payload}") - -# ============== COUNT OPERATIONS ============== -print("\n" + "=" * 50) -print("DOCUMENT COUNT") - -# Count documents in collection -count = vec_db.count() -print(f"Total documents in collection: {count}") - -# Count documents with filter -filtered_count = vec_db.count(filter={"category": "type1"}) -print(f"Documents with category 'type1': {filtered_count}") - -# ============== SINGLE DOCUMENT OPERATIONS ============== -print("\n" + "=" * 50) -print("DOCUMENT OPERATIONS") - -# Add a document -doc_id = str(uuid.uuid4()) -vec_db.add( - [ - { - "id": doc_id, - "vector": [0.1, 0.2, 0.3, 0.4], - "payload": {"text": "Original document", "status": "new"}, - } - ] -) -print(f"✓ Added document with ID: {doc_id}") - -# Update document payload -vec_db.update(doc_id, {"payload": {"text": "Updated document", "status": "updated"}}) -print(f"✓ Updated document payload for ID: {doc_id}") - -# Retrieve updated document -result = vec_db.get_by_id(doc_id) -print("\nRetrieved updated document:") -print(f" ID: {doc_id}") -print(f" Payload: {result.payload if result else 'Not found'}") - -# Delete the document -vec_db.delete([doc_id]) -print(f"\n✓ Deleted document with ID: {doc_id}") - -# Verify deletion -result = vec_db.get_by_id(doc_id) -print("\nDocument after deletion:") -print(f" Result: {'Not found' if result is None else result}") - -# ============== COLLECTION OPERATIONS ============== -print("\n" + "=" * 50) -print("COLLECTION OPERATIONS") - -# List all collections in the database -collections = vec_db.list_collections() -print(f"Available collections: {collections}") - -# ============== FILTER OPERATIONS ============== -print("\n" + "=" * 50) -print("FILTER OPERATIONS") - -# Get documents by filter criteria -filter_results = vec_db.get_by_filter({"category": "type1"}) -print("Documents filtered by category 'type1':") -for i, item in enumerate(filter_results, 1): - print(f" {i}. ID: {item.id}") - print(f" Payload: {item.payload}") - -# Get all documents in the collection -all_docs = vec_db.get_all() -print("\nAll documents in the collection:") -for i, item in enumerate(all_docs, 1): - print(f" {i}. ID: {item.id}") - print(f" Vector: {item.vector}") - print(f" Payload: {item.payload}") - -# ============== CLEANUP ============== -print("\n" + "=" * 50) -print("CLEANUP") - -# Delete the collection -vec_db.delete_collection("test_collection") -print("✓ Collection deleted") -print(f"Available collections after deletion: {vec_db.list_collections()}") -print("\n" + "=" * 50) diff --git a/examples/core_memories/textual_internet_memoy.py b/examples/core_memories/textual_internet_memoy.py deleted file mode 100644 index 21979e890..000000000 --- a/examples/core_memories/textual_internet_memoy.py +++ /dev/null @@ -1,241 +0,0 @@ -from memos import log -from memos.configs.embedder import EmbedderConfigFactory -from memos.configs.internet_retriever import InternetRetrieverConfigFactory -from memos.configs.mem_reader import SimpleStructMemReaderConfig -from memos.configs.memory import TreeTextMemoryConfig -from memos.embedders.factory import EmbedderFactory -from memos.mem_reader.simple_struct import SimpleStructMemReader -from memos.memories.textual.tree import TreeTextMemory - - -logger = log.get_logger(__name__) - - -embedder_config = EmbedderConfigFactory.model_validate( - { - "backend": "ollama", - "config": { - "model_name_or_path": "nomic-embed-text:latest", - }, - } -) -embedder = EmbedderFactory.from_config(embedder_config) - - -def embed_memory_item(memory: str) -> list[float]: - return embedder.embed([memory])[0] - - -# google or xinyu pelase change tree_config_with_internet api key or token or url -tree_config = TreeTextMemoryConfig.from_json_file("examples/data/config/tree_config.json") -interconfig = InternetRetrieverConfigFactory( - backend="xinyu", - config={ - "api_key": "google or xinyu token", - "search_engine_id": "google engine id or xinyu url", - "max_results": 15, - "num_per_request": 10, - }, -) -tree_config.internet_retriever = interconfig - -my_tree_textual_memory = TreeTextMemory(tree_config) -my_tree_textual_memory.delete_all() - -# Create a memory reader instance -reader_config = SimpleStructMemReaderConfig.from_json_file( - "examples/data/config/simple_struct_reader_config.json" -) -reader = SimpleStructMemReader(reader_config) - -scene_data = [ - [ - {"role": "user", "chat_time": "3 May 2025", "content": "I’m feeling a bit down today."}, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "I’m sorry to hear that. Do you want to talk about what’s been going on?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "It’s just been a tough couple of days, you know? Everything feels a bit overwhelming, and I just can’t seem to shake it off.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "It sounds like you're going through a lot right now. Sometimes it helps to talk things out. Is there something specific that's been weighing on you, or is it more of a general feeling?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "It’s a mix, I guess. Work’s been really stressful, and on top of that, I’ve been feeling kinda disconnected from the people around me.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "That can be really draining, especially when you’re feeling isolated on top of the stress. Do you think there’s something from your past that’s contributing to how you’re feeling now? Sometimes our emotions are tied to older experiences.", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "Yeah, now that you mention it… I’ve been thinking a lot about my childhood lately. I didn’t have the easiest upbringing. My parents were always busy, and I often felt like I had to figure things out on my own. I remember one winter, I got really sick with a high fever. My parents were both working, and I didn’t want to bother them. I just lay in bed, crying by myself, not knowing what to do.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "That must have been very lonely. Growing up without that support can really make you feel like you have to handle everything on your own. How do you think that experience has affected you now?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "Yeah, it was really lonely. I remember spending a lot of time doing things on my own, like drawing, because it was my only way to escape. I used to draw animals, and I created my own little world on paper. It was peaceful in a way, just me and my imagination, with no outside distractions.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "Drawing sounds like a beautiful way to express yourself and find some peace in that solitude. It must have been a very quiet and private world for you. Do you think that sense of loneliness from back then has shaped how you connect with others today?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "I think it has. I’ve always found it hard to let others in. I feel like I have to handle everything on my own. If I rely on someone else, I feel vulnerable, and I start to feel that loneliness again.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "It sounds like this was a protective mechanism that helped you cope with your feelings of loneliness back then. But as you’ve grown, it seems like this pattern might not be serving you as well anymore. Have you thought about trying to break this cycle, or finding new ways to connect with others?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "I’ve thought about it, though it’s hard. But I also know I can’t keep going like this forever. Maybe it’s time to seek some help.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "It’s a big step, but a positive one. Exploring your emotions and past experiences could really help you understand how they’ve shaped your present. Therapy could be a great place to start, as it would help you connect with both yourself and others. Would you be open to trying it?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "I’m open to trying. Thank you for encouraging me. It feels like it might be a good starting point for me.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "I’m really glad to hear that. Taking that first step is always difficult, but you’ve made an important decision. If you need help finding the right therapist, or just want to talk, I’m here for you.", - }, - ], - [ - { - "role": "user", - "chat_time": "3 May 2025", - "content": "This week I’ve been feeling a bit off, especially when playing tennis. My body just doesn’t feel right.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "It sounds like you've been having some physical discomfort lately. Where specifically are you feeling unwell? Is there something particular about tennis that's been difficult?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "I just feel a bit fatigued, and every time I play tennis, my movements feel off. I used to play pretty well, but lately, I’ve been feeling weak and my movements aren’t as coordinated as they used to be.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "Physical discomfort can definitely affect performance, especially in a sport like tennis that requires quick reactions and coordination. Have you noticed anything specific that might be causing these changes? Could it be overtraining, or is there another physical issue making you feel off?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "I think it might be due to stress and lack of sleep recently. I just feel drained all the time. Plus, I’ve been frustrated with my tennis performance, which makes me feel even worse, like I’m stuck in a vicious cycle.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "Stress and poor sleep quality can definitely affect your physical performance, especially in sports. When you’re also feeling down about your performance, it’s easy to fall into a negative cycle. Have you tried anything to relieve some of the stress, or to improve your sleep?", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "I’ve tried some relaxation techniques, like deep breathing and simple meditation, but it doesn’t seem to help much. I still can’t focus during tennis, and I feel like my mind is distracted by other things.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "Relaxation techniques like deep breathing and meditation can help reduce stress, but sometimes we need a more structured approach to improve both our physical and mental state. For example, you might want to focus on specific aspects of your tennis training, or adjust your rest and recovery time. Have you thought about setting smaller goals for yourself? Like focusing on a specific tennis move each day, rather than expecting perfection right away? That might help you gradually regain confidence.", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "That’s a good idea. I think I’ve been expecting too much from myself, which just makes me more anxious. Maybe I can start with small practice sessions and gradually find my rhythm again.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "Exactly! Setting small and clear goals will help reduce pressure and give you a sense of accomplishment. And don’t forget that rest is just as important—taking time to recover will help you feel better physically and mentally. Both physical and mental recovery are key to improving your performance and health.", - }, - { - "role": "user", - "chat_time": "3 May 2025", - "content": "Thanks, I feel like I need to rethink a few things. Maybe I really need to be kinder to myself and take things step by step.", - }, - { - "role": "assistant", - "chat_time": "3 May 2025", - "content": "You’re on the right track. Rethinking things and giving yourself space and patience is so important. You’ve already taken the first step, now just keep moving forward, one step at a time. If you need anything, I’m always here to help.", - }, - ], -] - -# Acquiring memories -memory = reader.get_memory(scene_data, type="chat", info={"user_id": "1234", "session_id": "2222"}) - -for m_list in memory: - my_tree_textual_memory.add(m_list) - -results = my_tree_textual_memory.search( - "Talk about the user's childhood story?", - top_k=10, - info={"query": "Talk about the user's childhood story?", "user_id": "111", "session": "2234"}, -) -for i, r in enumerate(results): - r = r.to_dict() - print(f"{i}'th similar result is: " + str(r["memory"])) -print(f"Successfully search {len(results)} memories") - -# find related nodes -related_nodes = my_tree_textual_memory.get_relevant_subgraph("Painting") - -# get current memory_size -print(f"Current Memory Size is {my_tree_textual_memory.get_current_memory_size()}") - -logger.info("Start doc search example...") -# Processing Documents -doc_paths = [ - "./text1.txt", - "./text2.txt", -] -# Acquiring memories from documents -doc_memory = reader.get_memory(doc_paths, "doc", info={"user_id": "1111", "session_id": "2222"}) - -for m_list in doc_memory: - my_tree_textual_memory.add(m_list) - -results = my_tree_textual_memory.search( - "Tell me about what memos consist of?", - top_k=30, - info={"query": "Tell me about what memos consist of?", "user_id": "111", "session": "2234"}, -) -for i, r in enumerate(results): - r = r.to_dict() - print(f"{i}'th similar result is: " + str(r["memory"])) -print(f"Successfully search {len(results)} memories") - - -# my_tree_textual_memory.dump -my_tree_textual_memory.dump("tmp/my_tree_textual_memory") -my_tree_textual_memory.drop() diff --git a/examples/mem_api/pipeline_test.py b/examples/mem_api/pipeline_test.py deleted file mode 100644 index cd7b3bee3..000000000 --- a/examples/mem_api/pipeline_test.py +++ /dev/null @@ -1,178 +0,0 @@ -""" -Pipeline test script for MemOS Server API functions. -This script directly tests add and search functionalities without going through the API layer. -If you want to start server_api set .env to MemOS/.env and run: -uvicorn memos.api.server_api:app --host 0.0.0.0 --port 8002 --workers 4 -""" - -from typing import Any - -from dotenv import load_dotenv - -# Import directly from server_router to reuse initialized components -from memos.api.routers.server_router import ( - _create_naive_mem_cube, - mem_reader, -) -from memos.log import get_logger - - -# Load environment variables -load_dotenv() - -logger = get_logger(__name__) - - -def test_add_memories( - messages: list[dict[str, str]], - user_id: str, - mem_cube_id: str, - session_id: str = "default_session", -) -> list[str]: - """ - Test adding memories to the system. - - Args: - messages: List of message dictionaries with 'role' and 'content' - user_id: User identifier - mem_cube_id: Memory cube identifier - session_id: Session identifier - - Returns: - List of memory IDs that were added - """ - logger.info(f"Testing add memories for user: {user_id}, mem_cube: {mem_cube_id}") - - # Create NaiveMemCube using server_router function - naive_mem_cube = _create_naive_mem_cube() - - # Extract memories from messages using server_router's mem_reader - memories = mem_reader.get_memory( - [messages], - type="chat", - info={ - "user_id": user_id, - "session_id": session_id, - }, - ) - - # Flatten memory list - flattened_memories = [mm for m in memories for mm in m] - - # Add memories to the system - mem_id_list: list[str] = naive_mem_cube.text_mem.add( - flattened_memories, - user_name=mem_cube_id, - ) - - logger.info(f"Added {len(mem_id_list)} memories: {mem_id_list}") - - # Print details of added memories - for memory_id, memory in zip(mem_id_list, flattened_memories, strict=False): - logger.info(f" - ID: {memory_id}") - logger.info(f" Memory: {memory.memory}") - logger.info(f" Type: {memory.metadata.memory_type}") - - return mem_id_list - - -def test_search_memories( - query: str, - user_id: str, - mem_cube_id: str, - session_id: str = "default_session", - top_k: int = 5, - mode: str = "fast", - internet_search: bool = False, - moscube: bool = False, - chat_history: list | None = None, -) -> list[Any]: - """ - Test searching memories from the system. - - Args: - query: Search query text - user_id: User identifier - mem_cube_id: Memory cube identifier - session_id: Session identifier - top_k: Number of top results to return - mode: Search mode - internet_search: Whether to enable internet search - moscube: Whether to enable moscube search - chat_history: Chat history for context - - Returns: - List of search results - """ - - # Create NaiveMemCube using server_router function - naive_mem_cube = _create_naive_mem_cube() - - # Prepare search filter - search_filter = {"session_id": session_id} if session_id != "default_session" else None - - search_results = naive_mem_cube.text_mem.search( - query=query, - user_name=mem_cube_id, - top_k=top_k, - mode=mode, - manual_close_internet=not internet_search, - moscube=moscube, - search_filter=search_filter, - info={ - "user_id": user_id, - "session_id": session_id, - "chat_history": chat_history or [], - }, - ) - - # Print search results - for idx, result in enumerate(search_results, 1): - logger.info(f"\n Result {idx}:") - logger.info(f" ID: {result.id}") - logger.info(f" Memory: {result.memory}") - logger.info(f" Score: {getattr(result, 'score', 'N/A')}") - logger.info(f" Type: {result.metadata.memory_type}") - - return search_results - - -def main(): - # Test parameters - user_id = "test_user_123" - mem_cube_id = "test_cube_123" - session_id = "test_session_001" - - test_messages = [ - {"role": "user", "content": "Where should I go for Christmas?"}, - { - "role": "assistant", - "content": "There are many places to visit during Christmas, such as the Bund and Disneyland in Shanghai.", - }, - {"role": "user", "content": "What about New Year's Eve?"}, - { - "role": "assistant", - "content": "For New Year's Eve, you could visit Times Square in New York or watch fireworks at the Sydney Opera House.", - }, - ] - - memory_ids = test_add_memories( - messages=test_messages, user_id=user_id, mem_cube_id=mem_cube_id, session_id=session_id - ) - - logger.info(f"\nSuccessfully added {len(memory_ids)} memories!") - - search_queries = [ - "How to enjoy Christmas?", - "Where to celebrate New Year?", - "What are good places to visit during holidays?", - ] - - for query in search_queries: - logger.info("\n" + "-" * 80) - results = test_search_memories(query=query, user_id=user_id, mem_cube_id=mem_cube_id) - print(f"Query: '{query}' returned {len(results)} results") - - -if __name__ == "__main__": - main() diff --git a/examples/mem_chunk/markdown_chunk.py b/examples/mem_chunk/markdown_chunk.py deleted file mode 100644 index ce7d2b9ae..000000000 --- a/examples/mem_chunk/markdown_chunk.py +++ /dev/null @@ -1,33 +0,0 @@ -from memos.chunkers import ChunkerFactory -from memos.configs.chunker import ChunkerConfigFactory - - -config = ChunkerConfigFactory.model_validate( - { - "backend": "markdown", - "config": { - "chunk_size": 1000, - "chunk_overlap": 100, - "recursive": True, - }, - } -) - -chunker = ChunkerFactory.from_config(config) - -text = """ -# Header 1 -This is the first sentence. This is the second sentence. -And here's a third one with some additional context. - -# Header 2 -This is the fourth sentence. This is the fifth sentence. -And here's a sixth one with some additional context. - -# Header 3 -This is the seventh sentence. This is the eighth sentence. -And here's a ninth one with some additional context. -""" -chunks = chunker.chunk(text) -for chunk in chunks: - print("doc:", chunk) diff --git a/examples/mem_os/chat_w_generated_cube_explicit_memory.py b/examples/mem_os/chat_w_generated_cube_explicit_memory.py deleted file mode 100644 index d19a68486..000000000 --- a/examples/mem_os/chat_w_generated_cube_explicit_memory.py +++ /dev/null @@ -1,180 +0,0 @@ -from memos.configs.mem_cube import GeneralMemCubeConfig -from memos.configs.mem_os import MOSConfig -from memos.mem_cube.general import GeneralMemCube -from memos.mem_os.main import MOS - - -# 1. Create Mos Config -config = { - "user_id": "user03alice", - "chat_model": { - "backend": "huggingface", - "config": { - "model_name_or_path": "Qwen/Qwen3-1.7B", - "temperature": 0.1, - "remove_think_prefix": True, - "max_tokens": 4096, - }, - }, - "mem_reader": { - "backend": "simple_struct", - "config": { - "llm": { - "backend": "ollama", - "config": { - "model_name_or_path": "qwen3:0.6b", - "temperature": 0.0, - "remove_think_prefix": True, - "max_tokens": 8192, - }, - }, - "embedder": { - "backend": "ollama", - "config": { - "model_name_or_path": "nomic-embed-text:latest", - }, - }, - "chunker": { - "backend": "sentence", - "config": { - "tokenizer_or_token_counter": "gpt2", - "chunk_size": 512, - "chunk_overlap": 128, - "min_sentences_per_chunk": 1, - }, - }, - }, - }, - "max_turns_window": 20, - "top_k": 5, - "enable_textual_memory": True, - "enable_activation_memory": False, - "enable_parametric_memory": False, -} - -mos_config = MOSConfig(**config) -mos = MOS(mos_config) - -# 2. Initialize_memory_cube -config = GeneralMemCubeConfig.model_validate( - { - "user_id": "user03alice", - "cube_id": "user03alice/mem_cube_tree", - "text_mem": { - "backend": "tree_text", - "config": { - "extractor_llm": { - "backend": "ollama", - "config": { - "model_name_or_path": "qwen3:1.7b", - "temperature": 0.0, - "remove_think_prefix": True, - "max_tokens": 8192, - }, - }, - "dispatcher_llm": { - "backend": "ollama", - "config": { - "model_name_or_path": "qwen3:1.7b", - "temperature": 0.0, - "remove_think_prefix": True, - "max_tokens": 8192, - }, - }, - "graph_db": { - "backend": "neo4j", - "config": { - "uri": "bolt://localhost:7687", - "user": "neo4j", - "password": "12345678", - "db_name": "user03alice11", - "auto_create": True, - }, - }, - "embedder": { - "backend": "ollama", - "config": { - "model_name_or_path": "nomic-embed-text:latest", - }, - }, - }, - }, - "act_mem": { - "backend": "kv_cache", - "config": { - "memory_filename": "activation_memory.pickle", - "extractor_llm": { - "backend": "huggingface", - "config": { - "model_name_or_path": "Qwen/Qwen3-1.7B", - "temperature": 0.8, - "max_tokens": 1024, - "top_p": 0.9, - "top_k": 50, - "add_generation_prompt": True, - "remove_think_prefix": False, - }, - }, - }, - }, - "para_mem": { - "backend": "lora", - "config": { - "memory_filename": "parametric_memory.adapter", - "extractor_llm": { - "backend": "huggingface", - "config": { - "model_name_or_path": "Qwen/Qwen3-1.7B", - "temperature": 0.8, - "max_tokens": 1024, - "top_p": 0.9, - "top_k": 50, - "add_generation_prompt": True, - "remove_think_prefix": False, - }, - }, - }, - }, - }, -) - -# 3. Initialize the MemCube with the configuration -mem_cube = GeneralMemCube(config) -try: - mem_cube.dump("/tmp/user03alice/mem_cube_5") -except Exception as e: - print(e) - -# 4. Register the MemCube explicitly -mos.register_mem_cube("/tmp/user03alice/mem_cube_5", "user03alice") - -# 5. add, get, search memory -mos.add(memory_content="I like playing football.") - -get_all_results = mos.get_all() -print(f"Get all results after add memory: {get_all_results}") - -# 6. add mesaages -messages = [ - {"role": "user", "content": "I like playing football."}, - {"role": "assistant", "content": "yes football is my favorite game."}, -] -mos.add(messages) -get_all_results = mos.get_all() -print(f"Get all results after add mesaages: {get_all_results}") - -# 6. add doc -mos.add(doc_path="./examples/data") -get_all_results = mos.get_all() -print(f"Get all results after add doc: {get_all_results}") - -search_results = mos.search(query="my favorite football game") -print(f"Search results: {search_results}") - -# .chat -while True: - user_input = input("👤 [You] ").strip() - print() - response = mos.chat(user_input) - print(f"🤖 [Assistant] {response}\n") -print("📢 [System] MemChat has stopped.") diff --git a/examples/mem_os/chat_w_scheduler.py b/examples/mem_os/chat_w_scheduler.py deleted file mode 100644 index 28c4c31a9..000000000 --- a/examples/mem_os/chat_w_scheduler.py +++ /dev/null @@ -1,74 +0,0 @@ -import shutil -import sys - -from pathlib import Path - -from memos.configs.mem_cube import GeneralMemCubeConfig -from memos.configs.mem_os import MOSConfig -from memos.configs.mem_scheduler import AuthConfig -from memos.mem_cube.general import GeneralMemCube -from memos.mem_os.main import MOS - - -FILE_PATH = Path(__file__).absolute() -BASE_DIR = FILE_PATH.parent.parent.parent -sys.path.insert(0, str(BASE_DIR)) # Enable execution from any working directory - - -# set configs -mos_config = MOSConfig.from_yaml_file( - f"{BASE_DIR}/examples/data/config/mem_scheduler/memos_config_w_scheduler.yaml" -) - -mem_cube_config = GeneralMemCubeConfig.from_yaml_file( - f"{BASE_DIR}/examples/data/config/mem_scheduler/mem_cube_config_neo4j.yaml" -) - -# default local graphdb uri -if AuthConfig.default_config_exists(): - auth_config = AuthConfig.from_local_config() - - mos_config.mem_reader.config.llm.config.api_key = auth_config.openai.api_key - mos_config.mem_reader.config.llm.config.api_base = auth_config.openai.base_url - - mem_cube_config.text_mem.config.graph_db.config.uri = auth_config.graph_db.uri - mem_cube_config.text_mem.config.graph_db.config.user = auth_config.graph_db.user - mem_cube_config.text_mem.config.graph_db.config.password = auth_config.graph_db.password - mem_cube_config.text_mem.config.graph_db.config.db_name = auth_config.graph_db.db_name - mem_cube_config.text_mem.config.graph_db.config.auto_create = auth_config.graph_db.auto_create - -# Initialization -mos = MOS(mos_config) - -user_id = "user_1" -mos.create_user(user_id) - -mem_cube_id = "mem_cube_5" -mem_cube_name_or_path = f"{BASE_DIR}/outputs/mem_scheduler/{user_id}/{mem_cube_id}" - -if Path(mem_cube_name_or_path).exists(): - shutil.rmtree(mem_cube_name_or_path) - print(f"{mem_cube_name_or_path} is not empty, and has been removed.") - -mem_cube = GeneralMemCube(mem_cube_config) -mem_cube.dump(mem_cube_name_or_path) -mos.register_mem_cube( - mem_cube_name_or_path=mem_cube_name_or_path, mem_cube_id=mem_cube_id, user_id=user_id -) - -messages = [ - {"role": "user", "content": "I like playing football."}, - {"role": "assistant", "content": "I like playing football too."}, -] -mos.add(messages, user_id=user_id, mem_cube_id=mem_cube_id) - - -while True: - user_input = input("👤 [You] ").strip() - print() - response = mos.chat(user_input, user_id=user_id) - retrieved_memories = mos.get_all(mem_cube_id=mem_cube_id, user_id=user_id) - print(f"🤖 [Assistant] {response}\n") - for node in retrieved_memories["text_mem"][0]["memories"]["nodes"]: - if node["metadata"]["memory_type"] == "WorkingMemory": - print(f"🤖 [Assistant]working mem : {node['memory']}\n") diff --git a/examples/mem_os/cot_usage_example.py b/examples/mem_os/cot_usage_example.py deleted file mode 100644 index e3d10fa75..000000000 --- a/examples/mem_os/cot_usage_example.py +++ /dev/null @@ -1,342 +0,0 @@ -#!/usr/bin/env python3 -""" -MemOS CoT (Chain of Thought) Usage Example -This example demonstrates how to use CoT functionality with tree textual memory. -It shows how to: -1. Decompose complex questions into sub-questions -2. Get answers for sub-questions using tree_textual_memory -3. Use JSON configuration files with environment variable overrides -""" - -import json -import os - -# Load environment variables -from dotenv import load_dotenv - -from memos.configs.llm import LLMConfigFactory -from memos.configs.mem_reader import SimpleStructMemReaderConfig -from memos.configs.memory import TreeTextMemoryConfig -from memos.mem_os.main import MOS -from memos.mem_reader.simple_struct import SimpleStructMemReader -from memos.memories.textual.tree import TreeTextMemory - - -load_dotenv() - - -def load_and_modify_config(config_path: str) -> dict: - """Load JSON config and modify it with environment variables.""" - with open(config_path) as f: - config = json.load(f) - - # Get environment variables - openai_api_key = os.getenv("OPENAI_API_KEY") - openai_base_url = os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1") - - # Modify config to use ollama for embedder and gpt-4o-mini for LLMs - if "embedder" in config: - config["embedder"] = { - "backend": "ollama", - "config": {"model_name_or_path": "nomic-embed-text:latest"}, - } - - # Modify LLM configs to use gpt-4o-mini - if "llm" in config: - config["llm"] = { - "backend": "openai", - "config": { - "model_name_or_path": "gpt-4o-mini", - "api_key": openai_api_key, - "api_base": openai_base_url, - "temperature": 0.5, - "remove_think_prefix": True, - "max_tokens": 8192, - }, - } - - if "extractor_llm" in config: - config["extractor_llm"] = { - "backend": "openai", - "config": { - "model_name_or_path": "gpt-4o-mini", - "api_key": openai_api_key, - "api_base": openai_base_url, - "temperature": 0.5, - "remove_think_prefix": True, - "max_tokens": 8192, - }, - } - - if "dispatcher_llm" in config: - config["dispatcher_llm"] = { - "backend": "openai", - "config": { - "model_name_or_path": "gpt-4o-mini", - "api_key": openai_api_key, - "api_base": openai_base_url, - "temperature": 0.5, - "remove_think_prefix": True, - "max_tokens": 8192, - }, - } - - # Modify graph_db config if present - if "graph_db" in config: - neo4j_uri = os.getenv("NEO4J_URI", "bolt://localhost:7687") - neo4j_user = os.getenv("NEO4J_USER", "neo4j") - neo4j_password = os.getenv("NEO4J_PASSWORD", "12345678") - - config["graph_db"] = { - "backend": "neo4j", - "config": { - "uri": neo4j_uri, - "user": neo4j_user, - "password": neo4j_password, - "db_name": "testlcy", - "auto_create": True, - "embedding_dimension": 768, - }, - } - - return config - - -def setup_llm_config(): - """Setup LLM configuration for CoT operations.""" - # Get environment variables - openai_api_key = os.getenv("OPENAI_API_KEY") - openai_base_url = os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1") - # Use ollama with gpt-4o-mini model - return LLMConfigFactory( - backend="openai", - config={ - "model_name_or_path": "gpt-4o-mini", - "api_key": openai_api_key, - "api_base": openai_base_url, - "temperature": 0.5, - "remove_think_prefix": True, - "max_tokens": 8192, - }, - ) - - -def create_tree_memory(): - """Create a tree textual memory with sample data.""" - print("Creating tree textual memory...") - - # Load and modify configurations - tree_config_dict = load_and_modify_config("examples/data/config/tree_config.json") - reader_config_dict = load_and_modify_config( - "examples/data/config/simple_struct_reader_config.json" - ) - - # Create config objects - tree_config = TreeTextMemoryConfig.model_validate(tree_config_dict) - reader_config = SimpleStructMemReaderConfig.model_validate(reader_config_dict) - - # Create tree memory - tree_memory = TreeTextMemory(tree_config) - tree_memory.delete_all() # Clear existing data - - # Create memory reader - reader = SimpleStructMemReader(reader_config) - - # Sample conversation data - sample_conversations = [ - [ - {"role": "user", "content": "Tell me about China and its capital."}, - { - "role": "assistant", - "content": "China is a country in East Asia. Beijing is its capital city.", - }, - {"role": "user", "content": "Who is Lang Ping?"}, - { - "role": "assistant", - "content": "Lang Ping is a famous Chinese volleyball coach and former player.", - }, - {"role": "user", "content": "What about Madagascar?"}, - { - "role": "assistant", - "content": "Madagascar is an island country in the Indian Ocean. It's known for its unique wildlife.", - }, - {"role": "user", "content": "Tell me about trade between China and Madagascar."}, - { - "role": "assistant", - "content": "China and Madagascar have developed trade relations, particularly in agriculture and mining.", - }, - {"role": "user", "content": "What about the essential oil industry in Madagascar?"}, - { - "role": "assistant", - "content": "The essential oil industry is growing in Madagascar, especially on Nosy Be Island where vanilla and ylang-ylang are produced.", - }, - ] - ] - - # Acquire memories using the reader - memories = reader.get_memory( - sample_conversations, type="chat", info={"user_id": "cot_user", "session_id": "cot_session"} - ) - - # Add memories to tree structure - for memory_list in memories: - tree_memory.add(memory_list) - - print("✓ Added sample conversations to tree memory") - return tree_memory - - -def cot_decompose(): - """Test the cot_decompose functionality.""" - print("\n=== Testing CoT Decomposition ===") - - # Setup LLM config - llm_config = setup_llm_config() - - # Test questions - test_questions = [ - "Who is the current head coach of the gymnastics team in the capital of the country that Lang Ping represents?", - "What is the weather like today?", - "How did the trade relationship between Madagascar and China develop, and how does this relationship affect the market expansion of the essential oil industry on Nosy Be Island?", - ] - - for i, question in enumerate(test_questions, 1): - print(f"\nTest {i}: {question}") - result = MOS.cot_decompose(question, llm_config) - print(f"✓ Decomposition result: {result}") - - if result.get("is_complex", False): - sub_questions = result.get("sub_questions", []) - print(f"✓ Found {len(sub_questions)} sub-questions:") - for j, sub_q in enumerate(sub_questions, 1): - print(f" {j}. {sub_q}") - else: - print("✓ Question is not complex, no decomposition needed.") - - return llm_config - - -def get_sub_answers_with_tree_memory(): - """Test get_sub_answers with tree textual memory.""" - print("\n=== Testing get_sub_answers with Tree Textual Memory ===") - - # Setup - llm_config = setup_llm_config() - tree_memory = create_tree_memory() - - # Test sub-questions - sub_questions = [ - "Which country does Lang Ping represent in volleyball?", - "What is the capital of this country?", - "Who is the current head coach of the gymnastics team in this capital?", - ] - - print("Sub-questions to answer:") - for i, q in enumerate(sub_questions, 1): - print(f" {i}. {q}") - print("\nGenerating answers using tree memory and LLM...") - sub_questions, sub_answers = MOS.get_sub_answers( - sub_questions=sub_questions, search_engine=tree_memory, llm_config=llm_config, top_k=3 - ) - - print("✓ Generated answers:") - for i, (question, answer) in enumerate(zip(sub_questions, sub_answers, strict=False), 1): - print(f"\n Sub-question {i}: {question}") - print(f" Answer: {answer}") - - -def complete_cot_workflow(): - """Test the complete CoT workflow from decomposition to final synthesis.""" - print("\n=== Testing Complete CoT Workflow ===") - - # Setup - llm_config = setup_llm_config() - tree_memory = create_tree_memory() - - # Complex question - complex_question = "How did the trade relationship between Madagascar and China develop, and how does this relationship affect the market expansion of the essential oil industry on Nosy Be Island?" - - print(f"Original question: {complex_question}") - - try: - # Step 1: Decompose the question - print("\n1. Decomposing question...") - decomposition_result = MOS.cot_decompose(complex_question, llm_config) - print(f"✓ Decomposition result: {decomposition_result}") - - if not decomposition_result.get("is_complex", False): - print("Question is not complex, no decomposition needed.") - return - - sub_questions = decomposition_result.get("sub_questions", []) - print(f"✓ Found {len(sub_questions)} sub-questions:") - for i, q in enumerate(sub_questions, 1): - print(f" {i}. {q}") - - # Step 2: Get answers for sub-questions - print("\n2. Getting answers for sub-questions...") - sub_questions, sub_answers = MOS.get_sub_answers( - sub_questions=sub_questions, search_engine=tree_memory, llm_config=llm_config, top_k=3 - ) - - print("✓ Generated answers:") - for i, (question, answer) in enumerate(zip(sub_questions, sub_answers, strict=False), 1): - print(f"\n Sub-question {i}: {question}") - print(f" Answer: {answer}") - - # Step 3: Generate final synthesis - print("\n3. Generating final synthesis...") - # Build the sub-questions and answers text - qa_text = "" - for i, (question, answer) in enumerate(zip(sub_questions, sub_answers, strict=False), 1): - qa_text += f"Q{i}: {question}\nA{i}: {answer}\n\n" - - synthesis_prompt = f"""You are an expert at synthesizing information from multiple sources to provide comprehensive answers. - -Sub-questions and their answers: -{qa_text} -Please synthesize these answers into a comprehensive response that: -1. Addresses the original question completely -2. Integrates information from all sub-questions -3. Provides clear reasoning and connections -4. Is well-structured and easy to understand - -Original question: {complex_question} - -Your response:""" - - # Generate final answer - from memos.llms.factory import LLMFactory - - llm = LLMFactory.from_config(llm_config) - messages = [ - { - "role": "system", - "content": "You are a helpful assistant that synthesizes information from multiple sources.", - }, - {"role": "user", "content": synthesis_prompt}, - ] - - final_answer = llm.generate(messages) - print(f"\n✓ Final synthesized answer:\n{final_answer}") - - except Exception as e: - print(f"✗ Error in complete workflow: {e}") - - -def main(): - """Main function to run the CoT example.""" - print("MemOS CoT (Chain of Thought) Usage Example") - print("=" * 60) - - # Run the examples - cot_decompose() - get_sub_answers_with_tree_memory() - complete_cot_workflow() - - print("\n" + "=" * 60) - print("✓ All examples completed successfully!") - - -if __name__ == "__main__": - main() diff --git a/examples/mem_os/easy_memos.py b/examples/mem_os/easy_memos.py deleted file mode 100644 index a2e8014ed..000000000 --- a/examples/mem_os/easy_memos.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python3 -""" -Simple test script for MOS.simple() functionality. -""" - -import os - -from memos.mem_os.main import MOS - - -# Set environment variables for testing -os.environ["OPENAI_API_BASE"] = "http://xxxxxxxxx" -os.environ["OPENAI_API_KEY"] = "sk-xxxxxxxxxx" -os.environ["MOS_TEXT_MEM_TYPE"] = "general_text" # "tree_text" need set neo4j - - -memory = MOS.simple() -print("MOS.simple() works!") -memory.add(memory_content="my favorite color is blue") -print(memory.chat("what is my favorite color?")) -# Your favorite color is blue! diff --git a/examples/mem_os/locomo_shared_database_memos.py b/examples/mem_os/locomo_shared_database_memos.py deleted file mode 100644 index 97efe1fe6..000000000 --- a/examples/mem_os/locomo_shared_database_memos.py +++ /dev/null @@ -1,203 +0,0 @@ -import json -import os - -from dotenv import load_dotenv - -from memos import log -from memos.configs.mem_cube import GeneralMemCubeConfig -from memos.configs.mem_os import MOSConfig -from memos.mem_cube.general import GeneralMemCube -from memos.mem_os.product import MOSProduct - - -load_dotenv() - - -logger = log.get_logger(__name__) - - -# === Load conversation === -with open("evaluation/data/locomo/locomo10.json", encoding="utf-8") as f: - conversation = json.load(f) - data = conversation[3] - speaker_a = data["conversation"]["speaker_a"] - speaker_b = data["conversation"]["speaker_b"] - conversation_i = data["conversation"] - -db_name = "shared-db-locomo-case" - -openapi_config = { - "model_name_or_path": "gpt-4o-mini", - "temperature": 0.8, - "max_tokens": 1024, - "api_key": "your-api-key-here", - "api_base": "https://api.openai.com/v1", -} - - -# === Create MOS Config === -def get_user_configs(user_name): - mos_config = MOSConfig( - user_id=user_name, - chat_model={"backend": "openai", "config": openapi_config}, - mem_reader={ - "backend": "simple_struct", - "config": { - "llm": {"backend": "openai", "config": openapi_config}, - "embedder": { - "backend": "universal_api", - "config": { - "provider": "openai", - "api_key": openapi_config["api_key"], - "model_name_or_path": "text-embedding-3-large", - "base_url": openapi_config["api_base"], - }, - }, - "chunker": { - "backend": "sentence", - "config": { - "tokenizer_or_token_counter": "gpt2", - "chunk_size": 512, - "chunk_overlap": 128, - "min_sentences_per_chunk": 1, - }, - }, - }, - }, - enable_textual_memory=True, - enable_activation_memory=False, - enable_parametric_memory=False, - top_k=5, - max_turns_window=20, - ) - - return mos_config - - -# === Get Memory Cube Config === -def get_mem_cube_config(user_name): - neo4j_uri = os.getenv("NEO4J_URI", "bolt://localhost:7687") - neo4j_config = { - "uri": neo4j_uri, - "user": "neo4j", - "password": "12345678", - "db_name": db_name, - "user_name": "will be updated", - "use_multi_db": False, - "embedding_dimension": 3072, - "auto_create": True, - } - cube_config = GeneralMemCubeConfig.model_validate( - { - "user_id": user_name, - "cube_id": f"{user_name}_cube", - "text_mem": { - "backend": "tree_text", - "config": { - "extractor_llm": {"backend": "openai", "config": openapi_config}, - "dispatcher_llm": {"backend": "openai", "config": openapi_config}, - "graph_db": {"backend": "neo4j", "config": neo4j_config}, - "embedder": { - "backend": "universal_api", - "config": { - "provider": "openai", - "api_key": openapi_config["api_key"], - "model_name_or_path": "text-embedding-3-large", - "base_url": openapi_config["api_base"], - }, - }, - "reorganize": True, - }, - }, - } - ) - - mem_cube = GeneralMemCube(cube_config) - return mem_cube - - -# === Initialize MOSProduct === -root_config = get_user_configs(user_name="system") -mos_product = MOSProduct(default_config=root_config) - - -# === Register both users === -users = {} -for speaker in [speaker_a, speaker_b]: - user_id = speaker.lower() + "_test" - config = get_user_configs(user_id) - mem_cube = get_mem_cube_config(user_id) - result = mos_product.user_register( - user_id=user_id, - user_name=speaker, - interests=f"I'm {speaker}", - default_mem_cube=mem_cube, - ) - users[speaker] = {"user_id": user_id, "default_cube_id": result["default_cube_id"]} - print(f"✅ Registered: {speaker} -> {result}") - -# === Process conversation, add to both roles === -i = 1 -MAX_CONVERSATION_FOR_TEST = 3 -while ( - f"session_{i}_date_time" in conversation_i and f"session_{i}" in conversation_i -) and i < MAX_CONVERSATION_FOR_TEST: - session_i = conversation_i[f"session_{i}"] - session_time = conversation_i[f"session_{i}_date_time"] - - print(f"\n=== Processing Session {i} | Time: {session_time} ===") - - role1_msgs, role2_msgs = [], [] - - for m in session_i: - if m["speaker"] == speaker_a: - role1_msgs.append( - { - "role": "user", - "content": f"{m['speaker']}:{m['text']}", - "chat_time": session_time, - } - ) - role2_msgs.append( - { - "role": "assistant", - "content": f"{m['speaker']}:{m['text']}", - "chat_time": session_time, - } - ) - elif m["speaker"] == speaker_b: - role1_msgs.append( - { - "role": "assistant", - "content": f"{m['speaker']}:{m['text']}", - "chat_time": session_time, - } - ) - role2_msgs.append( - { - "role": "user", - "content": f"{m['speaker']}:{m['text']}", - "chat_time": session_time, - } - ) - - print(f"\n[Session {i}] {speaker_a} will add {len(role1_msgs)} messages.") - print(f"[Session {i}] {speaker_b} will add {len(role2_msgs)} messages.") - - mos_product.add( - user_id=users[speaker_a]["user_id"], - messages=role1_msgs, - mem_cube_id=users[speaker_a]["default_cube_id"], - ) - mos_product.add( - user_id=users[speaker_b]["user_id"], - messages=role2_msgs, - mem_cube_id=users[speaker_b]["default_cube_id"], - ) - - print(f"[Session {i}] Added messages for both roles") - - i += 1 - -print("\n✅ All messages added for both roles.\n") -mos_product.mem_reorganizer_off() diff --git a/examples/mem_os/multi_user_memos_example.py b/examples/mem_os/multi_user_memos_example.py deleted file mode 100644 index ac7e68610..000000000 --- a/examples/mem_os/multi_user_memos_example.py +++ /dev/null @@ -1,162 +0,0 @@ -""" -Example demonstrating how to use MOSProduct for multi-user scenarios. -""" - -import os - -from memos.configs.mem_cube import GeneralMemCubeConfig -from memos.configs.mem_os import MOSConfig -from memos.mem_cube.general import GeneralMemCube -from memos.mem_os.product import MOSProduct - - -def get_config(user_name): - openapi_config = { - "model_name_or_path": "gpt-4o-mini", - "temperature": 0.8, - "max_tokens": 1024, - "top_p": 0.9, - "top_k": 50, - "remove_think_prefix": True, - "api_key": os.getenv("OPENAI_API_KEY"), - "api_base": os.getenv("OPENAI_API_BASE"), - } - # Create a default configuration - default_config = MOSConfig( - user_id="root", - chat_model={"backend": "openai", "config": openapi_config}, - mem_reader={ - "backend": "simple_struct", - "config": { - "llm": { - "backend": "openai", - "config": openapi_config, - }, - "embedder": { - "backend": "universal_api", - "config": { - "provider": os.getenv("MOS_EMBEDDER_PROVIDER", "openai"), - "api_key": os.getenv("MOS_EMBEDDER_API_KEY", "sk-xxxx"), - "model_name_or_path": os.getenv( - "MOS_EMBEDDER_MODEL", "text-embedding-3-large" - ), - "base_url": os.getenv("MOS_EMBEDDER_API_BASE", "http://openai.com"), - }, - }, - "chunker": { - "backend": "sentence", - "config": { - "tokenizer_or_token_counter": "gpt2", - "chunk_size": 512, - "chunk_overlap": 128, - "min_sentences_per_chunk": 1, - }, - }, - }, - }, - user_manager={ - "backend": "mysql", - "config": { - "host": os.getenv("MYSQL_HOST", "localhost"), - "port": int(os.getenv("MYSQL_PORT", "3306")), - "username": os.getenv("MYSQL_USERNAME", "root"), - "password": os.getenv("MYSQL_PASSWORD", "12345678"), - "database": os.getenv("MYSQL_DATABASE", "memos_users"), - "charset": os.getenv("MYSQL_CHARSET", "utf8mb4"), - }, - }, - enable_textual_memory=True, - enable_activation_memory=False, - top_k=5, - max_turns_window=20, - ) - default_cube_config = GeneralMemCubeConfig.model_validate( - { - "user_id": user_name, - "cube_id": f"{user_name}_default_cube", - "text_mem": { - "backend": "tree_text", - "config": { - "extractor_llm": {"backend": "openai", "config": openapi_config}, - "dispatcher_llm": {"backend": "openai", "config": openapi_config}, - "graph_db": { - "backend": "neo4j", - "config": { - "uri": os.getenv("NEO4J_URI", "bolt://localhost:7687"), - "user": os.getenv("NEO4J_USER", "neo4j"), - "password": os.getenv("NEO4J_PASSWORD", "12345678"), - "db_name": os.getenv( - "NEO4J_DB_NAME", "shared-tree-textual-memory-test" - ), - "user_name": f"memos{user_name.replace('-', '')}", - "embedding_dimension": int(os.getenv("EMBEDDING_DIMENSION", 768)), - "use_multi_db": False, - "auto_create": True, - }, - }, - "embedder": { - "backend": "universal_api", - "config": { - "provider": os.getenv("MOS_EMBEDDER_PROVIDER", "openai"), - "api_key": os.getenv("MOS_EMBEDDER_API_KEY", "sk-xxxx"), - "model_name_or_path": os.getenv( - "MOS_EMBEDDER_MODEL", "text-embedding-3-large" - ), - "base_url": os.getenv("MOS_EMBEDDER_API_BASE", "http://openai.com"), - }, - }, - }, - }, - "act_mem": {}, - "para_mem": {}, - } - ) - default_mem_cube = GeneralMemCube(default_cube_config) - return default_config, default_mem_cube - - -def main(): - default_config, default_mem_cube = get_config(user_name="alice") - # Initialize MOSProduct with default config - mos_product = MOSProduct(default_config=default_config) - - # Register first user with default config - result1 = mos_product.user_register( - user_id="alice", - user_name="alice", - interests="I'm interested in machine learning and AI research.", - default_mem_cube=default_mem_cube, - ) - print(f"User registration result: {result1}") - - # Chat with Alice - print("\n=== Chatting with Alice ===") - for response_chunk in mos_product.chat(query="What are my interests?", user_id="alice"): - print(response_chunk, end="") - - # Add memory for Alice - mos_product.add( - user_id="alice", - memory_content="I attended a machine learning conference last week.", - mem_cube_id=result1["default_cube_id"], - ) - - # Search memories for Alice - search_result = mos_product.search(query="conference", user_id="alice") - print(f"\nSearch result for Alice: {search_result}") - - # Search memories for Alice - search_result = mos_product.get_all(user_id="alice", memory_type="text_mem") - print(f"\nSearch result for Alice: {search_result}") - - # List all users - users = mos_product.list_users() - print(f"\nAll registered users: {users}") - - # Get user info - alice_info = mos_product.get_user_info("alice") - print(f"\nAlice's info: {alice_info}") - - -if __name__ == "__main__": - main() diff --git a/examples/mem_os/naive_memos.py b/examples/mem_os/naive_memos.py deleted file mode 100644 index 5d0039bb9..000000000 --- a/examples/mem_os/naive_memos.py +++ /dev/null @@ -1,30 +0,0 @@ -import uuid - -from memos.configs.mem_os import MOSConfig -from memos.mem_os.main import MOS - - -# init MOS -mos_config = MOSConfig.from_json_file("examples/data/config/simple_memos_config.json") -memory = MOS(mos_config) - -# create user -user_id = str(uuid.uuid4()) -memory.create_user(user_id=user_id) - -# register cube for user -memory.register_mem_cube("examples/data/mem_cube_2", user_id=user_id) - -# add memory for user -memory.add( - messages=[ - {"role": "user", "content": "I like playing football."}, - {"role": "assistant", "content": "I like playing football too."}, - ], - user_id=user_id, -) - -# Later, when you want to retrieve memory for user -retrieved_memories = memory.search(query="What do you like?", user_id=user_id) -# output text_memories: I like playing football, act_memories, para_memories -print(f"text_memories: {retrieved_memories['text_mem']}") diff --git a/examples/mem_os/persistent_memos_example.py b/examples/mem_os/persistent_memos_example.py deleted file mode 100644 index 16353be6a..000000000 --- a/examples/mem_os/persistent_memos_example.py +++ /dev/null @@ -1,192 +0,0 @@ -""" -Example demonstrating persistent user management in MemOS. - -This example shows how to use the PersistentUserManager to maintain -user configurations across service restarts. -""" - -import os -import tempfile - -from memos.configs.mem_os import MOSConfig -from memos.mem_os.product import MOSProduct -from memos.mem_user.persistent_user_manager import PersistentUserManager, UserRole - - -def create_sample_config(user_id: str) -> MOSConfig: - """Create a sample configuration for a user.""" - return MOSConfig( - user_id=user_id, - chat_model={ - "backend": "openai", - "config": { - "model_name_or_path": "gpt-3.5-turbo", - "api_key": "your-api-key-here", - "temperature": 0.7, - }, - }, - mem_reader={ - "backend": "naive", - "config": { - "llm": { - "backend": "openai", - "config": { - "model_name_or_path": "gpt-3.5-turbo", - "api_key": "your-api-key-here", - }, - }, - "embedder": { - "backend": "ollama", - "config": { - "model_name_or_path": "nomic-embed-text:latest", - }, - }, - }, - }, - enable_textual_memory=True, - enable_activation_memory=False, - top_k=5, - max_turns_window=20, - ) - - -def demonstrate_persistence(): - """Demonstrate the persistence functionality.""" - print("=== MemOS Persistent User Management Demo ===\n") - - # Create a temporary database for this demo - temp_dir = tempfile.mkdtemp() - db_path = os.path.join(temp_dir, "demo_memos.db") - - try: - # Step 1: Create a persistent user manager - print("1. Creating PersistentUserManager...") - user_manager = PersistentUserManager(db_path=db_path) - print(f" Database created at: {db_path}") - - # Step 2: Create some sample configurations - print("\n2. Creating sample user configurations...") - user_configs = {} - for i in range(3): - user_id = f"user_{i + 1}" - user_name = f"User {i + 1}" - config = create_sample_config(user_id) - user_configs[user_id] = config - - # Create user with configuration - created_id = user_manager.create_user_with_config( - user_name, config, UserRole.USER, user_id - ) - print(f" Created user: {user_name} (ID: {created_id})") - - # Step 3: Verify configurations are saved - print("\n3. Verifying configurations are saved...") - for user_id in user_configs: - config = user_manager.get_user_config(user_id) - if config: - print(f" ✓ Configuration found for {user_id}") - print(f" - Textual memory enabled: {config.enable_textual_memory}") - print(f" - Top-k: {config.top_k}") - else: - print(f" ✗ Configuration not found for {user_id}") - - # Step 4: Simulate service restart by creating a new manager instance - print("\n4. Simulating service restart...") - print(" Creating new PersistentUserManager instance...") - new_user_manager = PersistentUserManager(db_path=db_path) - - # Step 5: Verify configurations are restored - print("\n5. Verifying configurations are restored after restart...") - for user_id in user_configs: - config = new_user_manager.get_user_config(user_id) - if config: - print(f" ✓ Configuration restored for {user_id}") - else: - print(f" ✗ Configuration not restored for {user_id}") - - # Step 6: Create MOSProduct and demonstrate restoration - print("\n6. Creating MOSProduct with persistent user manager...") - default_config = create_sample_config("default_user") - mos_product = MOSProduct(default_config=default_config) - - # The MOSProduct should automatically restore user instances - print(f" Active user instances: {len(mos_product.user_instances)}") - for user_id in mos_product.user_instances: - print(f" - {user_id}") - - # Step 7: Demonstrate configuration update - print("\n7. Demonstrating configuration update...") - user_id = "user_1" - original_config = user_manager.get_user_config(user_id) - if original_config: - # Update configuration - updated_config = original_config.model_copy(deep=True) - updated_config.top_k = 10 - updated_config.enable_activation_memory = True - - success = user_manager.save_user_config(user_id, updated_config) - if success: - print(f" ✓ Updated configuration for {user_id}") - print(f" - New top-k: {updated_config.top_k}") - print(f" - Activation memory: {updated_config.enable_activation_memory}") - else: - print(f" ✗ Failed to update configuration for {user_id}") - - # Step 8: List all configurations - print("\n8. Listing all user configurations...") - all_configs = user_manager.list_user_configs() - print(f" Total configurations: {len(all_configs)}") - for user_id, config in all_configs.items(): - print( - f" - {user_id}: top_k={config.top_k}, textual_memory={config.enable_textual_memory}" - ) - - print("\n=== Demo completed successfully! ===") - print(f"Database file: {db_path}") - print("You can inspect this file to see the persistent data.") - - except Exception as e: - print(f"Error during demo: {e}") - raise - finally: - # Cleanup - if os.path.exists(db_path): - os.remove(db_path) - if os.path.exists(temp_dir): - os.rmdir(temp_dir) - - -def demonstrate_api_usage(): - """Demonstrate how the API would work with persistence.""" - print("\n=== API Usage Example ===") - print(""" - With the new persistent system, your API calls would work like this: - - 1. Register a user (configuration is automatically saved): - POST /product/users/register - { - "user_id": "john_doe", - "user_name": "John Doe", - "interests": "AI, machine learning, programming" - } - - 2. Get user configuration: - GET /product/users/john_doe/config - - 3. Update user configuration: - PUT /product/users/john_doe/config - { - "user_id": "john_doe", - "enable_activation_memory": true, - "top_k": 10, - ... - } - - 4. After service restart, all user instances are automatically restored - and the user can immediately use the system without re-registration. - """) - - -if __name__ == "__main__": - demonstrate_persistence() - demonstrate_api_usage() diff --git a/examples/mem_os/simple_memos.py b/examples/mem_os/simple_memos.py deleted file mode 100644 index be765e837..000000000 --- a/examples/mem_os/simple_memos.py +++ /dev/null @@ -1,42 +0,0 @@ -from memos.configs.mem_os import MOSConfig -from memos.mem_os.main import MOS - - -# init MOSConfig -mos_config = MOSConfig.from_json_file("examples/data/config/simple_memos_config.json") -mos = MOS(mos_config) - -# create user id -user_id = "lcy1" -mos.create_user(user_id=user_id) -users = mos.list_users() -print("\nAll users:") -for user in users: - print(f" - {user['user_name']} ({user['user_id']}) - Role: {user['role']}") - - -# load exist mem_cube from local -mos.register_mem_cube("examples/data/mem_cube_2", user_id=user_id) - -mos.add(memory_content="I like playing football.", user_id=user_id) - -get_all_results = mos.get_all(user_id=user_id) -print(f"Get all results for user : {get_all_results}") - -get_results = mos.get( - mem_cube_id="examples/data/mem_cube_2", - memory_id=get_all_results["text_mem"][0]["memories"][0].id, - user_id=user_id, -) -print(f"Get memories for user : {get_results}") - -search_results = mos.search(query="my favorite football game", user_id=user_id) -print(f"Search results for user : {search_results}") - - -while True: - user_input = input("👤 [You] ").strip() - print() - response = mos.chat(user_input, user_id=user_id) - print(f"🤖 [Assistant] {response}\n") -print("📢 [System] MemChat has stopped.") diff --git a/examples/mem_os/simple_openapi_memos.py b/examples/mem_os/simple_openapi_memos.py deleted file mode 100644 index a9faa3dc8..000000000 --- a/examples/mem_os/simple_openapi_memos.py +++ /dev/null @@ -1,300 +0,0 @@ -import os -import time -import uuid - -from datetime import datetime - -from dotenv import load_dotenv - -from memos.configs.mem_cube import GeneralMemCubeConfig -from memos.configs.mem_os import MOSConfig -from memos.mem_cube.general import GeneralMemCube -from memos.mem_os.main import MOS - - -load_dotenv() - -# 1. Create MOS Config and set openai config -print(f"🚀 [{datetime.now().strftime('%H:%M:%S')}] Starting to create MOS configuration...") -start_time = time.time() - -user_name = str(uuid.uuid4()) -print(user_name) - -# 1.1 Set openai config -openapi_config = { - "model_name_or_path": "gpt-4o-mini", - "temperature": 0.8, - "max_tokens": 1024, - "top_p": 0.9, - "top_k": 50, - "remove_think_prefix": True, - "api_key": os.getenv("OPENAI_API_KEY", "sk-xxxxx"), - "api_base": os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1"), -} -# 1.2 Set neo4j config -neo4j_uri = os.getenv("NEO4J_URI", "bolt://localhost:7687") - -# 1.3 Create MOS Config -config = { - "user_id": user_name, - "chat_model": { - "backend": "openai", - "config": openapi_config, - }, - "mem_reader": { - "backend": "simple_struct", - "config": { - "llm": { - "backend": "openai", - "config": openapi_config, - }, - "embedder": { - "backend": "ollama", - "config": { - "model_name_or_path": "nomic-embed-text:latest", - }, - }, - "chunker": { - "backend": "sentence", - "config": { - "tokenizer_or_token_counter": "gpt2", - "chunk_size": 512, - "chunk_overlap": 128, - "min_sentences_per_chunk": 1, - }, - }, - }, - }, - "max_turns_window": 20, - "top_k": 5, - "enable_textual_memory": True, - "enable_activation_memory": False, - "enable_parametric_memory": False, -} - -mos_config = MOSConfig(**config) -# you can set PRO_MODE to True to enable CoT enhancement mos_config.PRO_MODE = True -mos = MOS(mos_config) - -print( - f"✅ [{datetime.now().strftime('%H:%M:%S')}] MOS configuration created successfully, time elapsed: {time.time() - start_time:.2f}s\n" -) - -# 2. Initialize memory cube -print(f"🚀 [{datetime.now().strftime('%H:%M:%S')}] Starting to initialize MemCube configuration...") -start_time = time.time() - -config = GeneralMemCubeConfig.model_validate( - { - "user_id": user_name, - "cube_id": f"{user_name}", - "text_mem": { - "backend": "tree_text", - "config": { - "extractor_llm": { - "backend": "openai", - "config": openapi_config, - }, - "dispatcher_llm": { - "backend": "openai", - "config": openapi_config, - }, - "graph_db": { - "backend": "neo4j", - "config": { - "uri": neo4j_uri, - "user": "neo4j", - "password": "12345678", - "db_name": f"db{user_name.replace('-', '')}", - "auto_create": True, - }, - }, - "embedder": { - "backend": "ollama", - "config": { - "model_name_or_path": "nomic-embed-text:latest", - }, - }, - }, - }, - "act_mem": {}, - "para_mem": {}, - }, -) - -print( - f"✅ [{datetime.now().strftime('%H:%M:%S')}] MemCube configuration initialization completed, time elapsed: {time.time() - start_time:.2f}s\n" -) - -# 3. Initialize the MemCube with the configuration -print(f"🚀 [{datetime.now().strftime('%H:%M:%S')}] Starting to create MemCube instance...") -start_time = time.time() - -mem_cube = GeneralMemCube(config) -try: - mem_cube.dump(f"/tmp/{user_name}/") - print( - f"✅ [{datetime.now().strftime('%H:%M:%S')}] MemCube created and saved successfully, time elapsed: {time.time() - start_time:.2f}s\n" - ) -except Exception as e: - print( - f"❌ [{datetime.now().strftime('%H:%M:%S')}] MemCube save failed: {e}, time elapsed: {time.time() - start_time:.2f}s\n" - ) - -# 4. Register the MemCube -print(f"🚀 [{datetime.now().strftime('%H:%M:%S')}] Starting to register MemCube...") -start_time = time.time() - -mos.register_mem_cube(f"/tmp/{user_name}", mem_cube_id=user_name) - -print( - f"✅ [{datetime.now().strftime('%H:%M:%S')}] MemCube registration completed, time elapsed: {time.time() - start_time:.2f}s\n" -) - -# 5. Add, get, search memory -print(f"🚀 [{datetime.now().strftime('%H:%M:%S')}] Starting to add single memory...") -start_time = time.time() - -mos.add(memory_content="I like playing football.") - -print( - f"✅ [{datetime.now().strftime('%H:%M:%S')}] Single memory added successfully, time elapsed: {time.time() - start_time:.2f}s" -) - -print(f"🚀 [{datetime.now().strftime('%H:%M:%S')}] Starting to get all memories...") -start_time = time.time() - -get_all_results = mos.get_all() - - -# Filter out embedding fields, keeping only necessary fields -def filter_memory_data(memories_data): - filtered_data = {} - for key, value in memories_data.items(): - if key == "text_mem": - filtered_data[key] = [] - for mem_group in value: - # Check if it's the new data structure (list of TextualMemoryItem objects) - if "memories" in mem_group and isinstance(mem_group["memories"], list): - # New data structure: directly a list of TextualMemoryItem objects - filtered_memories = [] - for memory_item in mem_group["memories"]: - # Create filtered dictionary - filtered_item = { - "id": memory_item.id, - "memory": memory_item.memory, - "metadata": {}, - } - # Filter metadata, excluding embedding - if hasattr(memory_item, "metadata") and memory_item.metadata: - for attr_name in dir(memory_item.metadata): - if not attr_name.startswith("_") and attr_name != "embedding": - attr_value = getattr(memory_item.metadata, attr_name) - if not callable(attr_value): - filtered_item["metadata"][attr_name] = attr_value - filtered_memories.append(filtered_item) - - filtered_group = { - "cube_id": mem_group.get("cube_id", ""), - "memories": filtered_memories, - } - filtered_data[key].append(filtered_group) - else: - # Old data structure: dictionary with nodes and edges - filtered_group = { - "memories": {"nodes": [], "edges": mem_group["memories"].get("edges", [])} - } - for node in mem_group["memories"].get("nodes", []): - filtered_node = { - "id": node.get("id"), - "memory": node.get("memory"), - "metadata": { - k: v - for k, v in node.get("metadata", {}).items() - if k != "embedding" - }, - } - filtered_group["memories"]["nodes"].append(filtered_node) - filtered_data[key].append(filtered_group) - else: - filtered_data[key] = value - return filtered_data - - -filtered_results = filter_memory_data(get_all_results) -print(f"Get all results after add memory: {filtered_results['text_mem'][0]['memories']}") - -print( - f"✅ [{datetime.now().strftime('%H:%M:%S')}] Get all memories completed, time elapsed: {time.time() - start_time:.2f}s\n" -) - -# 6. Add messages -print(f"🚀 [{datetime.now().strftime('%H:%M:%S')}] Starting to add conversation messages...") -start_time = time.time() - -messages = [ - {"role": "user", "content": "I like playing football."}, - {"role": "assistant", "content": "yes football is my favorite game."}, -] -mos.add(messages) - -print( - f"✅ [{datetime.now().strftime('%H:%M:%S')}] Conversation messages added successfully, time elapsed: {time.time() - start_time:.2f}s" -) - -print( - f"🚀 [{datetime.now().strftime('%H:%M:%S')}] Starting to get all memories (after adding messages)..." -) -start_time = time.time() - -get_all_results = mos.get_all() -filtered_results = filter_memory_data(get_all_results) -print(f"Get all results after add messages: {filtered_results}") - -print( - f"✅ [{datetime.now().strftime('%H:%M:%S')}] Get all memories completed, time elapsed: {time.time() - start_time:.2f}s\n" -) - -# 7. Add document -print(f"🚀 [{datetime.now().strftime('%H:%M:%S')}] Starting to add document...") -start_time = time.time() -## 7.1 add pdf for ./tmp/data if use doc mem mos.add(doc_path="./tmp/data/") -start_time = time.time() - -get_all_results = mos.get_all() -filtered_results = filter_memory_data(get_all_results) -print(f"Get all results after add doc: {filtered_results}") - -print( - f"✅ [{datetime.now().strftime('%H:%M:%S')}] Get all memories completed, time elapsed: {time.time() - start_time:.2f}s\n" -) - -# 8. Search -print(f"🚀 [{datetime.now().strftime('%H:%M:%S')}] Starting to search memories...") -start_time = time.time() - -search_results = mos.search(query="my favorite football game", user_id=user_name) -filtered_search_results = filter_memory_data(search_results) -print(f"Search results: {filtered_search_results}") - -print( - f"✅ [{datetime.now().strftime('%H:%M:%S')}] Memory search completed, time elapsed: {time.time() - start_time:.2f}s\n" -) - -# 9. Chat -print(f"🎯 [{datetime.now().strftime('%H:%M:%S')}] Starting chat mode...") -while True: - user_input = input("👤 [You] ").strip() - if user_input.lower() in ["quit", "exit"]: - break - - print() - chat_start_time = time.time() - response = mos.chat(user_input) - chat_duration = time.time() - chat_start_time - - print(f"🤖 [Assistant] {response}") - print(f"⏱️ [Response time: {chat_duration:.2f}s]\n") - -print("📢 [System] MemChat has stopped.") diff --git a/examples/mem_os/simple_openapi_memos_neo4j_community.py b/examples/mem_os/simple_openapi_memos_neo4j_community.py deleted file mode 100644 index aad1b8c77..000000000 --- a/examples/mem_os/simple_openapi_memos_neo4j_community.py +++ /dev/null @@ -1,315 +0,0 @@ -import os -import time -import uuid - -from datetime import datetime - -from dotenv import load_dotenv - -from memos.configs.mem_cube import GeneralMemCubeConfig -from memos.configs.mem_os import MOSConfig -from memos.mem_cube.general import GeneralMemCube -from memos.mem_os.main import MOS - - -load_dotenv() - -# 1. Create MOS Config and set openai config -print(f"🚀 [{datetime.now().strftime('%H:%M:%S')}] Starting to create MOS configuration...") -start_time = time.time() - -user_name = str(uuid.uuid4()) -print(user_name) - -# 1.1 Set openai config -openapi_config = { - "model_name_or_path": "gpt-4o-mini", - "temperature": 0.8, - "max_tokens": 1024, - "top_p": 0.9, - "top_k": 50, - "remove_think_prefix": True, - "api_key": os.getenv("OPENAI_API_KEY", "sk-xxxxx"), - "api_base": os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1"), -} -embedder_config = { - "backend": "universal_api", - "config": { - "provider": "openai", - "api_key": os.getenv("OPENAI_API_KEY", "sk-xxxxx"), - "model_name_or_path": "text-embedding-3-large", - "base_url": os.getenv("OPENAI_API_BASE", "https://api.openai.com/v1"), - }, -} -EMBEDDING_DIMENSION = 3072 - -# 1.2 Set neo4j config -neo4j_uri = os.getenv("NEO4J_URI", "bolt://localhost:7687") - -# 1.3 Create MOS Config -config = { - "user_id": user_name, - "chat_model": { - "backend": "openai", - "config": openapi_config, - }, - "mem_reader": { - "backend": "simple_struct", - "config": { - "llm": { - "backend": "openai", - "config": openapi_config, - }, - "embedder": embedder_config, - "chunker": { - "backend": "sentence", - "config": { - "tokenizer_or_token_counter": "gpt2", - "chunk_size": 512, - "chunk_overlap": 128, - "min_sentences_per_chunk": 1, - }, - }, - }, - }, - "max_turns_window": 20, - "top_k": 5, - "enable_textual_memory": True, - "enable_activation_memory": False, - "enable_parametric_memory": False, -} - -mos_config = MOSConfig(**config) -# you can set PRO_MODE to True to enable CoT enhancement mos_config.PRO_MODE = True -mos = MOS(mos_config) - -print( - f"✅ [{datetime.now().strftime('%H:%M:%S')}] MOS configuration created successfully, time elapsed: {time.time() - start_time:.2f}s\n" -) - -# 2. Initialize memory cube -print(f"🚀 [{datetime.now().strftime('%H:%M:%S')}] Starting to initialize MemCube configuration...") -start_time = time.time() - -config = GeneralMemCubeConfig.model_validate( - { - "user_id": user_name, - "cube_id": f"{user_name}", - "text_mem": { - "backend": "tree_text", - "config": { - "extractor_llm": { - "backend": "openai", - "config": openapi_config, - }, - "dispatcher_llm": { - "backend": "openai", - "config": openapi_config, - }, - "embedder": embedder_config, - "graph_db": { - "backend": "neo4j-community", - "config": { - "uri": neo4j_uri, - "user": "neo4j", - "password": "12345678", - "db_name": "neo4j", - "user_name": "alice", - "use_multi_db": False, - "auto_create": False, - "embedding_dimension": EMBEDDING_DIMENSION, - "vec_config": { - "backend": "qdrant", - "config": { - "collection_name": "neo4j_vec_db", - "vector_dimension": EMBEDDING_DIMENSION, - "distance_metric": "cosine", - "host": "localhost", - "port": 6333, - }, - }, - }, - }, - "reorganize": True, - }, - }, - "act_mem": {}, - "para_mem": {}, - }, -) - -print( - f"✅ [{datetime.now().strftime('%H:%M:%S')}] MemCube configuration initialization completed, time elapsed: {time.time() - start_time:.2f}s\n" -) - -# 3. Initialize the MemCube with the configuration -print(f"🚀 [{datetime.now().strftime('%H:%M:%S')}] Starting to create MemCube instance...") -start_time = time.time() - -mem_cube = GeneralMemCube(config) -try: - mem_cube.dump(f"/tmp/{user_name}/") - print( - f"✅ [{datetime.now().strftime('%H:%M:%S')}] MemCube created and saved successfully, time elapsed: {time.time() - start_time:.2f}s\n" - ) -except Exception as e: - print( - f"❌ [{datetime.now().strftime('%H:%M:%S')}] MemCube save failed: {e}, time elapsed: {time.time() - start_time:.2f}s\n" - ) - -# 4. Register the MemCube -print(f"🚀 [{datetime.now().strftime('%H:%M:%S')}] Starting to register MemCube...") -start_time = time.time() - -mos.register_mem_cube(f"/tmp/{user_name}", mem_cube_id=user_name) - -print( - f"✅ [{datetime.now().strftime('%H:%M:%S')}] MemCube registration completed, time elapsed: {time.time() - start_time:.2f}s\n" -) - -# 5. Add, get, search memory -print(f"🚀 [{datetime.now().strftime('%H:%M:%S')}] Starting to add single memory...") -start_time = time.time() - -mos.add(memory_content="I like playing football.") - -print( - f"✅ [{datetime.now().strftime('%H:%M:%S')}] Single memory added successfully, time elapsed: {time.time() - start_time:.2f}s" -) - -print(f"🚀 [{datetime.now().strftime('%H:%M:%S')}] Starting to get all memories...") -start_time = time.time() - -get_all_results = mos.get_all() - - -# Filter out embedding fields, keeping only necessary fields -def filter_memory_data(memories_data): - filtered_data = {} - for key, value in memories_data.items(): - if key == "text_mem": - filtered_data[key] = [] - for mem_group in value: - # Check if it's the new data structure (list of TextualMemoryItem objects) - if "memories" in mem_group and isinstance(mem_group["memories"], list): - # New data structure: directly a list of TextualMemoryItem objects - filtered_memories = [] - for memory_item in mem_group["memories"]: - # Create filtered dictionary - filtered_item = { - "id": memory_item.id, - "memory": memory_item.memory, - "metadata": {}, - } - # Filter metadata, excluding embedding - if hasattr(memory_item, "metadata") and memory_item.metadata: - for attr_name in dir(memory_item.metadata): - if not attr_name.startswith("_") and attr_name != "embedding": - attr_value = getattr(memory_item.metadata, attr_name) - if not callable(attr_value): - filtered_item["metadata"][attr_name] = attr_value - filtered_memories.append(filtered_item) - - filtered_group = { - "cube_id": mem_group.get("cube_id", ""), - "memories": filtered_memories, - } - filtered_data[key].append(filtered_group) - else: - # Old data structure: dictionary with nodes and edges - filtered_group = { - "memories": {"nodes": [], "edges": mem_group["memories"].get("edges", [])} - } - for node in mem_group["memories"].get("nodes", []): - filtered_node = { - "id": node.get("id"), - "memory": node.get("memory"), - "metadata": { - k: v - for k, v in node.get("metadata", {}).items() - if k != "embedding" - }, - } - filtered_group["memories"]["nodes"].append(filtered_node) - filtered_data[key].append(filtered_group) - else: - filtered_data[key] = value - return filtered_data - - -filtered_results = filter_memory_data(get_all_results) -print(f"Get all results after add memory: {filtered_results['text_mem'][0]['memories']}") - -print( - f"✅ [{datetime.now().strftime('%H:%M:%S')}] Get all memories completed, time elapsed: {time.time() - start_time:.2f}s\n" -) - -# 6. Add messages -print(f"🚀 [{datetime.now().strftime('%H:%M:%S')}] Starting to add conversation messages...") -start_time = time.time() - -messages = [ - {"role": "user", "content": "I like playing football."}, - {"role": "assistant", "content": "yes football is my favorite game."}, -] -mos.add(messages) - -print( - f"✅ [{datetime.now().strftime('%H:%M:%S')}] Conversation messages added successfully, time elapsed: {time.time() - start_time:.2f}s" -) - -print( - f"🚀 [{datetime.now().strftime('%H:%M:%S')}] Starting to get all memories (after adding messages)..." -) -start_time = time.time() - -get_all_results = mos.get_all() -filtered_results = filter_memory_data(get_all_results) -print(f"Get all results after add messages: {filtered_results}") - -print( - f"✅ [{datetime.now().strftime('%H:%M:%S')}] Get all memories completed, time elapsed: {time.time() - start_time:.2f}s\n" -) - -# 7. Add document -print(f"🚀 [{datetime.now().strftime('%H:%M:%S')}] Starting to add document...") -start_time = time.time() -## 7.1 add pdf for ./tmp/data if use doc mem mos.add(doc_path="./tmp/data/") -start_time = time.time() - -get_all_results = mos.get_all() -filtered_results = filter_memory_data(get_all_results) -print(f"Get all results after add doc: {filtered_results}") - -print( - f"✅ [{datetime.now().strftime('%H:%M:%S')}] Get all memories completed, time elapsed: {time.time() - start_time:.2f}s\n" -) - -# 8. Search -print(f"🚀 [{datetime.now().strftime('%H:%M:%S')}] Starting to search memories...") -start_time = time.time() - -search_results = mos.search(query="my favorite football game", user_id=user_name) -filtered_search_results = filter_memory_data(search_results) -print(f"Search results: {filtered_search_results}") - -print( - f"✅ [{datetime.now().strftime('%H:%M:%S')}] Memory search completed, time elapsed: {time.time() - start_time:.2f}s\n" -) - -# 9. Chat -print(f"🎯 [{datetime.now().strftime('%H:%M:%S')}] Starting chat mode...") -while True: - user_input = input("👤 [You] ").strip() - if user_input.lower() in ["quit", "exit"]: - break - - print() - chat_start_time = time.time() - response = mos.chat(user_input) - chat_duration = time.time() - chat_start_time - - print(f"🤖 [Assistant] {response}") - print(f"⏱️ [Response time: {chat_duration:.2f}s]\n") - -print("📢 [System] MemChat has stopped.") diff --git a/examples/mem_os/simple_prefs_memos_product.py b/examples/mem_os/simple_prefs_memos_product.py deleted file mode 100644 index 40ec920f5..000000000 --- a/examples/mem_os/simple_prefs_memos_product.py +++ /dev/null @@ -1,399 +0,0 @@ -from memos.configs.mem_cube import GeneralMemCubeConfig -from memos.configs.mem_os import MOSConfig -from memos.mem_cube.general import GeneralMemCube -from memos.mem_os.product import MOSProduct - - -def get_config(user_id: str): - llm_config = { - "backend": "openai", - "config": { - "model_name_or_path": "gpt-4o-mini", - "api_key": "sk-xxxxx", - "api_base": "http://xxxx/v1", - "temperature": 0.1, - "remove_think_prefix": True, - "max_tokens": 4096, - }, - } - - embedder_config = { - "backend": "ollama", - "config": {"model_name_or_path": "nomic-embed-text:latest"}, - } - - # init MOS - mos_config = { - "user_id": user_id, - "chat_model": llm_config, - "mem_reader": { - "backend": "simple_struct", - "config": { - "llm": llm_config, - "embedder": embedder_config, - "chunker": { - "backend": "sentence", - "config": { - "tokenizer_or_token_counter": "gpt2", - "chunk_size": 512, - "chunk_overlap": 128, - "min_sentences_per_chunk": 1, - }, - }, - }, - }, - "max_turns_window": 20, - "top_k": 5, - "enable_textual_memory": True, - "enable_activation_memory": False, - "enable_parametric_memory": False, - "enable_preference_memory": True, - } - - cube_config = { - "model_schema": "memos.configs.mem_cube.GeneralMemCubeConfig", - "user_id": user_id, - "cube_id": f"{user_id}/mem_cube", - "text_mem": { - "backend": "tree_text", - "config": { - "cube_id": f"{user_id}/mem_cube", - "extractor_llm": llm_config, - "dispatcher_llm": llm_config, - "graph_db": { - "backend": "neo4j", - "config": { - "uri": "bolt://localhost:7687", - "user": "neo4j", - "password": "12345678", - "db_name": "neo4j", - "user_name": "memosneo4j", - "embedding_dimension": 768, - "use_multi_db": False, - "auto_create": False, - }, - }, - "embedder": embedder_config, - }, - }, - "act_mem": {"backend": "uninitialized", "config": {}}, - "para_mem": {"backend": "uninitialized", "config": {}}, - "pref_mem": { - "backend": "pref_text", - "config": { - "cube_id": f"{user_id}/mem_cube", - "extractor_llm": llm_config, - "vector_db": { - "backend": "milvus", - "config": { - "collection_name": [ - "explicit_preference", - "implicit_preference", - ], - "vector_dimension": 768, - "distance_metric": "cosine", - "uri": "./milvus_demo.db", - }, - }, - "embedder": embedder_config, - "extractor": {"backend": "naive", "config": {}}, - "adder": {"backend": "naive", "config": {}}, - "retriever": {"backend": "naive", "config": {}}, - }, - }, - } - mos_config = MOSConfig(**mos_config) - cube_config = GeneralMemCubeConfig.model_validate(cube_config) - - return mos_config, cube_config - - -user_id = "superman" -mos_config, mem_cube_config = get_config(user_id) - -memory = MOSProduct(default_config=mos_config) - -# register user and mem cube -mem_cube = GeneralMemCube(mem_cube_config) - -register_result = memory.user_register( - user_id=user_id, user_name=user_id, default_mem_cube=mem_cube -) -print(f"register_result: {register_result}") - -# add memory for user -memory.add( - messages=[ - # Sports and hobbies - {"role": "user", "content": "I like playing football."}, - { - "role": "assistant", - "content": "I like playing football too. It's a great way to stay active and work as a team.", - }, - {"role": "user", "content": "Do you enjoy watching basketball games?"}, - { - "role": "assistant", - "content": "Yes, I find basketball exciting to watch, especially the fast-paced action and strategic plays.", - }, - {"role": "user", "content": "I'm learning to play tennis this summer."}, - { - "role": "assistant", - "content": "That's wonderful! Tennis is a fantastic sport that improves both physical fitness and mental focus.", - }, - # Food and cooking - {"role": "user", "content": "What's your favorite type of cuisine?"}, - { - "role": "assistant", - "content": "I really enjoy Italian cuisine, especially pasta dishes and authentic pizza.", - }, - {"role": "user", "content": "I love cooking Asian food at home."}, - { - "role": "assistant", - "content": "Asian cooking is amazing! The balance of flavors and techniques is so interesting to learn.", - }, - {"role": "user", "content": "Have you ever tried making homemade bread?"}, - { - "role": "assistant", - "content": "Yes, there's something magical about the process of making bread from scratch. The smell is incredible!", - }, - # Travel and places - {"role": "user", "content": "I'm planning a trip to Japan next year."}, - { - "role": "assistant", - "content": "Japan is an incredible destination! The culture, food, and technology blend is fascinating.", - }, - {"role": "user", "content": "What's the most beautiful place you've ever seen?"}, - { - "role": "assistant", - "content": "I find mountain landscapes particularly breathtaking, especially during sunrise or sunset.", - }, - {"role": "user", "content": "I prefer beach vacations over city trips."}, - { - "role": "assistant", - "content": "Beach vacations are so relaxing! The sound of waves and warm sand is perfect for unwinding.", - }, - # Technology and innovation - {"role": "user", "content": "What do you think about artificial intelligence?"}, - { - "role": "assistant", - "content": "AI is transforming many aspects of our lives. It's exciting to see how it can help solve complex problems.", - }, - {"role": "user", "content": "I'm learning to code in Python."}, - { - "role": "assistant", - "content": "Python is a great language to start with! It's versatile and has a wonderful community.", - }, - {"role": "user", "content": "Do you use any productivity apps?"}, - { - "role": "assistant", - "content": "I find task management apps really helpful for organizing daily activities and staying focused.", - }, - # Music and entertainment - {"role": "user", "content": "What kind of music do you enjoy?"}, - { - "role": "assistant", - "content": "I appreciate many genres, but I particularly enjoy jazz and classical music for their complexity.", - }, - {"role": "user", "content": "I play the guitar in my free time."}, - { - "role": "assistant", - "content": "That's fantastic! Playing an instrument is such a rewarding creative outlet.", - }, - {"role": "user", "content": "Have you seen any good movies lately?"}, - { - "role": "assistant", - "content": "I enjoy films that make you think deeply about human nature and society.", - }, - # Books and learning - {"role": "user", "content": "Do you read books regularly?"}, - { - "role": "assistant", - "content": "Yes, reading is one of my favorite ways to learn and explore new ideas.", - }, - {"role": "user", "content": "I'm currently reading a science fiction novel."}, - { - "role": "assistant", - "content": "Science fiction is great for exploring possibilities and imagining different futures.", - }, - {"role": "user", "content": "What's your favorite subject to learn about?"}, - { - "role": "assistant", - "content": "I'm fascinated by psychology and how the human mind works.", - }, - # Nature and environment - {"role": "user", "content": "I love hiking in the mountains."}, - { - "role": "assistant", - "content": "Hiking is wonderful! It's a great way to connect with nature and get exercise.", - }, - {"role": "user", "content": "Are you concerned about climate change?"}, - { - "role": "assistant", - "content": "Yes, it's one of the most important challenges of our time that requires collective action.", - }, - {"role": "user", "content": "I try to recycle and reduce waste at home."}, - { - "role": "assistant", - "content": "That's commendable! Every small action contributes to environmental protection.", - }, - # Work and career - {"role": "user", "content": "What do you do for work?"}, - { - "role": "assistant", - "content": "I work in technology, helping people solve problems and improve their daily lives.", - }, - {"role": "user", "content": "I'm considering a career change."}, - { - "role": "assistant", - "content": "Career changes can be challenging but also very rewarding when you find the right fit.", - }, - {"role": "user", "content": "Do you work from home or in an office?"}, - { - "role": "assistant", - "content": "I work remotely, which gives me flexibility in how I organize my day.", - }, - # Health and wellness - {"role": "user", "content": "I've started doing yoga in the morning."}, - { - "role": "assistant", - "content": "Yoga is excellent for both physical and mental well-being. Great way to start the day!", - }, - {"role": "user", "content": "How do you manage stress?"}, - { - "role": "assistant", - "content": "I find meditation and regular exercise help me stay balanced and focused.", - }, - {"role": "user", "content": "I'm trying to eat more vegetables."}, - { - "role": "assistant", - "content": "That's a great health goal! Vegetables provide so many essential nutrients.", - }, - # Art and creativity - {"role": "user", "content": "Do you enjoy painting or drawing?"}, - { - "role": "assistant", - "content": "I appreciate visual arts, though I'm more of an observer than a creator.", - }, - {"role": "user", "content": "I'm learning photography."}, - { - "role": "assistant", - "content": "Photography is a beautiful way to capture moments and express your perspective.", - }, - {"role": "user", "content": "What's your favorite type of art?"}, - { - "role": "assistant", - "content": "I'm drawn to abstract art because it allows for personal interpretation.", - }, - # Family and relationships - {"role": "user", "content": "I have two siblings."}, - { - "role": "assistant", - "content": "Having siblings can be wonderful - they're often our first friends and lifelong companions.", - }, - {"role": "user", "content": "Do you have any pets?"}, - { - "role": "assistant", - "content": "I don't have pets, but I think they bring so much joy and companionship to people's lives.", - }, - {"role": "user", "content": "I'm planning to visit my grandparents this weekend."}, - { - "role": "assistant", - "content": "That's lovely! Grandparents often have such interesting stories and wisdom to share.", - }, - # Education and growth - {"role": "user", "content": "I'm taking an online course in data science."}, - { - "role": "assistant", - "content": "Data science is a fascinating field with many applications across different industries.", - }, - {"role": "user", "content": "What's the best way to learn a new language?"}, - { - "role": "assistant", - "content": "Immersion and consistent practice are key, along with finding methods that work for your learning style.", - }, - {"role": "user", "content": "I enjoy attending workshops and conferences."}, - { - "role": "assistant", - "content": "Workshops are great for hands-on learning and networking with like-minded people.", - }, - # Hobbies and interests - {"role": "user", "content": "I collect vintage postcards."}, - { - "role": "assistant", - "content": "What a unique hobby! Postcards offer glimpses into different times and places.", - }, - {"role": "user", "content": "Do you garden?"}, - { - "role": "assistant", - "content": "I appreciate gardening, though I'm more of a plant observer than a gardener myself.", - }, - {"role": "user", "content": "I love solving puzzles and brain teasers."}, - { - "role": "assistant", - "content": "Puzzles are excellent for keeping the mind sharp and developing problem-solving skills.", - }, - # Future and goals - {"role": "user", "content": "What are your goals for next year?"}, - { - "role": "assistant", - "content": "I aim to continue learning and growing, helping more people with their challenges.", - }, - {"role": "user", "content": "I want to start my own business someday."}, - { - "role": "assistant", - "content": "Entrepreneurship is exciting! It requires courage, planning, and persistence.", - }, - {"role": "user", "content": "Do you believe in setting New Year's resolutions?"}, - { - "role": "assistant", - "content": "I think any time is good for setting positive goals and making positive changes.", - }, - # Philosophy and life - {"role": "user", "content": "What's the meaning of life to you?"}, - { - "role": "assistant", - "content": "I believe it's about learning, growing, and making positive connections with others.", - }, - {"role": "user", "content": "I try to practice gratitude daily."}, - { - "role": "assistant", - "content": "Gratitude is such a powerful practice that can transform your perspective on life.", - }, - {"role": "user", "content": "What's your biggest fear?"}, - { - "role": "assistant", - "content": "I think fear of not being able to help when someone really needs it would be challenging.", - }, - # Technology and daily life - {"role": "user", "content": "How has technology changed your daily routine?"}, - { - "role": "assistant", - "content": "Technology has made many tasks more efficient and connected me with people worldwide.", - }, - {"role": "user", "content": "I'm trying to reduce my screen time."}, - { - "role": "assistant", - "content": "That's a healthy goal! Finding balance with technology is important for well-being.", - }, - {"role": "user", "content": "Do you use social media?"}, - { - "role": "assistant", - "content": "I think social media can be a great tool for connection when used mindfully.", - }, - # Final thoughts - {"role": "user", "content": "This has been a great conversation!"}, - { - "role": "assistant", - "content": "I've really enjoyed our chat too! It's wonderful to explore so many different topics together.", - }, - ], - user_id=user_id, - mem_cube_id=register_result["default_cube_id"], -) - -retrieved_memories = memory.search(query="What do you like?", user_id=user_id) -print( - f"len_pref_memories: {len(retrieved_memories['pref_mem'][0]['memories'])}" - if retrieved_memories["pref_mem"] - else 0 -) diff --git a/examples/mem_os/simple_treekvcache_memos.py b/examples/mem_os/simple_treekvcache_memos.py deleted file mode 100644 index 2f3408afd..000000000 --- a/examples/mem_os/simple_treekvcache_memos.py +++ /dev/null @@ -1,46 +0,0 @@ -import os - -from memos.configs.mem_cube import GeneralMemCubeConfig -from memos.configs.mem_os import MOSConfig -from memos.mem_cube.general import GeneralMemCube -from memos.mem_os.main import MOS - - -# init MOSConfig by deafult user -# note kvcache must at chatllm backend by huggingface -# gpu need set -os.environ["CUDA_VISIBLE_DEVICES"] = "1" -user_id = "root" -cube_id = "root/mem_cube_kv_cache" -tmp_cube_path = "/tmp/default/mem_cube_5" - -mos_config = MOSConfig.from_json_file("examples/data/config/simple_treekvcache_memos_config.json") -mos = MOS(mos_config) - - -# 2. Initialize_memory_cube -cube_config = GeneralMemCubeConfig.from_json_file( - "examples/data/config/simple_treekvcache_cube_config.json" -) - -# 3. Initialize the MemCube with the configuration and dump cube -mem_cube = GeneralMemCube(cube_config) -try: - mem_cube.dump(tmp_cube_path) -except Exception as e: - print(e) - -# 4. Register the MemCube explicitly -mos.register_mem_cube(tmp_cube_path, mem_cube_id=cube_id, user_id=user_id) - -# 5. Extract kv memory and add kv cache_mem -extract_kvmem = mos.mem_cubes[cube_id].act_mem.extract("I like football") -mos.mem_cubes[cube_id].act_mem.add([extract_kvmem]) - -# .chat -while True: - user_input = input("👤 [You] ").strip() - print() - response = mos.chat(user_input) - print(f"🤖 [Assistant] {response}\n") -print("📢 [System] MemChat has stopped.") diff --git a/examples/mem_os/simple_vllm_memos.py b/examples/mem_os/simple_vllm_memos.py deleted file mode 100644 index ffa7a3a24..000000000 --- a/examples/mem_os/simple_vllm_memos.py +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env python3 -""" -Simple example demonstrating how to use VLLMLLM with an existing vLLM server. -Requires a vLLM server to be running. -""" - -from typing import TYPE_CHECKING - -from memos.configs.llm import VLLMLLMConfig -from memos.llms.vllm import VLLMLLM - - -if TYPE_CHECKING: - from memos.types import MessageDict - - -def main(): - """Main function demonstrating VLLMLLM usage.""" - - # Configuration for connecting to existing vLLM server - config = VLLMLLMConfig( - model_name_or_path="/mnt/afs/models/hf_models/Qwen2.5-7B", # MUST MATCH the --model arg of vLLM server - api_key="", # Not needed for local server - api_base="http://localhost:8088/v1", # vLLM server address with /v1 - temperature=0.7, - max_tokens=512, - top_p=0.9, - model_schema="memos.configs.llm.VLLMLLMConfig", - ) - - # Initialize VLLM LLM - print("Initializing VLLM LLM...") - llm = VLLMLLM(config) - - # Test messages for KV cache building - print("\nBuilding KV cache for system messages...") - system_messages: list[MessageDict] = [ - {"role": "system", "content": "You are a helpful AI assistant."}, - {"role": "user", "content": "Hello! Can you tell me about vLLM?"}, - ] - try: - prompt = llm.build_vllm_kv_cache(system_messages) - print(f"✓ KV cache built successfully for prompt: '{prompt[:100]}...'") - except Exception as e: - print(f"✗ Failed to build KV cache: {e}") - - # Test with different messages for generation - print("\nGenerating response...") - user_messages: list[MessageDict] = [ - {"role": "system", "content": "You are a helpful AI assistant. Please Introduce yourself "}, - {"role": "user", "content": "What are the benefits of using vLLM?"}, - ] - try: - response = llm.generate(user_messages) - print(f"Response: {response}") - except Exception as e: - print(f"Error generating response: {e}") - - -if __name__ == "__main__": - main() diff --git a/examples/mem_user/user_manager_factory_example.py b/examples/mem_user/user_manager_factory_example.py deleted file mode 100644 index ea50c30c9..000000000 --- a/examples/mem_user/user_manager_factory_example.py +++ /dev/null @@ -1,111 +0,0 @@ -"""Example demonstrating the use of UserManagerFactory with different backends.""" - -from memos.configs.mem_user import UserManagerConfigFactory -from memos.mem_user.factory import UserManagerFactory -from memos.mem_user.persistent_factory import PersistentUserManagerFactory - - -def example_sqlite_default(): - """Example: Create SQLite user manager with default settings.""" - print("=== SQLite Default Example ===") - - # Method 1: Using factory with minimal config - user_manager = UserManagerFactory.create_sqlite() - - # Method 2: Using config factory (equivalent) - UserManagerConfigFactory( - backend="sqlite", - config={}, # Uses all defaults - ) - - print(f"Created user manager: {type(user_manager).__name__}") - print(f"Database path: {user_manager.db_path}") - - # Test basic operations - users = user_manager.list_users() - print(f"Initial users: {[user.user_name for user in users]}") - - user_manager.close() - - -def example_sqlite_custom(): - """Example: Create SQLite user manager with custom settings.""" - print("\n=== SQLite Custom Example ===") - - config_factory = UserManagerConfigFactory( - backend="sqlite", config={"db_path": "/tmp/custom_memos.db", "user_id": "admin"} - ) - - user_manager = UserManagerFactory.from_config(config_factory) - print(f"Created user manager: {type(user_manager).__name__}") - print(f"Database path: {user_manager.db_path}") - - # Test operations - user_id = user_manager.create_user("test_user") - print(f"Created user: {user_id}") - - user_manager.close() - - -def example_mysql(): - """Example: Create MySQL user manager.""" - print("\n=== MySQL Example ===") - - # Method 1: Using factory with parameters - try: - user_manager = UserManagerFactory.create_mysql( - host="localhost", - port=3306, - username="root", - password="your_password", # Replace with actual password - database="test_memos_users", - ) - - print(f"Created user manager: {type(user_manager).__name__}") - print(f"Connection URL: {user_manager.connection_url}") - - # Test operations - users = user_manager.list_users() - print(f"Users: {[user.user_name for user in users]}") - - user_manager.close() - - except Exception as e: - print(f"MySQL connection failed (expected if not set up): {e}") - - -def example_persistent_managers(): - """Example: Create persistent user managers with configuration storage.""" - print("\n=== Persistent User Manager Examples ===") - - # SQLite persistent manager - config_factory = UserManagerConfigFactory(backend="sqlite", config={}) - - persistent_manager = PersistentUserManagerFactory.from_config(config_factory) - print(f"Created persistent manager: {type(persistent_manager).__name__}") - - # Test config operations - from memos.configs.mem_os import MOSConfig - - # Create a sample config (you might need to adjust this based on MOSConfig structure) - try: - # This is a simplified example - adjust based on actual MOSConfig requirements - sample_config = MOSConfig() # Use default config - - # Save user config - success = persistent_manager.save_user_config("test_user", sample_config) - print(f"Config saved: {success}") - - # Retrieve user config - retrieved_config = persistent_manager.get_user_config("test_user") - print(f"Config retrieved: {retrieved_config is not None}") - - except Exception as e: - print(f"Config operations failed: {e}") - - persistent_manager.close() - - -if __name__ == "__main__": - # Run all examples - example_sqlite_default() From 47d024afeae952bf6fac0673f1f847b0ea23227a Mon Sep 17 00:00:00 2001 From: Qi Weng Date: Mon, 19 Jan 2026 21:53:18 +0800 Subject: [PATCH 49/53] fix: fix api examples and add search/chat examples. (#906) --- examples/api/server_router_api.py | 276 +++++++++++++++--------------- 1 file changed, 138 insertions(+), 138 deletions(-) diff --git a/examples/api/server_router_api.py b/examples/api/server_router_api.py index e7c7dc558..ffa83dd2c 100644 --- a/examples/api/server_router_api.py +++ b/examples/api/server_router_api.py @@ -34,7 +34,7 @@ # Global config # --------------------------------------------------------------------------- -BASE_URL = "http://0.0.0.0:8001/product" +BASE_URL = "http://127.0.0.1:8000/product" HEADERS = {"Content-Type": "application/json"} # You can change these identifiers if your backend requires pre-registered users/cubes. @@ -88,7 +88,12 @@ def example_01_string_message_minimal(): payload = { "user_id": USER_ID, "writable_cube_ids": [MEM_CUBE_ID], - "messages": "今天心情不错,喝了咖啡。", + "messages": [ + { + "role": "user", + "content": "今天心情不错,喝了咖啡。", + } + ], } call_add_api("01_string_message_minimal", payload) @@ -108,12 +113,7 @@ def example_02_standard_chat_triplet(): "messages": [ { "role": "system", - "content": [ - { - "type": "text", - "text": "You are a helpful travel assistant.", - } - ], + "content": "You are a helpful travel assistant.", "chat_time": "2025-11-24T10:00:00Z", "message_id": "sys-1", }, @@ -160,17 +160,7 @@ def example_03_assistant_with_tool_calls(): "messages": [ { "role": "assistant", - "content": None, - "tool_calls": [ - { - "id": "tool-call-weather-1", - "type": "function", - "function": { - "name": "get_weather", - "arguments": '{"location": "北京"}', - }, - } - ], + "content": '[Tool Call] get_weather({"location": "北京"})', "chat_time": "2025-11-24T10:12:00Z", "message_id": "assistant-with-call-1", } @@ -195,24 +185,13 @@ def example_03b_tool_message_with_result(): "messages": [ { "role": "assistant", - "content": None, - "tool_calls": [ - { - "id": "tool-call-weather-1", - "type": "function", - "function": { - "name": "get_weather", - "arguments": '{"location": "北京"}', - }, - } - ], + "content": '[Tool Call] get_weather({"location": "北京"})', "chat_time": "2025-11-24T10:12:00Z", "message_id": "assistant-with-call-1", }, { - "role": "tool", - "content": "北京今天天气晴朗,温度25°C,湿度60%。", - "tool_call_id": "tool-call-weather-1", + "role": "system", + "content": "[Tool Result] 北京今天天气晴朗,温度25°C,湿度60%。", "chat_time": "2025-11-24T10:12:05Z", "message_id": "tool-result-1", }, @@ -232,31 +211,44 @@ def example_03c_tool_description_input_output(): - `tool_output`: the result/output from the tool execution. - These are alternative formats for representing tool interactions. """ + tool_desc = { + "type": "tool_description", + "name": "get_weather", + "description": "获取指定地点的当前天气信息", + "parameters": { + "type": "object", + "properties": {"location": {"type": "string", "description": "城市名称"}}, + "required": ["location"], + }, + } + tool_input = { + "type": "tool_input", + "call_id": "call_123", + "name": "get_weather", + "argument": {"location": "北京"}, + } + tool_output = { + "type": "tool_output", + "call_id": "call_123", + "name": "get_weather", + "output": {"weather": "晴朗", "temperature": 25, "humidity": 60}, + } + payload = { "user_id": USER_ID, "writable_cube_ids": [MEM_CUBE_ID], "messages": [ { - "type": "tool_description", - "name": "get_weather", - "description": "获取指定地点的当前天气信息", - "parameters": { - "type": "object", - "properties": {"location": {"type": "string", "description": "城市名称"}}, - "required": ["location"], - }, + "role": "system", + "content": f"[Tool Description] {json.dumps(tool_desc, ensure_ascii=False)}", }, { - "type": "tool_input", - "call_id": "call_123", - "name": "get_weather", - "argument": {"location": "北京"}, + "role": "user", + "content": f"[Tool Input] {json.dumps(tool_input, ensure_ascii=False)}", }, { - "type": "tool_output", - "call_id": "call_123", - "name": "get_weather", - "output": {"weather": "晴朗", "temperature": 25, "humidity": 60}, + "role": "system", + "content": f"[Tool Output] {json.dumps(tool_output, ensure_ascii=False)}", }, ], "info": {"source_type": "custom_tool_format"}, @@ -282,20 +274,13 @@ def example_04_extreme_multimodal_single_message(): "messages": [ { "role": "user", - "content": [ - {"type": "text", "text": "请分析下面这些信息:"}, - {"type": "image_url", "image_url": {"url": "https://example.com/x.png"}}, - {"type": "file", "file": {"file_id": "f1", "filename": "xx.pdf"}}, - ], + "content": "请分析下面这些信息:\n[Image: https://example.com/x.png]\n[File: xx.pdf]", "chat_time": "2025-11-24T10:55:00Z", "message_id": "mix-mm-1", }, { "role": "user", - "content": [ - {"type": "text", "text": "请再分析一下下面这些信息:"}, - {"type": "file", "file": {"file_id": "f1", "filename": "xx.pdf"}}, - ], + "content": "请再分析一下下面这些信息:\n[File: xx.pdf]", "chat_time": "2025-11-24T10:55:10Z", "message_id": "mix-mm-2", }, @@ -323,19 +308,7 @@ def example_05_multimodal_text_and_image(): "messages": [ { "role": "user", - "content": [ - { - "type": "text", - "text": "帮我看看这张图片大概是什么内容?", - }, - { - "type": "image_url", - "image_url": { - "url": "https://example.com/mountain_lake.jpg", - "detail": "high", - }, - }, - ], + "content": "帮我看看这张图片大概是什么内容?\n[Image: https://example.com/mountain_lake.jpg]", "chat_time": "2025-11-24T10:20:00Z", "message_id": "mm-img-1", } @@ -361,19 +334,7 @@ def example_06_multimodal_text_and_file(): "messages": [ { "role": "user", - "content": [ - { - "type": "text", - "text": "请阅读这个PDF,总结里面的要点。", - }, - { - "type": "file", - "file": { - "file_id": "file_123", - "filename": "report.pdf", # optional, but recommended - }, - }, - ], + "content": "请阅读这个PDF,总结里面的要点。\n[File: report.pdf (ID: file_123)]", "chat_time": "2025-11-24T10:21:00Z", "message_id": "mm-file-1", } @@ -396,15 +357,7 @@ def example_07_audio_only_message(): "messages": [ { "role": "user", - "content": [ - { - "type": "input_audio", - "input_audio": { - "data": "base64_encoded_audio_here", - "format": "mp3", - }, - } - ], + "content": "[Audio Input: base64_encoded_audio_here (mp3)]", "chat_time": "2025-11-24T10:22:00Z", "message_id": "audio-1", } @@ -431,12 +384,12 @@ def example_08_pure_text_input_items(): "writable_cube_ids": [MEM_CUBE_ID], "messages": [ { - "type": "text", - "text": "这是一段独立的文本输入,没有明确的对话上下文。", + "role": "user", + "content": "这是一段独立的文本输入,没有明确的对话上下文。", }, { - "type": "text", - "text": "它依然会被抽取和写入明文记忆。", + "role": "user", + "content": "它依然会被抽取和写入明文记忆。", }, ], "info": {"source_type": "batch_import"}, @@ -453,18 +406,15 @@ def example_09_pure_file_input_by_file_id(): * `file_id`: optional, use when file is already uploaded * `file_data`: optional, use for base64-encoded content * `filename`: optional, but recommended for clarity - - In practice, you need at least `file_id` OR `file_data` to specify the file. + - In practice, you need at least `file_id` OR `file_data` to specify the file. """ payload = { "user_id": USER_ID, "writable_cube_ids": [MEM_CUBE_ID], "messages": [ { - "type": "file", - "file": { - "file_id": "file_uploaded_123", # at least one of file_id/file_data needed - "filename": "document.pdf", # optional - }, + "role": "user", + "content": "[File: document.pdf (ID: file_uploaded_123)]", } ], "info": {"source_type": "file_ingestion"}, @@ -487,11 +437,8 @@ def example_09b_pure_file_input_by_file_data(): "writable_cube_ids": [MEM_CUBE_ID], "messages": [ { - "type": "file", - "file": { - "file_data": "base64_encoded_file_content_here", # at least one of file_id/file_data needed - "filename": "document.pdf", # optional - }, + "role": "user", + "content": "[File: document.pdf (base64_data)]", } ], "info": {"source_type": "file_ingestion_base64"}, @@ -512,11 +459,8 @@ def example_09c_pure_file_input_by_oss_url(): "writable_cube_ids": [MEM_CUBE_ID], "messages": [ { - "type": "file", - "file": { - "file_data": "oss_url", # OSS URL instead of base64 - "filename": "document.pdf", - }, + "role": "user", + "content": "[File: document.pdf (OSS: oss_url)]", } ], "info": {"source_type": "file_ingestion_oss"}, @@ -537,11 +481,8 @@ def example_09d_pure_image_input(): "writable_cube_ids": [MEM_CUBE_ID], "messages": [ { - "type": "image_url", - "image_url": { - "url": "https://example.com/standalone_image.jpg", - "detail": "high", - }, + "role": "user", + "content": "[Image: https://example.com/standalone_image.jpg]", } ], "info": {"source_type": "image_ingestion"}, @@ -561,26 +502,7 @@ def example_10_mixed_text_file_image(): "messages": [ { "role": "user", - "content": [ - { - "type": "text", - "text": "请同时分析这个报告和图表。", - }, - { - "type": "file", - "file": { - "file_id": "file_789", - "filename": "analysis_report.pdf", - }, - }, - { - "type": "image_url", - "image_url": { - "url": "https://example.com/chart.png", - "detail": "auto", - }, - }, - ], + "content": "请同时分析这个报告和图表。\n[File: analysis_report.pdf (ID: file_789)]\n[Image: https://example.com/chart.png]", "chat_time": "2025-11-24T10:23:00Z", "message_id": "mixed-1", } @@ -844,6 +766,82 @@ def example_18_add_with_chat_history(): call_add_api("18_add_with_chat_history", payload) +# =========================================================================== +# 8. Search and Chat examples +# =========================================================================== + + +def example_19_search_memories(): + """ + Search memories using `APISearchRequest`. + + - Searches for memories relevant to a query. + - Demonstrates usage of `readable_cube_ids` for scoping. + """ + payload = { + "user_id": USER_ID, + "query": "What are my hotel preferences?", + "readable_cube_ids": [MEM_CUBE_ID], + "top_k": 5, + "mode": "fast", + "include_preference": True, + } + + print("=" * 80) + print("[*] Example: 19_search_memories") + print("- Payload:") + print(json.dumps(payload, indent=2, ensure_ascii=False)) + + try: + resp = requests.post( + f"{BASE_URL}/search", headers=HEADERS, data=json.dumps(payload), timeout=60 + ) + print("- Response:") + print(resp.status_code, resp.text) + except Exception as e: + print(f"- Request failed with exception: {e!r}") + + print("=" * 80) + print() + + +def example_20_chat_complete(): + """ + Chat completion using `APIChatCompleteRequest`. + + - Sends a chat query to the system. + - System retrieves relevant memories and generates a response. + - please make sure ENABLE_CHAT_API=true in .env or environment variables + - and set up CHAT_MODEL_LIST in .env or environment variables properly with api keys and stuff. + """ + payload = { + "user_id": USER_ID, + "query": "Recommend a hotel for me based on my preferences.", + "readable_cube_ids": [MEM_CUBE_ID], + "writable_cube_ids": [MEM_CUBE_ID], + "mode": "fast", + "top_k": 5, + "add_message_on_answer": True, + } + + print("=" * 80) + print("[*] Example: 20_chat_complete") + print("- Payload:") + print(json.dumps(payload, indent=2, ensure_ascii=False)) + + try: + resp = requests.post( + f"{BASE_URL}/chat/complete", headers=HEADERS, data=json.dumps(payload), timeout=60 + ) + print("- Response:") + print(resp.status_code, resp.text) + except Exception as e: + print(f"- Request failed with exception: {e!r}") + + print("=" * 80) + print() + + # =========================================================================== # Entry point # =========================================================================== @@ -873,3 +871,5 @@ def example_18_add_with_chat_history(): example_16_feedback_add() example_17_family_travel_conversation() example_18_add_with_chat_history() + example_19_search_memories() + example_20_chat_complete() From 7adbb92ed44f5cdef9f4d2689a5b6b4f7ccc4d8b Mon Sep 17 00:00:00 2001 From: CaralHsi Date: Mon, 19 Jan 2026 22:01:33 +0800 Subject: [PATCH 50/53] feat: delete useless file; fix: chat model list bug (#907) * feat: delete useless example * fix: chat_model_list bug * feat: delete useless file --- examples/data/mem_cube_2/README.md | 1 - .../data/mem_cube_2/activation_memory.pickle | Bin 820726 -> 0 bytes examples/data/mem_cube_2/config.json | 77 - .../data/mem_cube_2/parametric_memory.adapter | 4 - examples/data/mem_cube_2/textual_memory.json | 1592 ----------------- examples/data/mem_scheduler/scene_data.json | 118 -- src/memos/api/handlers/config_builders.py | 2 +- .../init_components_for_scheduler.py | 2 +- 8 files changed, 2 insertions(+), 1794 deletions(-) delete mode 100644 examples/data/mem_cube_2/README.md delete mode 100644 examples/data/mem_cube_2/activation_memory.pickle delete mode 100644 examples/data/mem_cube_2/config.json delete mode 100644 examples/data/mem_cube_2/parametric_memory.adapter delete mode 100644 examples/data/mem_cube_2/textual_memory.json delete mode 100644 examples/data/mem_scheduler/scene_data.json diff --git a/examples/data/mem_cube_2/README.md b/examples/data/mem_cube_2/README.md deleted file mode 100644 index 2737a3843..000000000 --- a/examples/data/mem_cube_2/README.md +++ /dev/null @@ -1 +0,0 @@ -This is a MemCube of type memos.configs.mem_cube.GeneralMemCubeConfig. diff --git a/examples/data/mem_cube_2/activation_memory.pickle b/examples/data/mem_cube_2/activation_memory.pickle deleted file mode 100644 index 10aed7ef20e4d2b23602a892bb053d131cdca372..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 820726 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

P6767vw798ia-jY%I>}_KfOT$ya2N` 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

(@FqDqEn2tShcNj|1s21}sj$(*u*I2Is>SxL^LU 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 z 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

  • NT(1cqCt-vrVqp!1vU0}b9>11c2mwdCEXIHtih<2%C=0<#G%W-CVR*Klw zW`ODEYdd3~n4Pwx&FI(QZ^+lR)$A-k+RyMs{9mDT=w6>3+=;jnS}ECZ!Q`D_g5QgG zxfhhN*~}z2%>3yJ1sUvNa}YZgZ8HkHBd!BtNk`z>2->EVWwG0g3t=bmbLjw{(Tskl zD5wcXp}iE4=TcFR+EiRfzjf*8G1SG0`Xf3#i)uF-23CH6GHUEK>T{_SnE7cgL?%cH z6}i5Cu3Lafd+SFDgNt?1@{z@X`djcd|BX-2u~#;qm3IEU-7Jn4=yWj9^T2y^d|j~j zrkq5JL0_B6x%e98l9_zktfDKjUcQHxIt%&m%rSpM-Au0;xU|j&Oa2Er`ct%ux+8;d z!e$rosd>2M=lC`SG^ugHKrrX#$X*;E!~H0pBAaEz$M9t8N9m#cHBt0_@NRt}Un7s) zk!$)EJds!HS@83lG>FFN6)A%!n@Hv4nv_FDR}#NNd+XKn;v4fL zzX4qElUZgB_r+QH35whbs6ah{#;fxOnV`vOvX9S=OhKL-DuygTM=k|@d#da(StJ75 zL|pA6)m`SuuJ&h{hH3yt9cWQrFKY7v_4m<6;1en->>DkB@BhKC!DmjB{~X3Q_%t?` zJ|NWQ*>iGQy6Rv`$L$oAw3jRMD<<%g1(w^+K+4ftJ_j(h?l_b1A8{`Gd~V z8}yl}1#WSGTk}OIX74PnGzw3bjnGXO=p>(>Dk9H45&ZEJJ&|YN-aq@#p?ze6iZ{=n zh6>+L3(HEWsZC63{f|n^MXjYfeM3F2yX+${%oARz9r(^;JtLzv4c4@a%_Wm?HgKV^ z9Hs~0C?(`48LT+j_E*Zp8!`5yvtNr{c|w`(Hmc*>Ykn?|T-*ix`w;xZ6u(CoU`H-W zHq^FUl3nz>?T@#|#gcMDYjGB>j#Jx{KZoYDk`_YA{UFDs8uAg_p&<<7!9-wt3F(|2 z#&@X|FOf5TG=IX?U6<&Y9+uf$8Y*cA$)hQ?7f+HFaux&O-rDV4iBs~PnBVZc5nyze zc?+M_Y5u0f<=^B#p9%fSBTRyD7M<)Ne=29Ns3UiFK?ARFs3&cx&J2^*m8;u0njC?Th8HSHl6sIknXWR#o}=p)IG z{Kb7*k1Qd^xYE^_)>@SNacpOEL#TSQ{2Z+53D+6bZPoaJoaB+H4Qk30{cXH$eE&68 zK1wIsqME=5WVI@<#pOtO`J!tEJ5n!{B(el7&`3_4o8M?Hp7N>G_qBAn;L0sNCZ}+9 z-E03PXVQn-4ri_`l%HRbyGtl#^m{4DCBT9Y(I}106IFytmmM`Klc02rpb3kHdnI)yr+M`4loT3^1UJ{-t4&5G>t8bPfE-^HKmE3R{-xZxgn_pF>sx7i|G zKvOd^i{=znw=X4)Pa)%dI&>9HHy!0m?AK8G4Z2Es|61Ci!sadBb3QD32Xc$?&=q!) zmcwh^l;(Pp^ZLV*T4vzX71G!AOpfCEqjAtI2hu=ZA#0=p8|d=gbd+B9rFaUXL(rW- zFPC#+)S?ZBa#UMm0Rr-K?m%itu=0Viyfq^ zd`VkUV`L&C6_i>YiwyZ*iJ^R)89Azje2VYLV`%|Ray}KJmB^>8)C$lCFVZ$&fij!b z{2I!7Y1%(7P}@+fBowfj_B%gbyCD7) z){XFVUr8(Y`=nY{$4e!LK_O5YE}3*3jm&FvWDq;*ai0J-A+VZ(+BqB-&l~6gPK-0P zUvugXed9N|v--|I!)IsUntBB5_DII)54=~$=waR=@pU<>KUQ+0a9LEse1nemC&&%v z4sU~ExB``B10wU#1aqCX_#bUC`1l{?hW_npa~qnE`i?7-o1dXptr4ton)aaTk(D$f zd{S~w7{>TqXyGwHPBZL}vx@jonam~$(L>cXm<7GD6rQ{wVu0A(oSuzuz&DVUeM>WC8xPX& zO>*82ZT;UKlc38#l!Z{puG$^64Er;UlfxraM9yIsP(m20HTqWByBZn||CL*d zYkJ;cKi6*BRA*{Z9Ts^;*JBsU!g@+^Ic~sNB)NXY6)7$sbbB;D-}evTgYxh>n&xj& z6=>06uFMT+Ca}qDXxj5AttQqdu(p-5n6J}tJsMM!6F}E*hYGC|I+RAxHyAZ?+mu8$ z<|U%XF-kzYc%Ur{RjM$e$O!n>l-S{P@)dF+ef?U(yVF_tyR%rI+_VNc8lwmNQoaRy zZpy4n;8*%neqF4GY=OvmI)_WhRrv=e^1ROlAC6vja|3FBS*&#}>K_>*^4n#sU4u8t z%surHjll)qN4N`RLx$T^BV_eXXll&|Pmqjqq5AP5PR>ANf<97i=&Db(J4NzRM6(&( zUD9YdTG zy2Iy@mwzYQ(ecvGo}w?Mu>OR+YAtRB_3tNHhMZn}jA8o8Cge1>mCm52k{+3=_fU{$ zQ%^Z5L)=XN3MX@=KBupAk24`$&Bqxv6>k;YDp~xgc7ZMdd9Ut2S)x;+{Eh;4NT&0pqOP;abvm7PLtumRv>x(2XHaP|5BEdF*LgMq zzuSs7y85=Joq{@z7f?)((F1s<9{x6c;a6Z+N123L8`UKrTuS*}iUC93Ks;K9Ri0r7 z;uO6`rf!YBfYbPlUePHk#}{x8j#3%y$s?)4H4r1K!5>ZLIyiCYR|aBFrDJu5Zt&gs zs+)=$oJiC?SC{n^Ad~aRXT!H8(L3A-xt(Nk-gnf>{K3`&9=%H)kaxl`X@49SdTww< zXdRUML)t|fz(4oKIu4UD+S+H7m%f)4greO5S?Wmo7Jecw>}#(V+3RcIdCDs47+nf3 zsz+>nI;upS_yBT|`NPZQ6_o%MsjIVnl*9|);~ylMexX+o9m?xTeSr?15&X`E>WP z_pH3jF7kO1slJs#*oP$Ahu_F}32Z?9r8a*fuXGE2Z`YzX=T~IjQgMEMCg00Wn>cb5 zY`P>RjNBsDC>0(KIN7DXv=~Rl;BMIr_J}!MWcehqVaqgGv`Z%&Yk? zAwEL6(GUC1UeWKkx~@h3sF^tpKiXHrl9sz;_1ke59gIq+vN}^Hqavjz7Ymo+gu8KZ%1#g#Rri8%v*!)F1iHIK!g5G=3^&c+XXmXR#s~>O{hOnFWD^FfMWL& zGF&oQtMGaB9{nm`gx6qK`b5^2ui>9cBmRy-E^r?_Zx8Jz>9rkdC}+cC3|Cx>jz9O8 zIvlClxfYi|{_L<$(~hW{7|J{O9x7Si%1#ZypfEO5OG+ht;z*$QH6|VG>5`<=YVhr; zxuhhad(s`ge7vB73nvftG+Z^Zhf4+a_BCB|J(Ojj+yxhUNTtAr%L6ke3#S2->c-R1 z33n3yz5(`UHITy+sT>Y-#mM#c9R37cf;{~=uBQEXf-?5JD6i#`@DeQ}Qv*kIM+RYu zB6d z6D+e5a-~4nzzWOtosOqEV0d$RJHG`#%g(vDArC=i+Blz;XX;UK_?5niKGJAeL|gbM z&4sQrTaQWX$g8AKZnnt~UCJr-ll+CQqfy`)4wKpXTC4t55mw9>%`IOOm)q&Yd7pNr3bS+InHa3xBh#5b!6-*JH3Y^iM%OEeE znWu3Z4#_|K53={AaRS@>%XSdZWOkd2SIIDRg^l5n@Qw$;?*{4=c#Mw}P#^x55`{PM zI9mliK2bOkkLMS`S@Z}OGo2|fs&v*;1FXOUpF~4Y4q9qmSolItDI1VcdQE*0ja#F- zWTOpf9`L1~VVnJ=iH=1L)HD2kGw}041U3Qhfp`sGkQm=Pj^aSAYh-J1Y1G$N)byGeec7+bdyiFG>Dz0Ka8`JhK{^I& z9ifFOeq>`aM;iiDeDd9OLNG>ma7o_H2XzVlwj;feq*_v|xsXnm;`|?cLTcdRfzW?u z(LaqflAdCIEA(G#9mYiL(9 zoFDjmgb_EiOnxK^PotUK1a&aEv^_17Y`lbK!_G?bMH`>50~e!j8@?H%G~lUVk^Dlh z`<$ErXMP!wQA#j-hmOYQK(x&{5&sCR-UdC}gDEkp4)!2=Z$ejEG)-5G_muH?(sJOw z(*+}o`Cn-6-)LTo>fP{{lu-M-PK@3n+%j?2zSIr6&rjl`=)vlb&nT(2_+PM*Df%l% z*^3%`jr2wy!yV*~+>;c1)NRJIOpz02gBC;Wew=V7DK2N|y%fc752K!(9315y&U8Uq zDFLm=yA_x9vV!}|xX8w+K6?~%6I{BnnWd@0jhmwvoPi5}z}n>jLi(1T*x3rc!b!t1 z`T}fH#C*@T*XW=oQ0N|;%I64|1ZKvqVYZ%p z!gJOEioON!zgp6VYH805jlSBxj|37+CS-ouMHG=k(%L?awBRafsaoQy=Fc5`$?$> z4Dp{m%^hHoxhWSH*4}bZ8&hdS^Hx+z-$-0J%I~4G-H}QB1yJ2}Su3r;&K6NF{A(EX z(7(zHWC(D}Ubs7N^$qBwPl25)4u$SD4dQ3`7kIwly3~X>_zwKIiX7IX++I^~oXAU* zlE3C+yhc01!yKXxu$Ie+kJG_AO7jGN5&L(~PUnSMOXf%izld7-4hlt<$Dy|`FCr~) zKZ`6x9899w;8|vJYQ&8yT$HQpOX)9b;Ps9}$$UX8q?9)2^1#6V@;LaUEMU3ByMdbq z@*Hlfr|=}BWe}9FNj7Wv2K1kU(tU47F;lZEN3^NG3GlSdcDPZF~94V7gQP_){xtq2nkPAj} zNNknpaP3JgIQAB&KdC&>Vl#bAxEen+m%%{fyp*R8Qi|?FrJ92Hu^fsvUOAsUW>6$gWyH3(|+SL zy#RCRQ5!qjxQs61wtU&tz5ZXLQ@hevYAbc7uGbzte4W%1)Av^2zq+dfdxQ65@YgjjNEsh(RoT5406WJn-^P zboVC0PQ~DDexdUi$ZftpnGz4Ex9ho2Av^E2?@9GMEG@g!FU&))zw`kFjId`b#7 z7pw1`wlDCmnH3e@wj=#)lZJsR1k8;K(gum5f#?RAK*uO0s)91eFS1f@(+?bvHjrAEBECUzOZD(Td#)_cnHekGg;}svlCkIb{%6(TZyD z-(_KEi6Y<7`Oq|K%5`Za-N8u%$~2p`z6^ukD5aHnjBJpzR0`-xBmu|Op75@ZX(DIG ziY(#xwkXGE0#jW_S)sHPl-Cqr!!%AO$$R^fCV&Tjr%`qUqYEAgFA;y`7TJ1k0QPec zP2qL$QCFdF@3!dPf;XzJd$C`gu}0l>GB1@lP<1||Rysi=q0KBnJlP^Q?H*GJ=U|rR zk&ixs&eV~-oiZ}|RefjNlw}bC4(dnK(#)3|QVpw99cXW#EVQ$LQI5z;?F5e4jYnw- zpwAju+l1kK{2F<*zvzfOg`^OVhyJ%y?&$^@1uk`w z(#Q*-ldaN@Gs#xJPFG8LjmO#jdStBA74HE{cK?7)K)NbIQfD8-G1;HlH`UA6d>->d1ud7;z|<`UdN*T7;w z&>PxGBPEH{0t3ZBYd?;jNkXm8)u^i<2s}Cf=O6X6_BC>}6}T}U0v8&o3$zq4LVR|3 z)`P&%DR{P=#{G|pc`k3DV){2#(af;3T3QzvW*xX$+Q?Pfgm3H0&<=k_*6T{zsd=zl zm60)=t~GcU{;Mz4-LX}9v5TjRfDv*4 zSsbIWdYo#*@^k3{I%9|OBmH3a*m#mj3Y+o0v8ksmxb3p zKtD+ep2VARCqo=QtFLGR@bY55D4n@3vT6J1s-&j3HV)X(Uv@l2@kF;8ey6f#L#_R0 zM2@rM?DsfDal!FN$u)bJKI(lL4<0ZEXm=u3;wDuJccB`-r6!I1o0jq{aIisG{Rx6z zZ7{vkyhO%IGiXigX*O227Zt@BA4<(QK&C={bDhL@WV$^BcFDQOAA5qsl2bi;kkT^nmiE>X_$H@+$w2Dn_n^mY4Cl~SU>T{Ty{?ok+FyZ0^fAY! zVcc92*bQKmMjG>W;H+qR2R#^fi;Cf)`~&@~OEryl4t67cZ}bOrjkMAjfd-D@cYjC* zUMBrGwai9!NNjb=9BqdP{Ms)>*6nMWp~w7uaKh_2Pq=Xn>pfW0LdhwJzNj6D=Pl%u zug|?{Cw}K+$C__) z>2TV#SIlciRLMU<^B6~!oy5FJ^XNQkh;IH#+#H(Y zHTm90$q!r~9BC4Fl8;cEj&XXPjHpvmrvnYQ)a5?*rtq$K<|I;50_aqCXf|+PZq7nw z+;-^VQ-K=u`*e86M5x6%<|b%Ho}t~bV@qipDvugcJ^4&p@D8(CMpJ&Q=_)9~8N%s- z+#VqsmV#b2h296aOGXaDLwC??u#*+Y!xTrP`J6*~Nvt_2=Me2CX?1!>4gCnsNBwvR zS3@`06LbgRW>`*05i}VbZWuquDO?FOS_~eAd8SFtUuiv#&`mZ1(dQuI&NLqEzkrT) zn-*(I`4VapJd}KcbJUvu34YePSd}A^Fgzcc$b9Guw^2W}pAPW=RBG(!#CYQTyg)MP zMoEtIR6@@Hx3vQkj@|o3QrF*?iTXV(EHRhYhxQ{6mnFcunarFjltgIB_ zn262#C$E<=TqXS0ro?X#)FFCPi|7pMU{xMcSGD}Xb&=f?!$%xJ(RmDv5kK-64FUc? z5B=a4BJ2)+sUgZ0er1#BxBfDvrKG-%&f!A9|GS_RjMi@uA5-xL{zWrU8|-X5s6qjCfr71Oa;Ac2gp#=CbZDU=m3q;DtZAb#c zej_6_gFWxnHrmqVh@6g3Dupvw_ek&oHeqbEY$%1qcs@FYWSw&jJw@ww3OxdbkNV1=8>88g6xEz`pMsx zoZvjo`H)6Q`pDF{!{DJ504u%3HEc01tluH~c32y6KdMM4+(N014%HWQ-65wA)H(@z z>0_!6JWA5cUz5*tDjlE{sEM0Rt3q9P0_E_BX%R2b*y^~XCL26WDOmv3D>YQO`dSV# zx0EjA`LsYTQ9U~^v{{c~ckkLJi08TaU!0LAa>4!pHEsznqTPN5&`Un9Dz)J)aO*T| zC5pe~pQw#)U@sNmqh`=c+2>EtKF-R8;GHkWJVK4{Wm`@zNL(83-`SbSNiUTh+E7pV z>UzT8ri<{3r{pv>*MH5ta0|U+YvCk!;_`_7SFB>+7SMDmj0(h`DT|hr1n5S)O@&}z zWuR{F=1QEElF$!cFeq&_>J;vXgqNnG{?EicJCJKO+(Slgme( z$5^g4fF~lCJV_VHY50hKx)RuOo}9#<&OlUsBfryl9fKWTPuFc_-Xizt2wVEnkD;&t zJ@|2&$=#9+KmfPpDWQB)p862H?3d^ho1i~a4{c@(Nk!aB)(z^S)r)o_?Jyk?e{hSo zyYjdx~&+ zXpkkq{bor*t>oKMN4+fx;T>+t5&cAe1i271a@wi1nlos6=v`&qD48!0rJlV8)#or} zaFz?&v+}L!3|~$?$LZHA~m?A9FjVSp&5CO&gK(TkMm-3&L6;vabZho`AbB|5;|I^ z*zJfEZNWxa`cNO_M@l2>YB&+a=V$Q7k$8py_Kuro{{~n2g_7_ZM2jNy)~C}6}5(}s%kyGZ%98#Gs(k6I1?0? z_)Z2)qAEOj)o7U2!hDfV+*oRpcsc)2(YbcDQ! zHX9Lj7g6lok3_JGuf%9dp9Q@*OX!~D9Gllc>W4vi1 z9tm!c5>LEFU&(E%DE0AsXQizCOD)YET4l%4b1>;bK(Lo}78I|oP<4k8Qxs~Vqky^A z%X`^`$ef;X1W-m%Y1f*^%Tbx3aeaDJoXw*p{A)xe2OXZi)FJe}|Cj1VPO*JpEnicN zpU(M#6}s|An~0<6gcQa5wx<=e!~LhD!S!@c4^9g%Y(%`+z^GzDY@A*&ZO1o*2D+%UY$Zy~x z;X}R^tU4LkN)N3>PZ2|F>02lROA#MWQ5Sj+Zk}0_!ouf6N4n(a@)fzP#~F36I*LC) zQ@kmS#X%h@sz;$YW#xF`rP3Rjv!rH+wwJh(UPt>)Ew3+2)c%lr$DsN4~{=y^*WFwtlAT%s8CdXnhat-PGsTB2oZRIs}e$pZdug z*PJoE0$6t?7nHTS6_pVG+j=G|RxVSvOqKFgt5o>^(=+)$e)@m(OwKXA(2e+qdt?&Z zweE-=>vOo5u8)5gN@Ev>hWZ8WE0dBN`g1{Mx6u7$BJ5`SBsd|{+%i;=PBhK!4D?=P zv^z{2o7AuM32hU9!p}!nNLn8cwS2WhYl7WAGRFF0=A=tw&?9Vi$MlF;VE3An!5OHb zecci}$7ZIA=AzqyZlnI@QE0HwXO{&(1Py?ZQqvBe<+Irzd^MlYuRssp7*o+MHWmG6 zGAT6DmO{_%K@?>-H?K`=`z~}brkvT}&$+BV2z_RsneW_c^l*Lc9^r|~+M`ty*ynCy zuogM_>ZYVEVDq5w=x;MJf>5P&*raid-F{32V|US|@&zcPn}+U|KZBG|h!5N2p+mN_ zy@;N@ayG85%mlyN-VY5zS5XQ0jT&ZxI~FW67ySg^ z#q~2Q(Z`h^-6~s*HI+m2TuD3E_YL;?1J;{gT?5>(+uG#_(%aX;X!9{ulE$bj7^!rzy&fk^FWX=F0u;A~4-DThQOs^U?mAJ?Xai&+t91{6&*k z?wI>QPM9i4K})RRX3XnCIWLLGuT_E zmCfOI1=9^3nP-ZIUYf5>R&?=M(>OR{3I!F+BwO6KcPUJMQ!7{*vn^E6{N>V8V=r!p zd}$V-Cu}@=_I?ObyA9?r)~y1%!!o(6K>^>&g~4S{9=ICxN}}w;|hiMaU1AT)Y7F@;C5P52P2)LFIX0Y$&j=SZi zuKz8R68*Bf&^I^}Jzd5RGM)Wy*T~)orKj2MM|aR~LpNV#%7t3)-sn88h`D`j%_LLQ z&$fg8xX|;^Ov>s0#jcNcO?)Z;F$kfXb&S7kiumz1M%Hl9r#PHnH60KJ-}d`?+|@2ucI z5Axd#c;@6jtC>y<(9Idgr$9$+d|S{LG`Cz*bIu*N(Pp46gU;RJb_JsTIGfPc^C^9F zD1&=%rud!q7<}5Vwz;hvdJqxq|8;fUADG+m*kdPrCe$FdaU(+)?2ynjUmRA@#amZ` zR@g2!Z3wldp>siX-^4xi(`*}C(tijw#QF|3r)>w5ksjcTEb{YwW?-@nWsKZt zr@8sAI8NJGn@Y#Kzs=pCm``S+fKWfW;jXz&YzIL#oCuFQ7a5I-<`KGBN1FCdgRH(~ z5GiSGElkQ>7)l$IbBED~9pyTixj|DiDzvrgeOu5}H=W&g5v$;jhx!;-%zSN+qlOfko1ta|FFYE9Z%*c;O*izCM#o$T{T@V^l%bu$)?jw1kbLW= z1+c4#j5ycHjuf&{=qMf^ig6v#MLjc+(%ZZ4D_7*Iv3M~9dXk!py3TY;P-X8&v zya$xGQdjdBMxTe|hw6hF64XumYEHci9#8{_Hd^C>hm;1c{(`^pM?>xSlMZ9y-Mo`p z`kO%Xhq#{{)d)=-?#xqkFfZlvHomUc58y0=pa?9G-z5pMR$HtIe~!<&0QQi8chf0` z4#=meT4V-J%tzqy>QNKjs=H-?)&QpeJTku@NejX+!92PmtFyzrg?cj!c{dBZTO~3f zc;sd1P@TCIG{`1&Ob0-Bx&sY)h9=Kd`n%+Yj-64b zXd>F<1*%;-K0xziELd6#d(yv!TAPB_>kR$DjL{?h2{Pr!G)n7Ge5fnw`4=hXXP^hx z&@6D99{Bz2Y8kf^hWg{_ajOqy))tycr|BrYBCEmg`cn}bdxvvtPDyv5h8z;yb*dG4 zC*sHl`px&`)-*vXLWw-bsq7M{-K%1n=tBKddh=PIfy#n=&!ZRA0BGnh83qkxgkA+o zK8id}aW2m5xvpl=>b4T}iT^|1TZLJ5EnUM{$;In$V*9!TDzq7 zMXs2_`BATQ=h4{voPGpqz;1L#>gfixIL+oNSf44F294(eZAdpB!AB*T7GR5g-)K&o z?a;*bIuE%vmE>8n2o+Qex5OGwHz{QYRO!EMLWKbu(DW>r`7m(M_6U&ok;N{a$P1)9d*Vbw)K^9yU}OmQ@h^&Ma_m(W=2v zKFgcYX|hu~b2rVvCs5ZV;>lc5D)U5%20u4TYpct*`Q)J%JPvvOj-KTHVEJm>$94tY zy&LxRG_?lHR);>4X!T?>~>dU_-C8f?1N7X0_&bzE73gESW`5baO;;$ zr1n~k^KnwS2ZYf?Q-bFW;Uk)z2I&$Fht7K%e90g34chrj=o-ySnrh)cib2i|P`(37)KoyIhjE2~fK}l7aGAj!Qww%c*!3l*^#99)sevTzdM+w6|VB z&KRK{x>rV^Lnk**4_YmqF>6+kF49UUHy6CGQlF=4YE7u~Y!bHx{So`xw6__l6l&`e zw9jCMS=i>_7|mpoXpHxohJn*MPtU0=>|>El?q>#1o|w1L2#M<==!6!Pn=^8}TN6?D4>UK&6elTO8Fz?i&(p#HC7b)aN*s0(Mb4ym5E>CR& z@R~cF19mA_4sJoDE+(r?GOTqiUMQc`qe{G z9S-i7^qhq8EAJf5(wpEl+uPrPLTkz}U1VFxo?tCrr`6@8XK5mKVF@_$PtwFs1fL33 zPkgGPt1)#}fJduuJJMRIs<=6Vf1?rnN_x>@@KQ$z{SEXB)XNQY51eRmW*v#Ci{rY3 z>dAdAfG+AavJYz#gjIgg%>0UjV8{N|7%+p0{O7SFr2yu+_kusp&C@xF|4;BZ*vb|5 z1`XF%Iu!cU0caBwZ94xX>dH&dhMM|QbuBoMJ@~|FJ;O!8q8y}Op?qwWHB`#Yrys$Z z{{XHdhRf(wym@K&cii4LQIA6NG2o>O;>qVx18u_lHI0kU!4@EkLg5dg2~B4 zl9uy83tElHSOWab=KpCMOSlPt1s8Y(Cv$cK1F{AcNq+ZVcuN^h@6Wf>?0m$_C~b=! zs|xKrBfNYI^#$u+Mk_L#H^D6KZh|Hc7OsW9rG-=#Jx!CqT2|xt@>QB^T;7~3S@nqd ziLRSA_`6&@!%RkO-M}UM|7aH0XtBAEXw0@fzxIBDPkqrVbOo_-3^xF0H$`(nc`B#p zO->C3NBU8glB?x4Cr{yj(RpLR=k>Al0dmjQeLn&AbxLDTr99b|8sFhtx4 zTMSYA2Y75bO2-S(A??d%`xz`?PA0CWcch%AV5Kc)KQezJ9-_GCPLpXfnNB}K=UYYj z6%$|5kY=;BzndELD^@8bx-6R@6D8#p_}@#|+2E<;Zm4ju#_MG*UDLWU9NOk4WRkVW z2MY;vv6_l=%2@GanXJ^Lu!zsv8xg+*mxo17(pxlAN=tia^;J2C-nD5FIe*l`U^~%g zuIY3fGEfSc2?jQaUz>vRK!4^N_`g^1Y!_Arr%O zFik#>qE)npUepEhge@(`ZjI4$=<3SE;J|4O>Qc4Sv?cG-_1XY_Fon{CP48_>@O8Qf zMzRDfVIOajb-)eK`85tC0UY6ZT@Gh`Ol@*z#sX?iF) zOCy0@*60(cEn%8P?*p53wej)1i=hwp)a}xfc2NRdC8@D5@i~^l-55GWp6o`n-G=P; z9X*uMB0#KUG6GBef_?f->o^Kelo6vQXEN)EaQ!#Xjs!Jo0rq_Gw`<~ zG}cz9*I?4`+I^awJi1SV`7^qe`ofm$>SfK&5Ab;-4{b7J+N^ZSt_6z81Pn4>?!b=+ znO>S1?^;8P=_2^eM%=Bpke8sB&(&W|WBFMh+mm3>ivelWw*_=DSJ5V3YgpF5)DBr7 zH_FWJj0D67EE)-QP_~`tF)#Msw0wOHJ+1O|cJ43Ha4%8Z}>AI~V zR!h@az7DP_tG|Pu%TJWm9d7#om*I?SlMZUbL?EELwI26_=_alC9dZ6&Q9^r{Dg z@Tc)QN|RD1;9`OPF*_(L zS?-UW+zLEW0hS!4B{BP*Py@7t(di9bdj*klkd)M-{%-232Gf2Cpzh6rr)M;~_`IAz z^t(j3g$%p3)rR^hWgArF9Bx_nqSn&{+!0n#MHfkoKIGQ!SsBjtkY5i_D8Dy9N?E}j z#r{kU1+ti^hdC>wLxZxob#ye9<#cY0cB7Mlg0hnfxRKh*Jkw0>W1Xx&!4ib_YTSJ; z3%HZwd{A2l7%rT0`r}Yl`wzH+)Oxa8dh* z?$@pcJ;~e)9j@v17UJhhT?#zBOez8^zt?BrX=Za{eFt@IC@{-4jyqXmm2C$zlQv<}vrR$J3){S81Mv+y=24N*FNEKhlHVAexP5ocaQls-e!%G=8LAj{3HW{3ffxJEW02j9bfWcj!~I zv?RZF9Mpg3xE2)6HjLY@oh16ZU81?si@rgpP$%>or6tU{f`>SyVW?I13MzL@3yujq zgqJj;+qTeO$lsk2XAjFo zIgMyIQI0#%6XCgCX*B$>CqDf{_#L_-FJwK9K;(&#a<&H*!5jUgeZe)ybya3{H^Y8$ zcab@+%@n7e`qOEHcF+gV(0@dy?E{D1|4cM$ju1b!=GE`)Rp5nRbfS*tT&TrL!MB3g z#k00Ekl{Yfqo@~<4>O`h?4pJJi5lXT*SmVc#K?Hq{&ds9q|jXcLcD)EjR4A<;q;Qv z(A)F7Q_%_I+BNX^4Tx=xv;*Sv5!;LEBU1I@ScyV3`5QU(D@W6o;5l8RQQ)vwNtoN5 zzETp&t?>~j_R3aR|3PHdu0Y;RQ0Fc)P343(1e1UsY5qs*%Nc&IOTq8d;t>BR0lINF zn;n)>1=%DeXW$<+skVXD<5qWMd(tVW*f;PQ{ulb=KKWo5b8=2WXK5WZMV12_fUl^6 zomwZCoxxg!7a|I^Mdr9B`*ps;?r1tNLAZR?dBC=Dcgby{j&vORSCt<~5v=1xMA(D4 zf$W9pBl$*#5R1veJrSnGfc||zxB;y5=OEDD!ugR?+;HBxg zGjLsy|3IHZP1s~N+9s>X)5);SnbbKjT*jNY{^TU?Y-FfVj=KSG5;{5ZqHcIEeRR9F zpe!7BUquh7vNQch@U&T2kLH*qIZQ=Rg%p+L$QL`bkpI%#B>l}<$pobQN^rxwX-j!z zCVCZ`Yc_aWO+>2uG=OV(uc2II)qHvcD?UZmnDqRT>gZv_(EC)LW;!8$LBzi8P>@r= za-Pw@G69yjNgXc6j=u|a^hRo^x9P6bp*(aReGPHE%oB+OA~<0Z=@P5Ju>+A$!oV)Y zQYH@b=23DQh;@roMy$LEF5+FZgzB4y$YMt*F=a-4ZXO(gj=h;cMsM{XCGu0rWKM=y zzn7x;HKN@xUcg%rPi6q+-2qbXi0W&CE|Khr*PFDwnJ0zKCfWmA?4s+Py+GO>Y<(R9 zH1Uu>(BB#cgqj%N;_@CD$s5r}8>SHy4^JwT5!HTkDyu3&xhN?Yrzn3Pq4t$;8h78< zT3AOlJ4Yh0uf6cOOLU9S|11@_jBb$H^qx)xqp@b)IVI|oKhUSMUNUinn}TsOo*sbb zE=Ar`I*Xk+hisfhf1%Z!i?>i!M5%N-Ov?t>>0QaeQ-Lg6=|LU=2JWTopo;EUuEN>f zZ`#ooM=#_y@%Rq@u8^MRVaNrXn)B~hPr1Rfe^ z9_UcNhVGH2c)CVfA6(URME@{99FaShzgq7B33fo=V_S)pztOo7L5Veo=Ju!Pb(7d1 z#vc%|-jhqOX`J@v(*AA4^6I7~KZgBds>;ufTT;`y19^^a^F8cG2PE)RoY;_8eG)ii4X?^Q0p?`qt#>*zn z!wY#lC)WKq*{Cv?QU$h6z~5vI;z>El>F?IMwmZj2ciF?>IQ0!RcErqE>Gc@xPO(yeA`KgH@HA!^|K5_9k-KrYZqOq zrQBZ)ZXiN`RSCrj+Z3XS{8r#ZS5XH29xD|$1GIvMgKu%4mr8pHdNXkv=HgMBH3N7L;bPvcQl4cA(M z_=r01r8RHo2p%ctW1IZ z*)vrwyzC16Wj1;8m_~C8;Miym)fQZrezUF;tuaw10d+Hj!MkSH>e^Dihv)uhj-kF? zY%>5k&CsW21WqhIZxV0|%F5|^E@D^}#K|1UlNsbTZAUg&#$-JS|H@IQDk`EXS_Jm? z6jel3NT|U>X&yI}T6P!SdO39eQ1>A6(JbsqDh+Z*E~00>*|4uP@=Ch#cfjRg9N+?! z7d>1KdMBSz3OQjL>uadV4WV*=Fh}G*Kj#w2bEV7({+{Aftfs@$b;X)wK$V&i8Tg3I zqW(aJVH&3&hoZknffhRI1e1+^qg*Vp!{iDYi3=bOTGSF6M6o$5aNFqWb#6qfI?8;SZFV` zfb$1vX;feyO~QQKHrP^T|E&I?(UJ@h$(B#8eNG0)SPzVTZT$99m6LPmGV#*POaS}mH&e7O9vjP&vYn| zOemuHG~~}pu;6L@N#03eZV0T}7T=YH>+vqUBk%<{wp4yA8+Yo)dQ|MGxjX8lV!9sQ z*@QELQ{SPU9I$`N2`VK&&?sAy=1MZUhFr9kFnLHTc?j3^!!%Tf@O0$ud-5msgdf$A zrQlF<1EU|3+_W3DO9g(2DU(&|VrA0mJu{j&sinm3S<1%fM7DLr+UDrE$4xzQj7K64 z?A8dmZ%)#0Izkr!NsoZ~lAS-mKeOpgb6U>JW?+O#G8%ZKpx+z5-d~=C$Dj}IBcgFK({P%|3!Tbc?E*_thv219%#v*2|kz#xsST=_Go02Ak zXCi7{;rLXLi$O2?Ocy1Ea|XSTQP`~z_~$0m)=NzXXfVx^Jn-MF&@c=zjPgM4#BJ;^ z;0VM{(22m@eRYqWZmMxJ9S0_^5@PoYM6~7fMy_x;e;-IBZ{#;Ko%d1*x>s@IxPUQo zs(X8=IxMF=G50}+iiA~Oq!!5PHIQd-(ibo-mvt()kk#1bdo-UyvF-`zk@TZnyhhSX z6U{B7C^epSz1fbn9Ljw(6&K-tz$~A=?z9ipH^*TlErHItqWXk>CkOfaM@pq5%{Zqr zb#W$W8|PQPs~7AjE+XYPNRckO+c~*l!oc8WaVjgoArh|XIfl~kJ+oX!Lubrlcbjh# z>ZE|>w!vh`SG!V@yB(n}X2dCc2i&FZE=@^s9lxtlv;8eaG_M;sV;w6N=(+=K;uD(D zU#bo;d~cpYi=5Z`g{Q)^n(9kl!}s{-i)%m-U_`@n2~) zc#JM!dn&kdy$ALV7@9S@gFo9a|C%-2Qm0Tp_dh9*C(q$5h6e+`g4f=O2sRz@wv2lR zHWkUysJDNGea9pB7Afqa*k~YRIj?I{b%u*DCIN-h&x9D69G_y_ePCynAsEMqa}$Ux_F& z*OVUSF%f{W2fE>QmeeQ%U_8{uTHer|`MA>@=y$-4NNPb5*k) zx#lbK^gWt^m8r@*V6i*2IBx}lo2Iw5po>`nsLKbql2!zJFjYrtGGv=3G>o$7ei?)B zJSh!KBDcBb(p{3y9)wRCR0HKu1y6&el>+8^58M-i>^Vnq>xv`;uAG4gUR-OrX^}!nhjcl~8_6KS_N~CcThraY~^n3vFdKtgVPXlYSh7 zNF3{Ube+%AF;wZLBFTF!yFERT~A9fGL`214-Xc=^PQK* z;IOt?+^x&`%ud^vx9~F9=Wd${3QT99)2D)2K(kb)=vLFy%W1BlN-2pQsi;2#qwnM2 z=|cE6V2(x{V;1mxDT*7D|1-mAv<%hNX0|-1?L1w&&{|l~G}??9l|aMg8b37E{AGyr z7o{&fqm5J=D^!a&;B3zPye4>v^Kz6lrL*wz(HsfJHa|a;gEAb?na8<_NYj-uKfybZ zWuvJjAA`#bVT_p>7SiE}8j1ZO0CF^Bm@XR>(hbC+6Pp^=EutCcOPj0+`vF+o`rR#-AEC<$TUPHvrTWnX9}X`Q1E|MHHmJQ zY<>sI;I5S;X*v-CHg3awjjG08!C>c-Dzo{kk#8zAr-#^7k=avBi zh_!KNZZAMZ-bC{v3MU2{{Y(Y%E*qt>ZsA>aIJfh^7>0LGf(E>Yn(20fvvINVkHFAk zUYJv9ZN!?E$m8i@J4d-LqQ_|X(h+pKor_Z^%yf#z8chHTF#)`Lw3&sP@FF zfd}?QWnYGI<}cO8p0xsg+KXpRO$li=vP&X7a}THqbJdqybj=<@{rZ$5%xT?@Dtf8J z-Pnd33Z0~yNJ{!Kw33E%WBmGG&RjhLrYQhM?K!PP9ri|U=uL{$y{5YcWg{(>G;{;F zBM+YTwEXG)WvYscQ^y{eiJDkucsNZ{zDOZm4t?kax(H*Xpk{_Yt)*dLK?Z<1+6SNS zj0`e^PGBvvX>Y`d(*6WpCLb;IXm2JuO(w#Md%!~4@=i0H-q|oc5{yIi5!wLkLlYhV z7C#0%aE9;VIe(+oIt<)!6DVPrC;{`fSi|gOs;5n$0N$g8jM+TysfXonsle%YIrPUN z`UV`)Jo}PT$v+-ualBO&gLRAwL=x_?rE#(V$h4Mzm3dm(_TnmtH|=y3^7>uLq;XGj zj7IsGCzgLLCU(sZK12OA6a3~ZkP^CqG(=_~_I1VE6ae}ejn$egNzuRQa4P-^Uzkd* z!A$4FuHBH=)J`YLVBN<{q!AC2fZlMPTb!iLg;7iGl*c4`Nutbau*plMw>wZ*GUl^U zarS~$rRBwP6=!{=hmVJvNV?6R!_okZ-95jvb_@N+Gbn~8aZ#P`Jb=v>JnnCjQI*L8~+$ zEz!Byugo?QpNZ0wbX$C&k&8M5`pyB}p+jgUzT-XW*M8au%xqDtAX;#_yq{M8p~q6u zO$II`jE75RaNZk%;0n>N9BEr~Z&-9v@a=y(Gr1t}cQXG5vR*sBsx9#SIXQ|Baam62 z*O#`86FGSi$48#4#>ve#-6o$nRv$<}dOI1psGpmI9Cz|T0saVY>WDm<6Tj*@IoJo1 zZ^jpCjPwA`zbmQu6ZZiRQbzAOFWBcWoj~~+r$zWF*aO2j$J+}9tFG4JMfwE%#{zIS zeKfy20hOnwH{n!c4@5 zNU&jzaf)mYzQK%2VJA>U5@lV?y?}BuXd>#%o$-ykpcPm4&&zZ^N_7y&!qG?32yyYC zZ3U$ER1ZK=tD`M(wrvafWL#vDN+vDVWT6y7^f)1#C_b0aj`+>-l#V7M_w=Of?lQ{3 z(S9Q+`>{L+Id&cD&+oaoJtOgP)9GW$rt$pVG#luwK9A)F`jEO%YmMaMz)Pz!f74NN zLk0N*EATULU?uIL&G=9IShw;D*)I!p95{vY$Q<)D1arFv+(%B#BV~|ue8Ak-(L7g9 z%0&6#<-`8<(_GX9>St5V<$N-@rP}<47;pI@c>F&k7e`BDC|wVA1}Elww!YaWlPIsB z8C~gTz+Q}!C`1V85I{;kYR9^qR=?AOw2QX!VH1NWdl~%!v0#asqJsTE*|m;l0wQ^g z->k)Vuwy@Jc|>*GfMyPH67#(t#Xe<09P4bi1kg2wo%>#PQ%Z0GZRuZHsI9p#zm*^G zM1ov1je4WXoFbEL79g3*+(^r^;hpvn=RgMTg$OqXyy6`A?*e3)BFKo@`G{onf9A(L z6*>ExliRO^lWYjM23>>$Vu9%~C7!h4F{rGe68qL!0c@0$HxRq&j#z(hZyzvUK%%U)!&YX+y(VfH#JmoU#@m4EUs z4Z`}*BIfh~XRwLeQf{5DR}pzXn_^(Hm+}IzvW`B($-|iyb6Y$Td}C4b3-a3*%tl3M zayiZ`(VJ?)P0Z0kZhw;lOh1%7ZcI4I$z*rqX-nE^Y65}O*GW1Ub~T&kA;u?1_P(hN z)zy|do^nHV_!qV3Y@1%dzEWbDq|+z`o*w7l^D&x2x%4eHMb}9O4WQR+JAUmWM+EN5 zX2io=G@3JGH6K$5a6>s=Pj_uSPR8}^Zq#d=;Cb`;07W4ZjKOZMv3+<5hv+o+jlQqtk`TT=6MdK~X(V5>;k*DVBlM??*B6osK6V2u-Bm}}PZF@G$n-pUP!uNt zb;ZZOP6kJ`Se{EgQymI_H>~F*yk#*c7oCxfJk*JaWHoI0nasyD**94T?%u^OF2p-z znQ^GU*aRqjLE z4!Fdj^E5;5)8FO;)hF0FeGk5@EKlG}x|R+?*&2jNM^_Ud>u%Aq^pOe&UojzrzmUr4 zBaX}C6)2#2b-qbwl9{8<3WJkp@t1_^9v-1q+jEc(ns)ZM&8#(L3efZ$^vDmzOqZL8wYX6j3{83}l3oDErkQURewfs;x@)nGxLv?%WZvdf4H z@uk*)EhX0-HaYI2UWll26wJV3RD~76cl}AXY&qSpJ1K{o87#nO>ZZF8>yGJvc#q!P zp6+qDE;lVGe)s{z`mCA`9n{lM6J19BUIXG1Nl0!NS@|1BnJZ z9uIYHhzn0g7ycin96C8?(=g=YMjB2@fkq?X3zOnz`DLlWBjwV}1YzT@9sW z6`nU9*6od~MTPYL+{|R;ho$V2O$b7;rU>nU`ThHROLuZro!alMcG3|C8HBctpf`+p}>>03hg-jBA z%+#_?Bpf%A{flY9Yo>trR!Z2KRMf`W750)TZ`Wa>s*jW03(BJ^_3dk$#5Oj``4KeE z+fIZtTB_Q9!EC0q_bHear_DEqHnL1NfEV0t2aqEnz;z=LYo2&VoM4sP_NBcO@Epf9 zwFRZSPIM6KP0(3nHUWh^a4tikU2k7I|2Rt}BW6`DIxTHBa?LwT&s4>1G?5d0sQ8jML8hh290enK5=RyveawO;3~9#snvu zZ{8Q&fcVB4jGN-_1is>A*Ex2MX&Zjod23I`E(~mRu6SL-YnzWwW)op2Ibm|aOKcuG zy)eberZsX?(An-Cmc+67&9AX9aC6vQ@9#iXD(|fFLd@i#;C{Iqn9C__d*e>KJXp0i zUQ_3+=a_iX8|nX+Q{1L7eeD{|TlL1xd0FhA-Y?$r@CNp_mlHMm2kU!j5w*5@6EW@9 zAE%DKcFK4;!IjUnrEO7DE_lrO>}~gUJN3i&nLo{Sr;9lnUc|<;+nxAkhUso9U{*B@ zGo!n`2`>-qVy@b{e{tYg=uQNDs-nmHXRWZv= z2Rp|6<;}D&oEaXO54so6Skh!d*F|ER%(?6x!?b7rU_o2c%WfJ3-e?s&(d5;)W}Z{o zKJe-}sm(JJii)R%ZHOo6;bpQ3oa&f}tmL&clVVGlw3q};2KDKMy@6T2z2>ZQ3aG1r z@ytDE2ryt8Gs%oM8EB80iko%1*uwP0nQBfs=x)apoI~mGxy5$42{D-|fKSGE3WCLW z6ilJROix+l?6%iz-2Gl_FrW0$sbaSWdU!=B20X{Pzz$mi_Hh_?mO_SmVbYqyY#n21 zogH9)_okW%+-VtOuF^BR*-SA*O}M$G1)Rjv(clbUlMB<#t@s1xegAfli7sCovmal(EUIjbSH1{em0YAA=BT^w@u9tc$4ZjAuO`3m&&UX zSQE^HiA2|q#VxV5&9Pu(a~#$<*&cRgVN$Ol=G!98aOYz%!sNqzR+Kl`nH)Y9b8Sx`Pr*)Y6KS8r_K;B z)V8Nh<^g{5g)Ktm?B9U|!A7Qu(*$$1RRa5Q!{u2|y)T%QPUn@z^xjI_#!L-VvrFw4 zudS^PHl$?uC8x5NEI0_aKBf#z7Mxp)xx3QAy|@t*J=G>Un8A#+wM;Fu#GVdZ3LN$d z&|~a!BTNJ~wR@d#??JGGZDCWx!q++%?Io{YV7rqL(}f?sJI?&zo$!a4GPjr~9Tb>` zsl+Vs#09~H!SnWmSI%1`3&WS04Q4{1T5zms(L%1vdl4gOb-WokED{WwxWr~OlC9MS7n|PB4>hgoNs~3nDg8edm^|fi1UEV zAZM|&jYgPWm`L1#X?AFVUVOXG8|Q=vn|k+yE5ldfCfo6*tiA6Pu<5YV6N80mp8 zwYV#=*m)65WNTs$_l9@N$!NlyQ^A_vG$&UegL5kOD(#nzH_eAS7zO{oq1Xr(=2>e)*+IaM|_>;Sy;dfOat^VL~p z+L@I!+3RWZ*vU4=+ir*36wYh-Zb=^DO|utp;=o>e%`58O@#Yxcu0ogJ72C}GW4AhA zopCnQc88Zn7>fzXJFp~7k((FDA%|=tc#`GYydmZ70g3NZAHV;=UV}68>U9QZBY7iQzko0>Vr9`&KIyQy`cY0)<|{uAHKJw<6ze+uDSqY*0<^iucL`N_>RlJpe@QcCS2D|oC{lOSrvA5aUu1y40zUlVRq0(-DR7RU%K#Tz6E&dj<%BPfVU zWrmFK;=5}#zZnI7^{vk2pTRR$)ll^6%-|iINtqebnb}=kgm(X~-h#!F42tr9n?axwQ@6d-p950vv ze;KNwI!jA|VT^$OeFPlJ8^OtGsP$6wDVr18!uL8;`^gSecjr-^WrYrtAANm8C8+bL z87FhYIJZ{jjNFym*~zj7T9M%fh*hO z#Gog%E>F|psGXPb8h;zKLSYxW{Sf_4uF!COWm0HfOfg(AU7aGbl*`B{a9MFTPmY(L z1UEy{C8$nk!Rm}xrU9JXouspksUxlIjLYMDQP#z{-`|JA28U@ePaZzqA%8Ylh9 zV+ZU`QoMZ@ZlOW_EQh2S_t1oH0mj{|_MuLJb$2vXGzlWvCf=Yo%|DV>?;}!F1j|u0 zum)V=WgaTqc%__?r!DF@`qUtVm z_1utSiW5+UH4E6v`2Gbd$Z70Gysr|N$aCHG3@tb-R^oU2hZoK95o;&gI@|=D#~m)t2Qfns%Fn=04nroK?ENc~__3W~ zTFFl6vp8Lw6Y+BDCFfOPvwzqy+61kvgnwI#b4mIcUjI?5>RLIa&B0s=jYn5mLwH## zJk5OmkG3L$|B7sSN={RK9)kYnEwsm$SkG8*wKksk93@HsGeYxy60Sw`DI zj5}cLbMST{ZV#EN;b7Ar%Ue1JuIvP#<(-INDbS7BLzbA6S}5=p48vrdftV4gL*T=$ zz$b_EYr9gua%WAzZ%r!j&e=J?R>2zf=P)@-NimbYLqq5n)5wno=a`zWfN8G)_TmdT zzvH@{i@-C==w2rU)ztme&UTaM$ZqpB3&-8oGau1l0DrUftINNKJ!y1-Q2yJYNptY`xmN482~s zYm5^5ee4qZ1(~5LZUd{sm!ZDp)cIh_I?{SA&p7|wEHcj-w};9#$t1NHCwfaO=$+r> zJKg{ltQVKZO1DyU*|R=a`0hNqC_C zX={SDt%>XwCH43omjWYL6kT!UB&~FYJ{T^8{9-&r-vQa&k)qnu4Ts+@p|w<1w}441 zqh+)--=dPxR-z>na_$9F54Ln!5>scrYWB-at)e-!u0HV=L0P#MKt!&=YPMS;|<+AjlRgszet3dcBpDJgUyvPWsEN*VZuq@y-EU2zi^r+_Z<3;heW zrKHB)`c{>S>VH6|0nO%IgI1HA8-UlVhiA{DPk?Z6rkyRN!{8g==~F28nKfJRBGiq! zrURGM2K-8D@Lat>>G6F9wHQC4r^vgBdA6*P8Twq-F$<=kfj1+#n4cP1H;L0tT5EG{ z0cYygZ-2Gx;c+Vos9dZs^LXeR&Sz>o_g~%kC%*^%q35 z1XPcKiKGp(&ju6*>0YR*EBJOCCqtzSiOim2u@n<%TMrK^af z@2HRdL=F&eBpBNj*!y?#+#3Szcre)g^kk_UZ-)Ytn>%w3Sk)cmueO>)4snziSYkO& zV!DIX@55Ip3U-MbtnC|Gq#HRG&vsm>Du3WfZp#IY>xRUQ3$jnjN-CUgOOM7PLo z(*%g8w#LE|hU;H+AF(bz^5=c%h?Vfmscm9Spmj7xlk-1bW0_+IQ(~PbuPDBz#60eJ zZVHsKlY@33_Uj;2zE0j3&QG1RJvs>{&>Uu1+gF{y*Judu142o`Rgn)E8G1A21V?|0 zmg;1lO^Nir?a%Ri<%ebrw4w6ojcf&+c^fCCxIA4}NJ*gJyB2*Lh_RVWD^7#w`XJr> z!pN&CS9CjtfM>SB#_-8-4a2T}FgIy{CV}3!K|{0;VylCh;}i_764glwzlj!?fnbuy z0KW{UYZ9e}bPcMIb9$K`Yk44|N|=njDeJL@Tg?+Q6dZO8*W^?@0@0=^|3J|0WwS=v zZ&HBnQ%m*m)aemn>ihU_(p1Z7HOhuO_K}}DbD={ui~UF+xS%dT6y9Z37NPrOh*whM zVcNYNFO}3%-*(|I6sL;L(>3fs$r=K$X{^n}XdeE}J3uLQqZF3s{LF^%FL?76j9UVI z+(L?a@15k(M?l6mY+_yjWSxLo&;tGvSZLB?ts>zqMdcG6!ukKtrG+N6xT}H6(H~fy z3$#VvB5NVT16v*EZgkaNqEk@%)9O@2nONz>Yk>WVOAkq9^U6hN4=I7XR!SPK&lP~g zr*H~%qHM(T)TY1WRv;N_x~Y@T#3QV+s8fjte6O5!$nw9e-3%!*IdIsG<*U%$&g1+O=_?Kt$(*8yL(d9c4%GjTh z46~UQeTR2}wWH}6Vj|{Hy~OC6ZAW)>v+S~CG263D;(lo*(7^#{TW4q;R#-5tvVxEB z87>B$`G#cTcwAbG={|}L&yDFF19f15&X;mph-1AOHk9|#a;(+&s6D13bH9at7KvW> zcAS^T@gN$3Y5QT44b>f#A=_7RnvWJne^gCfMng5)=>gO;6B^SURLfP+xpy7Ah@MFf zr8pZNBhiRYm!&e#HI0xrcR4lun^>XmxhkU3UUM3HUX=dnouPx&lMCn~Il?;;&4vS4 zo<(L1(?xW^JAjpKgukl7mN%Oy-pfO|t`w#(wi6U6M~8ELJkw67J&~FKXZLgJ*LvK%cO@%DDOMYbB8L#uOI<6KlFQJ^a2ihCNS%CrXVda|Q zjZ5YU?a_r9 z%EkB=dJq10;t?4Cf^HU|{8D_#X49_vlO90^i=jg_7xhC@eCK0953XB;@1o!ExEw=9 zN)2^B{9~8n0$oWBCAjxsq`e{uk#v_2)k3E*RVy+R7HvV{#Pg%L{3z z7fd19N=bl$+UP0h&P#v;H%K(i0Lrm6kFT5d`Wb9{9<9ku^mi|v7I#(x3%I<^nFc+w ztQ*Duno5X#t=#pTo)V%W424G~;{VJ$XraY9%;ZMLytEjdQQ_#YtB!oW6`r{ewa93h<`mZ#x(}T%E9tP-=Y1Ma&&v=X_(Ie~ z=E0UWQgQTBMVpwU9eQkEhkL;H~mm*I! z)z(gKVDd#+vG{%i{5mFZJVivQ#dscIgnN>OPr{DVm@KIGuG4hnzJz=a5#tA5j|uNw zZZ>xeC*Zu`cAy>VYh}$WI5i)&aDLu}|I`?>b;bpfWwi4%6MyHDSF zNr9&(awAw}ULI*2zRKTmQ((z?i0W%-v5B**ax?|8_BJZHgy@osk8Jj%^yRF2$jK2G zk2H!;U^jn2#OSVxIW7KwR*ts#I~gHak=++#Us9mfIU%)?@na~N?leX86;Gf$9!?^J zCoVPH=^|f{ZO&y=pHs`Gz&=VP32=(ZR6fY-VO95RB)39uVmgfmo+Wf$M=QWF8rKCKA3Rq_8>Wxx3{8MvH-Uotkh-2SW6&2eP^PI!Mf5uq)b+9V5W#lYlBnAv^$V5L^!^wLL%lc08)YyFgK9Rf zez663vV1{(d4p2<$7!1#2&6ucH{kR6%rQj6o-&wc!E5gTf3yd(s0)m4bgWF&n&9c` z0K3$2Qli(th#s&%=nGO4LgN(ka%3nEH{>NYvD+PX(*m{FLX*kMi^`)k)uJ&}Q#uPN zZo@O%WF1YH7|!T^&yBzte2_mSmnip>Ht_g5+L~H|d=;MU+2P#gf$Mqi|m{Iz#DJ=EuY=lla5&WEF(` zlCZl8x|ok>PsHty=p!$Mwf+_FK1M<`1DKg~Zrpt9K*TOEBedVtq=2ljtu@HYVex;1 zZ=WKK{jHphzX8Kl)2y1FFH2JTSq$kEh>ntgmc8fUQEyy?i;L58hyzH zQJ0_7p9!a?LPgJnJ5>+sMS6*RHJJAEMXJif?IV*3NVOfRrkm<$N)EwI2c`HdCDAm% z2KzK8ut-rs2bhnlip$y<^VP2Pl51mFLIIs;vw?G{f<1VHY<1QiBHZ^vbE!DiwYFq& zhfqrNaD+%3`a~BcFZN-E%%(L|MH6d;hcg)T0=jlm=^&FE{$7t;0s&RvGj=-ueu3si z{!gv-_&4W*-p2YziAR}a82_yMGzATWNA&{7TwCwaEX2@AWcFEFR{H5lU9LBP2Cm3J zo@6F*J}$x$GPlZGO0JD$Dsoa`ud=wb<2&Pg;KocwCpB2zdC7%D;h$f7T02q|;4fJ~Ym zk!T|-mp4=mEM#LDZj%YrYM`nt?l;)xdNts0#?V}zLU=0l3C43nIRZU)`?WHre-7|f zoM$qG*W2faKQ0v(oD@uFEOX(&R+EH}&<3g^i_AP;BwuVoH>q6b5Pz&r(eR-6~|O!R+GkZ$;D^=rdIOA^&qS{2%$2hY_ zQHyc~o}&@L5jt4rQ`{*Oo}580OKMafg0HNA$aIx=a8ls=$v~vFp_%PQ%`udl@^SfS zC%}Tsa|xcyBY>}m%Rx@0H_Rc~C@-wz^+(>>PZ7ZFdyrc<%OkKe0nWkeVOiHHF?^sa z716_3ncj$%`Ry$Jowk5eFT=gfKJ*r@Gzs))ElJye)Dl858NvCrgcM}L^Nc|@{)*kG zK`*_hK=DbD{d;q6TLl`_T#cKY3Y8`Li3Vc@Gx{lj3>Hu_w-6iJ4sJS`py%FQkNJmj z$bAzv3Fn4?{VCIE8D|DkDuycjp!sv~rp?5DbNl&5HF#DXhkEbT(fh}AI7sOx}O zzalsGlMTo?i?oXWhC7%uh#dE9ZhlGWIFlyl6{eW{D4#SIm>>X_tAu30T>Cn_t4n#2 zQ)(fO4@KsGf~QQQr@#V*A_K?QQS!SP%KvE@eI==QqizBEy@`6F4X;Lxa8ftHOaA8V zoLJLA39LXX5xtve8jjVz)ENk4q@R-70Z)f$7VW?|<4I0HodlcBhrKgiLVu0cwDnMf z`ZPiV$Tau4E_QgY)Rps?AH8qC2ik3{lfaS9M&8c@o_aYw;c0T7a?>{FJkar3n+CZ3 z0a)BZIMZN}j0c+iif2oV_r5Nn;Ob)SV7^UjO)d?%0r>ewspt=~ixE#2QwDAepWQF{ zsl4u`dAvkIfUxs1P74oirR|c1n@V1)VauxPh0ts%XMWVIel_rsWw?|X02^s3b@@NW zJ-c*R!U(52>V4Gm{rD$j?OZ$#NGA!ZwA6f5ZUl~+1z?U>fWH`JFFA2HOK+z&&QWTF z_s>r`!G9#xA#&Qxm$%+9pup{VRl3S+nMq4*e$fkLqmAwh$? z26rgr>~F1&7bse+NU=gGQVKP!^v(R<7;n5k-~aF4ak+#f=bZh?T64~2VsLUp7_$kT z&G3|4sJisW*;uR%^@>zS26wy}N&&Z)e8vsoy%TwkCg-V^05(D&JYbOoaPZMuPX1!G z1Hr;}Npp9)jdbo$c4{iz?tx=o-YGelSHJOplMXb4mdjYf4OKOdoYlk9hu>g_F}oAkvkor-Z};e>d_~DI z#Vxjxw-!%yTh7_`SgoI^H1|X-4=Dukg<8-y|BwUTR-TH=z>@q0?4{sI z3qp;_;-;4*Si%5w&Z=D1EC(t$#!=ukt;}`3Vvk5R?AUF}s$GFh5ru&!{*Y?Hs;}cb zng>t21B|+fegwn+h?vVuytkV4?n6YlT-}cQHj757kvm!ooS`plY)$=8)Y_JBm_<>2np7+7&NdjWuWdB5Tx{kR4%H=8(Hvj5@965$%`|1^ef z>gLxs{F;|T#cM99a5v(BPD%kK?bFWi5`UT(&^#K*0GZ7fw5+-KOD#-b`dhqqdDVa|%jJJC!-qf6PUBwak+c z-?Ibh6*F$$MBIQ7_c~R>src2F<(}YxziOiG2IMnT*U^t$3H3s~poFZ{l!4@`!*Lwr z9XDY-%+|yTgSmifmXl)Kp1T1T9pQ2|C3@N=>ev7xV_XV+r4`4yo9r$6D7!U|N5RJ` z6sq3Rfxn{%loz}TxnmNfIL*PCot)Z%j_YMvO?|W>)dAWp&z~4{vGP^|FI=;IrJ_d5 z0Io{esF(=s^?d223D|jfX(%5<^k>}O5WR}0i-0azNq<5`^90@m)KfD#YC>7%Fl7Qh z*n;egp1_M8xfd^yJzNfYTyg#yxm1yN zo;)G=ZNzbHE5h?2|^c?W-0*5AO3 ztl=`yMG_oDx6O}y75=f1y`*WljG#-PRP|$cDPq1Ep$n{~5PvfjgaUm}j_Nh7=6B=4 zb~e7hSS#~>c&D@U8pu8jpZpWPk2P8?cWIb=->&Bq_KFmD;elYGqrrZHb}JM*XdSSB zo4}efBJ*UcE|CYY^2Km2E755wPbvI|GM6&}?d}0KSuPKN555Cen5dU%Hl5U(xY5gj zr#5J;*-NSQXMXRrbm!1F%$!{d=t;y)KFAbs!9qBD-y;vKyxan=KdDb;1Uj?CBO-bY z&)VCTiGbj3si7xc1CX`RgEMdoiVP0evu z>PZ%=!h5lTpP4Dz+?|Vch$gHe7u5`YLCqnUV2ODCJU+lf&~1JY*OKw{kos#S9ctD~ zOPygmD`vf$B6K7>N; zJ_YN3mAaZkl+*MlrlxiXZ`5kMLsLmrPT?X`pSQ_=*tV%=7gx}9-fm#?dU&FZ@LDb@}6c8~di^XU-a_B}Mit`m=rnM&M3mZ8#VAv{_X zHP?rE|cz~Gzi?+q?6RD$82fs`6~pO@vB$);z$ zW%8dSY6+^yy8}OHY2;$$(l2ZtG&XMX;9U`hu;jfQG$`Zt{DbNLe`*;wrVE zQlw&35hF%jOEG5-r)e5+US9X49Rw~~9F}4YB0#-?zN`6TapOnJ7Tmih#BR_G;I(Em z5W_+p73f2il(ZjTmY&cC`fwUON#9ZiE+A(mHM(LFpE5ytY9e)=HV3b)u6Llar*_4h z<9W6)Jbw)t?G=OPPk^@34a!nc8cqM;gmvPnX0l8(3xQoCb+-NkJ2S`2#VK*3K8N4g zB3A{ouX(oQL`)(ZVmF77Q1}K5N{(o_|e7@EeP0pzT46WRR}VEdGrB zV6_-?4mjd-#PqvTXNjbD@LxCO1Fff_SZ64g^jbpUPrr`X%V(X!Ri2~4)F_Ms?fsm-J)ALV1F z6OdF-{!WfNVNfK_nN!l6Mw@w2uW~k8d!1O?#azZRVX&$V| zS$KtMU@cMLRTZ&5h44&+sibVeXYT+wZWdwLa$ zUz}bIjG@(%mAeFr1Cc{L=H>9?Tk+HXdgEvpl%?G8GWGN!*8}(6E^lcCRe{&(risuz zAK8nRl=+7HL0v4#=Ox)+&)4}}iC)yQoA@Uyy8G3n6ym+aeVZ3)Fdu}th&0`k)wFk zr@%<_q!4tE?`bwvsF$`0vJwa~2 z3TXv=7^w|#k}g0+%m)?FlSO=h(rQM;PA~Fp;PK8n2s(H%TaN?Wn%C(93e*3jj)Dop zKc+%Iui5gew3R&g9RuZ|vwMxFLoN7GGT3p5hWa#LUQrl6eJoIx$2sAVd-4{p&8H=T z8v${AMW-n{)zX6$Eo0$L-^f;2sGWu%iH$ZAx z`5H}wg|33^X9sFPSQ5CGvR92CIYt+oKkWhe0ywOpcULOm^Y3!<@f8ijK6TPI;1ykP zVvpFrrJ4MY>|YVn{#L7)8L&D}q&qOdproaQ4tBZ<$lOXSPID|}fG+vQDFDBk68EK; zevR)|;;h`tX0VyG5%#E}xf|%slc8oFm!sCVd+Z{Omv9-5RSB0EdzWre1t}aj>J7zu zG}WB^(Ke>ZJO;R<70;&OS`7NfD?IxOAmBkjRdta6w?jMI^X8P9BDZkr36ac6R0R6a zJ9CJOf=%?}Fz+el@Q>JL+*U$(zSMUbVG_b@XnZ0&fe6EaD$n3I?qR*c!OFhWC|U!w z6Q;v?9DLn$p#NOh*~6O1)qwnaP#a*Q$-GP!Gh(Rn$W)}loJN-N3Z2U7{27u8oNg{Y zPXp~C|6sRk@jy4XCfQ!Po!jaiti^oIq~(DA=J7UXgLB%n5%i9d8UO#)OxCVdw^og6 zHEY-Uf15M;e}4M^s+pXisqHAc%Pt6JL{(iBCK>jy4ZLbL&fc|a1552?v%^H9Qm2f~ zXJTbo;Hv%GrbQ-XDO8G-FeRLafoS>Dn_}yt5(V17_ob30`t?*zrImN3CoAK77(!7${?NQY$mYb~I|TpaN_LYJ4&{bM0b# z$Ga6MXH%Q9To(%55HE%F!YAo$el?u~aW=xqXfN0U&U|OL_rQDUrLcE`>HXVYI@A)S zM+MOfC*JwX%YrJJV$Oc&ebO2_;bgXBoo}22!Cxa5c{5RqG}`&Wn-r+;)bj3NuH?1A zP_JJw%1LiinE?*6x+4$)%(V z_G?@Bf2{XpbTDwd9`>9)>@+dOjY0HoxVi2`Iy0O)cCVMlhM5AkxYN&+mkYt;8kba^ z-v)lQ^8+nxOL>KJJ`VMSf8mr&H#O$|HW}*GkI;fOw@3gm1y$eoO)R+ASHuoqZ z()lamm`Bd4q!6c2&b!!G25Jy_TRv4?_4kkzWU(YvGvSYClxhvzVRG8(`%qR zz1fa>@4eZ<>CSW~)+=iZ*{{8DWFY+DH85FiS}fjgsG)0x{sK8{qOF8e5Gk%xids?! zN+-pz8#k~^C1kL9V4vA<;HQdEYFQgxOY5bzw4oSt(WH@&wyDexMtB8LBNh+TT2Z3q z5bVVQ@Z6r>OsQ%H0Ew^gIz+?}cG>o{1*oLGZSu-o^BCwMjZ`H!FkI%?@65N}R4A<( zsVu%aZeMsaX@#h1A)lB5vX`>RdYe|($^~bUJaF>E+Z2=;sASu1#@eZ78~sU7%@y;+ zEV4U2KX}sQwLhA>$df4vEwZT{BL^wcT(|qdrVGHzt)?APnBJRiHdOYTVbJa0p#m+p z`vV_x=EE+u1w$Hc^4X#`qj}?XvICuEl0MLrsyM4nGt{hx*a%tcjq{E|*wKDYSu>yhkRm1(lgH*eZ-iMUpPA25MOe)X_tu#qPGN4~Ji`Rr zqNbe|Hldgj+16U@@?YK(Z)^awV5x`AZ|6Fr?Pc$J(D$a9;&zjF#GZtWtVtUKDZTdI z6g&y0zniQPZITMmbF6zV%IY_C3YdCc9=Tn2p_j$6PBD|#85~@L35QKk@14~t;9WF# zgKF=aFw}m>Nf^BdT%uMHL!9ZRpfi(lIO|c#H^t^K>ud=xoAayLhHB~{Jir38$lP}} zds!sTTZ+2u)u>k38949k!#*sOFU?ka*L!3`ozu3lU1ztLW%ft!$B6V4=8Q4@9Rb2y zW7f&@q-RcB%I};oDR73GIu)Ip=9LpA2TTD}olog6y{#hy!H7a$Q(M8@IJ_kA1`2u$n;BJnVL|qGn|*=2 zUVhqUk2&SNdx2=v)thRHc>j6FyuX|hW`u3&{TEo_thU+AZfA*e&1-}G%HoAfoO8ol zXKUJ!nl-f>qmOBjswf zF&}|FFH$*e4fXJQ#Lv3PCE!F)PxC5$34Zki?5h!v0Sk=;D!ZY}w3Qy>u|V`&!5&yk znTM#!N$*E;MdZ8Bh3*sKPUH=IL_Dbet-wJuNotLeKHI@@gfk~8rVzos5Sga!SaIWu@t6XfELq9{|)Jukg^7@xDN z`K_!1S1YXPflG&J85PrlKTFo{p@gP_F4D z-`GvsO`^;uZ3F#eB7H8aHQL=^dteoclhvg>O#Zg$QKU_vmZaCukkhqOvgm$Ppk|ib zl$ER6-%T&tBgdtUKGZ#S78P-0?NhL?OI|lsLfo78*dF-q5=I|asC1d3b=2iJzDYlT z1)TOrM9_8oAj0BwZ|mHeXPYfzZ`{cCS#C{ItFCYH}ZELT7 z(Ll+tUw*ldPc`;T-%0ql=cm6daHI?Ea>cO*SLDP}J6MyDWnaRlEmGo+9# z0Ry(Sy>3E(f>e0bg4!EwHjTbD=n5~tX(}Efzf(=wMt3O-boz>Xh=*9g3M1=qik8MQz;d+Ws6Jr^U1Yrr#w}8TU)wiSvw13b#D@ zQrf?1+am9$J$^4rUm|<2p{8_yfdUdweK2$6wk`t~p2jor^BEA)*vRO3?+=#s+7k6r z+cX1uB+kK!TrYQUdTVk?|DGO`*}M#=CcmEsv7Zk#k|)Y`&h1aqhPZL(5Pv<+M-U}W zj)!gIVSe)T)ZSRL1lW_qP%Kipm+&)(Wf<;p2W<-r@+BYRnLf0Abok3JdFcccika>} z9xsiNC6&>=0jBz?*5V7ggqE1P`YDv$_t3c$Bu)p*X*zDdZf*p(~Zy%QQaf!aL)?(d#Ju1w~y!<6?S*g z2dv2rdE>9d`NEtqE{xeSs=E>KRqf0b;GwQ*F~qg9;g$1ojIO7b*q1SU!5PUvN*4`) z=lqJt+(XOGbT$2u>=$J)*m1aXT8rKa7M&Su10? ziSCo#RMV}a+v!&xsi~ng9zh<}1ZdLrxFs*Z%AJCy_K`lpy`8J+{cf-vML8>FG#8~i zZ|9zLhmO)LJqaB*nm(eRV`T}&B#;wy5qW_J+r32RXR~wZiYLt&>N3C z8foTo8{DB-DXCH1hS$NGJT#Sg1!99eH4ELO3*>NT{z}W5_R#ySu7saBhtGm)QnK(k zJEUA7qq_wfSb}{4D>sq9#7V!(h^j)}X$IZ#ZXg+f7eF*Et%f63beDoAH(kUXp9R#h zQnpiR9%HJTXq@kj+Dkp%;z!F6+X%kHBw*}&Hqw$kh5sk>r%bW(=@$A4=#dO}s`DW&xfOT4D!NO=|Ly-hpXE&W`})&jO(Hr#^=plsBO)l z6_(=U&b3eFt~Qlcwlpl@a@mUeQ&;nuRfL|dh#J2#^Qrl2LZ z5^u%R4W(GQqRVKwV5TP$frqh#@~T<7ZMCxa+Vv zZ1%u|SK@NO7~^FU{RVBaIi=7EI$avcU$lu)uQ5oPiB)NUEvsw&Xuhat)^OW&A*b_5qPn~-T^DUIBf7HZ{J{XrJk*Rqu! zC!-diuOik#yfmZkV5v?@LtTKJfXvh! znpApTqYr?Mrcxpo)JIM={os_4s+vX;ZB6NjUL$Lz6wkx`EdnjMk+esai9`Lg6Od?e zJD;wxKx=O-0c4QO$J4<|VnrI#7CRDm_!_)doZTYN;Uir5jyP?`yAZ?t#9*GSM%!7i zNk!ppQu$9%0hGzLd<$_U^!y{hQ96k@{1%hn@1kb}oigB0Ft3UWX-=TXky_UMPjAs9 ziq<}wUmruGElS0Kn6`?~p>9?(Skd>|0x0=|&g16N3i%G#bT6!X16YE1Mg1r6Mg5qIa7a<~1l}osxZe@L@CrmDXH(%hYnqZ4*JAWc$nCTbFNWxuI3ZD2o$hdZ$Kl@ zMfY`?%-~x3RF0da&TJDzd|(;!Q1UuwOdX2z2FfVCMkjP3zoHvtC?cshf1oB3MGd?` zwu6@nJOQ0F5Xtxp%EU}CH)Br&3#8*JG(b?_q=RI!7(^xB;$7lpJ=JqD)j)H*uD@8* zgQvt{?X&PQvlU$EuI$iRIs$k8dt`(m&W_I#z)v^jQ1Cl+SD-}s6-?lgl(yp)H6pZK zH*17BWczWr6&idiK0SUh2E`Ci3xlsYWBKhLoB-l*U2llQ>=1$8~1 zI=lNd&4yL_UH-#;TdVcquRY2H>+}TO!8R(P|6#0+!n@DHt&ieJV1^1@h11&g$bRU? zi+Ha0t(OVUn&3tYCbIykeNS)L@Ok)^Q&fTP!b@l3@97A=g4Te-C(eOb<{??6r_4gR zU`A>|ceY08HhUCPd48AOV7w7ve{U>0*Ggvn6&A0Ty$r6iR0?3QXgpYp01J-yjObLjk1rA*}XImn585CLJN5a-9t6d z9$BJ~Y<t{T?kt@&(7h7U}tTCn)323J44G6Cd@)N|Ac=weYr8L#!Px-=gVtaM#$HI zjXmYxgnF=;c1n3*xz%>Id5AkcL#~=toC=;iQIAkKo*HwMC3%`}MdbHoRv+0YUFmNf zVhX@$CwQ&3KHY#doK5G+qZ7#9o5MlPgJ;-ewTAlICJj5#Eu_>ESvx1<5Q#C3TiE3_UJ zvwfkm)M7$rS0@fol6K(Sd;q8Fr1$~k9P4J2mg>uJ?FtKUg6<&4p{x4v7c-FqH&3Q< zsO^ZmztgVe6W))uo<&C(WG~;4^t6mu^Fgx&IB_H}bS;)?BQ9qwOKq$qciY-vpP370n{Ej<)w(nhw{$C_`EB%>bl_IrTu#ps zP-O~ptd<97O^3Z&Cu67`nDVo4u$_5%$;a3BJ|Vo zw-s2^tI~rTnuR!!qZohO0s}!V86%dIM|b8vt2L|P)k1X% z9peQO!fSaa|HJXXG0TAiyXh>T>KrssS7H8FKb?j8(=VV(H6!$$cSq@`yiMQgm(cBd z^Kkg){G3-e^WwmCwP56ZOfy=}vymyg1~+M${0O_2iH>+3c!3_*5a5Z{$cs5iv6_x@ zxF>lH@cnCAV`jnYRRvN(w<_3$T6q5V_)MGOK@+70^vJ4i5gRQjsgbSZekrN75bW$O zc)Z4%S*HPs{%l_YnO3015`~<#Co)J|;JNEL+5F|w2Ppn$yBj%1qiGl=Aj`fkwIS4U zP&`G#RutCk(B(=1^B2&UGTl2zwcL&H1mz_+R8qxR&jCdy3w6;G!0ItTf0^87G#RI9 zq#lyj=!Be^*GM&9C~qhaZpboq_zPs(4M4_08Ly&@rPlB>Z=?j2^cyU z>`n2&MRw{5pv97YM)wS70q#2^U+_2dr#{!hgjwer>1@%KnvEaPYMvw0wU%3hdlNFb zWrbLChY5Z?uU>#>X=>6TU+1-u|A(|w%q(NnQ{onX;-2F&?t7hO^8-J0=3>AZACXNp zUbaCuOXbG+huCUsQ=St|InL~7aM!?gJ#+G7{b%wrTE#yE7fUtwFaHd+^_pU;?R;8| zE{)IW9W6kfK{M@6DKPAVe3F&3}a87w*6?MKzHe!Y-s zj;;)PoTH=w_((x??Fo1HQW$vKW*~~ruvaVW3!aAVL#yQ{i8WOvc0u z|10e4F)v#CDQf$WC-aB-T4OkaV(u*ehwt_n;E46Oy?uaGzveI1b4t@C8KV_BHLTtaUg>O>weTCQI2t=zOwLMEKCKJs zA}{o!BoAjcm{2Xt`Jt@A$w=;kKSOV0rDJhxGGbK@5^|aFeuqsZFv9evs5?;m*;SVO zQQ#!ma0+fwT3+gnhVqm~8~c5wF`l7-n^t0IIz5IrtRzb%fwF3KWEwn_58%^ht?IWr z2ii|V@W2}SFYq|##Pg3}{srB2v>jgf2MU*cI3vHC{#f;HoQvCo&F-ReblT*EevlOz zjidP@oz}vV&$YF;S2XQ$?ExcrBazQYZ6ig9rs`W==|4{t$S`HQmF6 zu3I5k8(HMsYYPXPfT{?$)xo6N-p@g3UZQmf^{%F zb9zpm-}D8Tn}W0aOqKK*B?6s)ZjkdS3urn0?TzB!5WmeRzd?msNi+F4pRo1Z!|s6&}CZy`w!raK=TYv)Iib25zqO+mVuv(0#-PVo?aVpD*IC@_}V0C z3q-brL{MIXKr9Us@rZ_%XE`(Xp==%3&qjW;5vRu?Krp2g(k7yyDB?ryv%_uU&X)3 z0{M<^3p8k)u0%C7mOckk+zS2zmIsXxSV5zKnNHcS^tdw;tp6w?Hl^`&CBSd~(ubr} z72c}^)_I5h$>!q2v=T^m5m3$uDFl@I8@S|2I%$VM5w2h>N?GkIKiZPqpVJ{u@DH-g z%5z`r&2_y%Q)L6#chI>fU-=o~IWs{0j+cGVfU>zepc&nh+_>EX{2I_BUy@1=eB$qE z7+2t*xCp<~O_YukkoPwV=eaP>_d9ZhMtJ@x+Dj`DNf^%MrKMkzR%4e> z0k^u+o1<}ey5Z!%G$GJ_Mgavk;Cg;BnyAAxo+`RwCXH`_K3a1MzQ(on2V08EBG&*D zC+TmQ1-zdJIPE0=6Raz{ZC#DvVG5jPr<%4@6^zW9C$<%Gs@wAp8>UylEe_dzno~FG zNGOca`~x(SS@8d5IF(E^@w|y{un(qHLjIFO-dg_w?^EWZdfD`qH^2;sU~Ow?0rVk_ zqEq}QeI!(;XfLeGXwKxn0dM%rtfRV|!97L$c?;NNBy8OR@TmK8g`PO`z{5N76ZnMU zIC(vEua4vNT8PWq;wIb`dB+pYG)z=F!nJv;LKY;SPQ?q zgf^Pts`>^yzkvz?`E-zBTA6Q3I`FX9(Ej(rqnBk&?=@>+Z5zSkEs;drnoy~RU45vr z+?=LkSF&Ke%4_m$l|{4%)h;iQf0%}U#OXO}23d5%b!XdSGMXB@r}UPzk{@7KW=k|O zA3S*?BY>_NL8&-oHfk!ah|iZ1yLDGeaX9SteBMILGj$rgS6gtA>@M<>sl2q}obGnU zL^gg;O~I(*sD{3VI@?lXwXz0G31~Hi!4KMl-$X)V*^Ugfa)>HyS1>pDx!vGkYh?>8 z+gK^!?lFv2n*#4sS++9IHw4sqTPw@HLpt z4q*0BEsAO0`SqUpUe;(P*w225ERHr`aZT#RHFS$6xD~LTci<8GQcriGj+YBijzUde zu#ZOiDUG+uy$Ta#;y<5K7t8j&@YOa@8}g>=bvZ?m_{Z%`Ej~nv%BH2Py%HjQkKgBzn!A9l4RtR zvVz`I2K|V=kKr#lgxk5beDo8-tG=LKlF7$RO<4ovJsfzTsx*cMlM}n&ozdS~K2w1T z^-T7872zR6Q6ZLF*Yh7v7F{dv%n)xm@RRs1H*_=5I7QzIZoD1zJyIG5diXGfGKnN-1qR&L;g}CCOCAC%~H}Wb_c#ag2*xYUZDf;UZ{(`fj;WsrmTcT8PCz2k0a?EY;0a|+N1EEVX)laL1ozw z|I<<~cxxyt|3i5d^^!P!$T;C|@&6a4vVOv$T#;wVxA2)q^o4xJzuU6<3)U_U&(;)N zVjgT-3)>5~WsL3ZwS}ek?O8j^rqUGt4(I@wibly(<~DIAP0yY5XDQ6*FqOHx46+OH z3b)KUFF$U7tb}M8@S9$+9cict@04S>e}%zW4^RrO0Gzo4NN}+;o&KStbl5D@2|AN= zK$R@SXDP2_)>3kVmmuGMI&j8)?9HF>OtZ~%R-AX#kMm@7hsX#Hm>0M>8W=h)R|mSi z$|+>8WOcVcr{&Qdl*f&+B@rF# zq`l1@sCDaQIhS^u=tR!xmv$pzlcIG6^>QtqtOLA9UcV+hLC{>9@2B9tu%H z8o|%#49}C!el}axe{Sc4rv#)vSM!T-F+#s}6|ne!C=Lk4=V`J5pI|yKqQCKHP9HiS zrFT(>D0TUJ0w(08v`g#4P8a39CZA-|8K}stp>x2Mk5O@5kJFN*_vJ_6gh}`ueYk;q zMj3e(?Vu9ocbX0lehIouG-@65K!>dAy_YcQ?a$%4X14a=?>PkP@rM%+OOeZ1*#$MB zpfmsyXyCszWq{3}avpc6ma^$-DRw9*H~AlVh)n(@+66X$+6?kb!>VlNG(hhOGEToT zxpfjwM!cXGge@jLwK&wfeKeMH>1R}$6Ts%i@kpsFr{MGEK`$8q%u-u-Bh#Uf$$)6$ ze7-HOc(Q+=oA_TT&@ApGYPrp0t*y6!wioh$dJO#aD>sk72$A!nI#yG-$H0t!$L%Tz zC8N9^vT;Ces1wG0sl%-`t6NZ3fVDu!$a;~L?ChjLDk`L%3^S3#urTxWbJWr<>T|jN2VY|Fa%K3?!gAW4-0o`go z*pR9CWalx@@Kb(4r7_$2oTl@iIM=zBj@K-d8|P>jzXzr}0}t>HC#)zcJCp0jQgdtI zoG`>S55r@!-jPkhV9=*%DU_m$@cf0{JLFi*-IbdB0!Tiavlbd(ZryJUcui9|q+>Xx zBD;&0n)zH#N&r9nDhH&rJ_5G>O-7rWd=IgTPCDOI1*+I;+Uf<_4KLrAp33*Yd^y}D z!0Y93?*l;Z$7KrMeL7}kjs)hY=I7UgV00^FAurXAoSL?hqyNZ0p2RtU=lSe21^o zv16xcH22X0{8VO2CO(fi#Aa!TzUeLyKr??m7|Cn(fYdtzUtHz93`PU*d{pM~9?fLB z%NFwKFY^`F{RUMA56;H>ks+5B`Hba(uX}NKzcUo}NAv>h?F-(9&zBlMF@+=91=G*q zhj2Gr2WPy1p3o+8N~&=tcdy(*_SZ40ida&Noll?I9Xe5m&~xlU82Hf-_7IR?Ye}So zbj?&Tn_*>o=v2Ap&qCG98T%n=Jby5YB?qsTPk|cNnW@OSON)sogB6{baT>eIUZ~zJ zaK8tmPBW*hqs-_qwcpujTi7%5JJr&5x{;QFH-AahX);#vU)g~ih^abUF_9Y29nGiV zooB;iy+>{7Ngkwod8o6{{2@ErHhnQnvAgW~j@oP-5h>?Yv84aIFtk}HyjUppQ39`X|&3nnjci2oZRv#U%d z`W;4qxzL7Vj@ z;dG7~`e*5aDbEq+I(%jnPlg{qF14Y&&D1j#4pi8f>Qh7B19keH3eVEjw7}*?_IwC9 z0A?A=@BEW2q``QXY}y!{0Mq5*>4#8me&nAW-*%6p_v;RRrU%OxCcOw?YFgD>L;8kaT*k>3fvOYqdJ}vwb2Q(3_bG%B(!Pv(c;g<^fC-g@!*@uE2zOq8r>pZ?g6M#83$sDLaP2Hqml3hjR zpuHF7Z|R-n1f$F&T@mHatoOZKT2D3#`Y}r~0!u@BBd>5qBy@ zCAo@T(p=mE>sXEQay!_Y*}B7P>R*%#l178(Q(D2U8?*_~yc)|A@3Ne+pF4&xdd4rT z(Xjr_xS~5xkLX=OG|yy_$NZ2wX$Y8e5qA{!bUKh%4L!hjz%4sy1&+h&#nKoV07mvw zc2GTF#W3z+u7e4Tw#&4ER?-tpu*jMHyE;Pa+XK`>JMc0$6U73*A7k7E>c!+wqSErw z{3O1=f(GF1)Rh|AOhj7i7&=8B_|$V5q)|Y4`;o)-RMU z+S3i_Bz_%yLw6C684DX<2DY;%q6>N5RzPE&aQD6g{&=CQ^dj=B^P~IEL8^ls@Nsyu zowAeL!wSs@_AjZ`buZY~ao&tL?^<(^n}MCol>M+6bM+inaz1wFt(O6}BqbQ)QhNs$ zqQ5MV*?a;R<~nud&B&=};#{z|ao_I>q8I!~@A5c4M_VP9+L;*b4u6}AUmNt4=3bnr znS>}k&{YBVqn6V#x}87eMcRrV$$HL*ISH3dalH0yGY?jLfaVA92rA}W;0~7bhQLS9 zP|TxKAB;VLzk(i>g8Km>V=9Sm!+-nBE^)D*sviV zRy2BBWYFf%@>QA=(&E=t_;b>T6lFSP#j6b;Ic)T>zQcy}9NTZ?sDZ7z}`bgghY1=!#|E5KfGVhQ3EIR8#N-;q!FphbV`GN95rCr$k8Lx zG!N;N3SSKzI(kHC^VFSEC%?w9q5VgsZJv6}7`$hhPHB^Wc=WK5z5DkYk)kjD(sw{u z{YFEE^&VZdR@?vm?_ncScFKYut6H^cjjAx!_91C3ahM88*+~7;Eoul@J4nbMr%%q2bP%|>vz!~J!G2z}s z>tTT5cV5Rp4zIjP=Vh>kCDv&YFmSPOppUcAn+I8;vT@CRr?zF28ijoigD(T$dEYs%w}LhX zeLJS^O|Pi^!pr7W^lCbHy@B>y=WU>o8D-OZN0Rb8xhx8kyus!sN-yKRDiZFrwd=fr z!FkTCKyI@MMQc?9xx5ezDyd4PO>EG5<7`(HlSJ9VrkB^%{Nl{E_q`a~8>#z?%xWWE zG@N8+yUTP)S{)eU6*5y%1T+^yM`iRXf3E^k$pXGQc$9 z>Rv08-}bYeop9658)=>e0wzBApLaZP)tT>gvKh6KbHGeM@ltBL4+X9R16vJIGket3 zu&2DOX0`nzc-oFKc}@3VZS%FcY}uP>%bI$&q`hden0n3&82MLD20#&{|Jw+yBl)PN z`NJ#@-V3z1w@nr2i5Ka-Fbqn+(^fXyP|(!NyfoLejA>_2W6Q z>15kVItqiRchuYAy>%*@XeYrGcT$>X^+<(XFr-H7`J}T>0t}{Z*-|wGpK=LW}(*%MWxnefia6S$%XHG zyc7fi?bWg;oDrJW?zVenIEEEZMJezX!Ef=?|Dag!yTE$7>`V=8v>VMlZ?lo$ekm#Q zsWv^fLz9l!>Grh!&m8w|%K(Sr`+90glTIkQ9pAm=u>qY zPW$XzXDZ5aQ%iksr?b_`XWls^pV}+l-zZpqXSVHmh;v( z*=Vshhnkvj+H5MI1TH7ah)bi0HyClrDQR{{A7%R>uqF7^e#D6Tjb@7d9HR3{uZfJO zfx#ESKe-^1k5*G(`q%vIMPS(ED#1`iZ>6O0T0sm7k(x*lc;kI$W0s+$fCITO9*29%?YQqq)tj_+L>lH ztNFt3ZwM#svht@cX9{IIIex~tS~F=Tdx%Mwm!-a*Pui%J8ki9*cq^? zy`3q}99Z~zxJ}5({@k9 zF%tt?+|?-#``*Fc@w#|}op;^{uZ}rrI|O=qA1RifIAsE9Y$X)w?lLva3_Njb1c%TP zGBDDaXn!?nVOzbnJFeLSwZVbktHTf72Lc!frQWT)1gNah==Q6LnN zCfekH)Z(HT=&l@nP|SaPHrr{Mqv91NNE+`O_pzHUcrb8UB_s5oV;$v!{5{Ri{${G z?h6pe?CwScsg^>*{9GnLr0m6|AXSV6#ICQK?MXQ!>C7OW!N;8eI#%9FX)X=f?<{E2 zQ(i_Gp@{I;XS#}q=tx>grA-KD{d-Cp?2lp0=dvS--mQtWd2#{cb z1cF0=1lQms&z^a3ch};srPv?oxAOhY#koB9=b{&FA$i}uXV0v)#$+aS=Tu%P2=sr+ zdU3{5|@UGh3AZB0icS=edGZr#R zCp0{rgPaqgO|>4<2@w#!qfquYMMh)XR$cyvLi$9=$#>Py@%Wfl)EN+Q7HTn+k>}uU zXvxZh>kzBdTF?v%=I13<-l+}4C@4t;9e}%nqxXJ0-6lu2__9Wdw=}=C6D#1wj zUqv(FQ@ocF5L{2ue2qbIV|V=9RJ@d=)se}u*kZRgkMiS25_keEAMM^=Hdtp3^5;_4 z2U^z%_jZw^sSA~YU1K;W-bQr_FeSasyhnS3^d8Vx5bM?>v5?sts`uoo9SjSuhw{uo zh@0_p(|oc8X%W6%Yp0|ZaI&JkY_|6eshNs&0e1HYO%iMH5-LJaY~a-NPH|R_hlrET z^P~zyyfH|ME;8M?Gc36l#FczJ&HWQ;xiYxFg;JA8!4i@=gPau{3c8=3tHLh?IDX!b zG7*K{O_5><25lp*#awcp*LJ1!|< zRQsVEpfj3@Grqfhs5fWlm;3>CK6vgT~(_7P0to+A6A=&?pFy>7Pf?h}Rb<+X@ zVMQJ-2c)_;j`s3)Us=Wp_`2wDY3hVia&Ii;h!33IH z`Y0#CY=UP?;Vd95c!dmF8@^*U7jVwo)H(-ZS0?8K+7jcqmqt?xGtJzAEISnP>ouBy z-*O#Na~3x@*elK#i64K!-U>zsLI2;zgR3{-hRtwTiA{~U( zHW!lDHh8v)`1eX$6mf1A&T}dMCA$<&(0V{l@Dz6BKL}fUAx{o65t0e3Hj3#mJuS}# z0wJPrQw`N~R6v7}mI&mkItA@)1)P5&^`+;U!Mnp@oYPrhtdiNG8G^L9g(3D zjUnsRv?~Psz4DOvp*$>7F=o~WjmPVmhxAj@imt)ITe%iR!gH-d2|<5)Kn-}O z)F8Yze~4QLbhcT;-61%qa(Z)B-y&)aY3r2u@M4C_I!%W(bq{>*j+~z-=|H@K za4JeO^|4vtw15XVO(``BDfBrSYWtw%bBh#rUde9R03mH5O_bVPh|_Xkq*UDCRVIMv zA+p8uH~9%KE(G>69uX+DSKOP+B?QYVbUYII@jTKVqz$|QXAq0V*Gx!D7Jv`!!2_uv zEVni=!~lLtExbGOluF102}9XUYaYRMbSu}?2F_~{Af{B@mWBeA{7ct@p35P61tt;< zS+j~RqQSh71%hW8z64)bUc0%q@sf^H4Vup>oK5tTLL%07`Ug-!Z{G(wq`9aM(!?Xw zqmIOKhyR4^?wbDe3lf&KkicDzw|i8IpfzU;)uWc4A704_+=UMqWC&1;QbX-ag|rY7 zghk=Ro~9^>bM<8x&{|)*%`a?5-sGOvqV^x(DqcYg`3FVwvhy4%|9Obu zGib8}P|_gg5F5(Bf!B41+Ugs%OVvJX$pB`aKAm^7hiE{=?}CPBDeIL zSw>+PcpNH4IS0Lv%aj|hwSYW<%`9U-FRvuX1inV!c$=@8cabQjW)t|UKXT+255f>u^%;sS02g3c$uV0uVEM;mdg_0JhM%7ttsZc0>`c7 zjh4yq&G^O;U9a2I_A*4#IgpyMz7gqYf9>ogmjV>avqq#`s-tNoy_4-4MlUpJ{h3D z`D)5d2=d3xQnbfq$B=@{nw;l*NH6Fp_?E%WF{c;j;5phFsr6&LUh8maj^ja8F)<&F zr=1cHEHa%u-+WzxgyJ-y0W_!RN;8MPfq#6U)M7Z4es!+fEAS4hN#Xr3@G2BkPEy8a zDa6tIf*+~NosncKjWlFmUWc}N!};)5F51b6AMqxTlEFX4@;M!<)AT5>wuuse60n)@ z>-nS~VKh3YaWi9uZZgFA14tfbz~F{dUOsO(JiyOL2<3&`9jBM22)sjP?S^j=B(*e@ z!yw_`gDmeN>i>+ENgyzk@dtTlurwS(Ue4FYl4V63NN35R0F)bG8c+UgcjDi;3aM8hApS3fcZPqa)648>#EWrFn?a9m%7A@KScd zvo5mPeLH|J4J@pbSBE<}w@^G&&qQb`tzdfVc;Lmx4vMg30FYLKG~;oJB{-*@YVyMW zzU9U8NSE^~^0d3xj8mal?Ve=9i`ydusDSs9X31*UWqU;U>4@mjv;^_0vp&@IC}00W zi)#t^wAB1o8soQC##yX{pNmBSLuw7MXL&yNmI^2o4rVMl3I1Jf>jdzU?-HdmV09r# z)5hWx7KFa})%a;YnXO-dqVhXE@e<;wJz{DO%`U@$@#_Oo=k~V4Pmh3qdue;Y6C5;; zc!F#%4P?1H6OUoXf~GAc9kpL9gm{bIF&(j;0yrcXLs?VWGui zi7<7%U%3Mhpa|+rZMgxb=Nq&}PIFzx8V^MEWb&7LN4rZ1kE2a|A7y-znhO}J6|aYd z&z3c4V_Q!@0*hDH-LeO^5QzkND|yRbY!&_D78gtJX*dzRQ7DVxPamkJrsY?Bj?zgi zBHuzpubu8FUCTFFfY-zMGT$(Q&t0Egpq-&Ql#WO!J*Ng>v9a73NNc}D;U+6;K|2ct zitA*H?=if?MWB@g_`n*92yTiwQ!(nbub|zNi)c;Q!Z7~B{D!pctl%n0(4~Zb9fcRS zjF(Y0_!58I#bLDf#_%)!OV3GHdC&EvE!UyH@jZWa4w9>Wh&C(ugAB&$B!@<@*lyzl z8m(jKAurl9T`%F4Gy*Q1pb4;}22MfXg^S#V(71~BzC)A&Tx+jvMd?jF3gRH3U9by| zf#2OEe}M6Ag3Vl~F17)UmyAvWXAkatC3wvQ@bhrr&l;zScsXlINo6qcfoCpdO`>AtDu2sbJ(VvQB2G3 z-#iTOF$8TStx*Pj*bJAivWey-#_?l1WH$jXJ>n($0oMHrY~s7T)~*;%QG}n;6`GBA z(Ho_QD{KOy@Pg%;Do#JYhiI%~C-cLc1vkNF!))NYeO zpWFSkjDG?fe~+~KdSH%)>?%qJSWL7$g9dgHDnTPk=?$UpQU>?E4Y4y83cxUF>D0o~ z(@$VGg}u_ax3pey_={E0CSLl^P+G}|@|XFDe>t^3u;d-PMAPt2?dd(n-JPiNm z6`*(C;H}mXx`~^EgWPaRLfg0^^Z7A+T(};!40iPdw~*JF&MT=UP-kH&3>_j;uger9 z%-aH!C%wdHh`OIR6rVq}*VoA?c`#W+r8z&M z`hTQU%&SUYeUtU6iBA|!OSPHKqMMwKHza2EisQAFgEn*zO~(~=rW}^E(73Q;ebE`BED{xn8Bt-+uu7v$`k%vb?FL^ODdPC+A}yy|^&ze1GFT;XR7Tn( zI!_ma*-hcj55@`K9eWCy;I@6>pU!-#C$J6o7MreV= zsho{ZK&2ZAE>?q@!Frwpb1Z>J4AP6>Mq8ow_&GmoI`R)#caGvrK*hW8-}->XHnBtt*dkK~lq+5U(uTdBkg?@9Ek3y5_VMAcEZzMCY_864X zw}j`p!Hcwn_fPE=6ap6fO=jqEV5Yw*X>naVS{AZ-pY1?Orr~;v>Omi>%?0?WOwtF^ zlh?qrJz$1q7w5GSr;dhbCwT^3K1TQ8y?*fxpzC16Nz1*zFcxCLLZ-oH_e(xR@6GZ9 zROXdV3_Sz_pTV!qOF52msh)gWdN5WB!A=VEcF7}G5G{UH!yEK3sfi&t*Uc$?t}*PH zmAs70I@!S1TRBrT4bEn^BQ)vWx*Fenhq(-$ZJYEqN41eXp(SC3rBSdpTvDK^&tiO5M}$VoUci_2!v~iGiA(3Y!@C#TV3${P3Q)P&TI|buweX^>ev3%``B{V^9c2 zb3e_=0UFJ#yg4*j9?M<4n>0=xuPE;GqGr*ghMxfV{UW&OYPy8qK|@aI1$qlncJ^BP zvX7H|=VaVv4rdxHG>!8=X~rw4h;4*Xhfylx&jsAIh|&K^O05KMv6+)Qm3R+jMoBN? zz5c6bw4-O?*)wVpH!*mC)TYmRPM?9b6@jjG7$rrPlNyA6v-7kwG^)m4Nhr^IrJZE+ zeu1?w=P9`HyclsY7-Rl&dEtl?ui=q@!brHRUPfp?C%_dl!NdJyx0tWCEzPjW5TQCC zip|lUbOvV;&TqApmulY6H*J^~g?D!aqeVMAUtO$n22X10^~61I z(dt~)n~xXLNtY_dRwY*T3eo`i&JjFBvVkKlMV|I|FB=*>)=_hwtEA1nn!u_jXs)lg zbCw@-Zw!Si$QglUm)Ib_2i4_>GzSt@D13djCK@_Z;&f)CG<+QpKr(L$7l3M;kGDdl z`4xDmzZ6D%s!FT1s$-}jN1#yq8ZcUSdIgkyou^6|zd^z51Za2d(D=|>c6&GZcW~50 zIv@6z&V8?$>tt}cJ7v6%rN{?WW> zS};P=nXYy1D)xh#8N&eD$%!7V73{2Y|H(|H|&0%zmw)^yT} z`#8&?fmP%vo&t;bAX61XJ9Q4Q%ty60T4z#LmUQQ>aO>X1wZPdmGz!C(C`W-7T&rUf*Q{HPmb6MsdN&!wI4o}Mvk zXEYEwP>TU*d67Zs0`3vyU63a5>aU@c&y|JvJPtfzC>t=$RnS3p0h8o~Vq1fcQd26% zm%#CAa5f1M$H@YZG=P`VAJ87^@(+?md(c8H%tgb@Z-!~IB5~qTwgDo(oLC% zQ3p#nk~hjy6k7Ion%d7aPyPqrm5AI{SDk=YzXiywtI5verJ#-H*%VGwoC0{0m*GD{ zC6n_8UTlW`gjjw20U`xHOSX2ux;2eerUL_ugSPPxcCzM^k#SqEr7?y@_t^< zUxK%254^?IdL10MChYhGEF>EKZkKG;oM`C}(W$alk3(zmw32gKFpv}aNkOj)KJ^xw zM_9IvzdsMi=MmS1zH-Lh2(>_mOy^u=Zle2Q`u)-3|7TnhR@DjIbK4 z`6U-@c@baLlZgWm$+zO?9^%ei39o6JsjJn@ORl3+(R3KeU-0>h@+o}#iS`2!OC_z( zm7Ut!p0j}AXV7=JqngfUwNOk?(+#e|x4l9r0_~-9bTRTg|8NFfuGi=*=LSneA+9~l z3Am*ph?%)LGotVeY9b*Ts{^PcGEBdK`Ajsi@-sDq4u?fBXi%SwwN#_|BfJ~Nle=wn zx|Bx&wI9l8Tj(GB0XVfS&`@{SA{t47KYPG$uBB7DpR(#tc-^6T7|6M;X7Ij4aZB#J z0c?b;jSKL|+O{yloi_4B+)y??1^-)4PH~92rI%zoY+x6iuxNMN zmzUG(K2rlVXAW%e0FcWTT?kz~xee1})RVs$)`DJl@X;C61>R$_E$4Y$%{_u!8A?-u zL3aV;>@_VlwR4)kpuJ%la-nUtE`Dboub$&41+=IyALmDH##Q8lYDyQc44CdP6hxoU zp?aI&z$=%<=z{0c*w;^g$<-4dso2sL4k>Fm{_i$IVsfsEF=bAjWQ>uoT?8C(*cy%FpiZyv8NKT55kb+I*B zWT4mI8w6DSKRe!O0tB81(d;VT=I!7xhHi?S=`u~G1v!jL>l(y~DVh=OGS#5R=JE3J zLEP_k+5`mYqd>lmeBf?Mq04lox0@I6EB)K_(yCBd9Q-%r){*sW<-Miu9K3H8m_jHw zf`9l|g)4bWWsmma#dMk;(Ovk%#=uEy6&PAoi7I(v~1d8PCZ%Hkb|8XN8NLI5Q_J&r)<|2L3ojP}By|T0&?#`LXnqb>QVf=NOBQ>dO%Sp;?VZz9MUtu^ z!sG?++?Dd)8oH*d5v#w@am4&+O~vEEm3k-nL#HHS@^`AL4NO&MA$z`+^hKxf%ETXd zMbLZbb*-eEjO4ann698GUB^pp7&YMHxT$C0mPw;pegzj_t2>=!UIuTQDFD7%9h~Ex z9Oq>wh#zv8KI3rmgNk2FI_R$w3~YZBwiL*}!G8wQ2H?1Ki2pZG5i^KySfda4jX5DJ zpr@pDme@x?^p(ANlG5t|Z|WI8;LA{1L;}q7e8ESVYdh&sp5#=g9KaLD@uzpfM>XVW2E#ne zd)lFIMWL#Gc8BN&y+KR#a_w;7X~LMRT|5)|SXP>j$T<$tCR#?wdc@mM!5}#(W7#;X z6Npbx59;)C-lk8Xsg%V_8;*#A0VZ-axI0Ig*}9jjY6hUO4>Xmx(P>Tr)oKH8E`%+Ozelyig8mE#pSpAEXjOrgpcIXuqJ@k(e$>O9)YP8$C zODVt&)^Y`SxF(LDb6;jrE?S72Ztl*}jXa93%fC=@%h_}q4bRvK?6NrCR0CQD?6VHo zW;-93Yuv`&Mi>Pv%Yd`~q^cZe&mflnOTlzT*Vzpiy3*gv2;Tjke%BtpSx~#a;k4S( z9|@7b1HHK6M_8AeYy@KhOf1V6Xo{6Aof7@kW9;lHj>IFPxTqVSme zbOFBo4rYxR;Kbt8)LI+X5NaZznurk@3Kvgi88ob)hozSET003gA96kcXc8(eKX4WvDy5wX^itQ+ zIOJod;iTugXD9(^cd%(dG1P<>=`gNoqj(D=PpVSHRe6`kKr zXK?oPn#`$)Dvn|Dj|9RGmj!lv&at|Zj&VWcj&AY+{zr?O;+z8<N@=3SG+T#qwpN3gR?vWCKBi^Q18+RWah z23p;Y*8YfY$&gKWhfMr0nw}HQ8Q|?cxRnh0!ltHgsI(Z1OqS#A0((2it@Lj_gf`A` z-X78HoH$=g=Tv0vEsyF4kub~!q{Jral-{Zi_{hV30Ec{p&jA;1={~oSKq#OI| zkJ=f&@tnCR&5#=^r}r?Vw=$T(1C8b9x)b=|F8JX(M zPBz$dtnCSZcZC=64&4lmGZSAmh0rE{T3Z4qHsjxQJiGc#;-#BytIIf`&cEE;siS^e z+*^hJQ`Y;5vzcyqM}P2-oK(@2fp>9$TY)~{4gCa#Y%(Ve3hj)_kA|ETYWR=5O1n4( z6eCFaE?4GM-XN!kI>sNoA({_ya{d=XPq)!qR^CsBj`DB%R`&yAI~dtq8yfXhO@YbE*sm*^Y*%R^>>1H55!78z1B&N?f!i)@DHn8h#XByKKVN9ruCMn(CfOahnA0pzw$ z@+ex{s42dCf)3Jb@*8mJ7Omh6q)gCjD+`7%Ney5NpH84!bXHS1$UXZmQb%Y&|3O`x zjat={x&h2%JMvkr%xj7Od(7nR(mez`fwk2Sp&jm*6Zp_3;Kg+C z6z70*3gag8cqLKUU|BXMawCi4tkloX({ATGva=TYd9I{fjgNe zQYGC7C1AguhDcVQyYUmPgL;f0+;=9-V&AFidL#~%hC?u*>bARz0Os2n~) z1Gx#RFN&bv!Oy#o@9!Yajh8lhTRPJ{Zi*<<+Osx}yHNQINQG5t_ga^uCRNGPKP*?LflV~rzSs=K@ zAfVCbb}{`<nG;bg7K|IeTPfAviMDU)qQbgJbO!tjTIriJP62KfBtwcTRJp^qygx@T6n$;~a^ zYhPf6*=~1_o1F%uTO*e#L#MDhv9u{F=zp-+u)Z!n@s+i{54N&>Y4;^YxYNy>;6wJT z8DrN5XSKs^&csV5nd#vcvkOd&__-Nu7F)yj(p^S3+*0lzCX1ORz04&OYz~-ktnaIA zizn8hXx}zpN_R4_Ndb2*I*YcNq<)iWcCdY7*PB4}%xv~KQrix32ij~V&<-{Q#n_Ru z)tq;0CkDFH%s3fgFQY4^w@qee+tpMB-9LZXiEb@)$W8D)wkvE=%p*(Ou*q6Sw zww3RWonaH*%joY+F6rg69faPLJ|@uD*?oadhIpTwFb97&x5Q9-^o_*YiN0?pP?pG9 z;|p#i)pfJ4qs>Us=*X&SH|p$K76@!F`jckBb6Ad!xw*LfQHytFHI$IxQO}t>2f+0OLDW#gdjmpaJ$RX8DoNW5I zmrQcsBXiCCW}aY4+zxvQzq^ai5A_X?6F1mV^p9EN8|>R)98-|*n6tiFQc;eXe{4a@ zEOp$Xbk}z@c#h2=S>4={2b^KO@2weyj;PmIVK~Hu&;&P`onwa6L$GF_Nh^VNi1CvR z=<=J3Dz4I0!uB+qr4za7G~4`X4(WZa3wD{2v)We1n#{p}pcgGU z4f8E`Hz2F|gB*23&1ZD{t#vEf6!OY9iQ>&_oXOVUT9Qb!+-6$IJ!>PuaNhaG`U1cb zAK07{XW~qIDWh*}8}E?Ki9XItRFdwyAKmi4+rE{inL+b# zx8sw1u|@cZzQMXZn|NP0$P3>g+5_C1hu-;y&G z=YO_=Srv3Y_=MdOJP_;aV$Dob+E$Q$zKGz~@B_EpT-4Gmv>VVJ{G%OecH6S{jIWNX zCIzjoRXnklX{HaM}OsbpJA1~bvU;C3)e zjUP?HdebZzs<^;5a5GY6bon*6$!#XP$|lnE;I`X=$4z}+gRePI^M6wqIb4hy>n_cGI6>P~fwny<*QO|-!nFI|Gy*!>`G{^G!#yIx!7&&2uKiW`}yQLK57IG~fMf{V2{hG!0Cc+sh;n+mVS` z-Sm3Yo_15&<8D?|9`&?2ObHoe8rjg`o#-%}W6shZw-C-@f)9&aY#=?vC_CevTxnV*|BOZAKqqzkj~!>?CYPS3t@+DFx|z_)yT`DmDL(Z7g&{3nzPcqhYw9D1s z^fft6lsnaSa%b8d@SfkGe3kWGH1B;AO%Ai$mkGbOsvCe#+I;9qp5dNx=Ok{oVRo$# zD@KD;;Z03+b70ay0pwVp+tgf?XEJ(FFfOYlPouY}|Nco(E{yY&|^=PY_roAOx-mF4Wv0a{MUk?Va31p|ZG zwFZ>_Ly7mnR{QAxEEYP-H2j1udPYh?&zR{%No(-1V$i*kdWnug1=|a?r3$Ch1E><% z24**vs_`yoC%pa=@W&|_HrAAvAqUuz-XNEA9Ti2F<-V!Szt}lY@9xlfiGZ@b1!~|` z@kd528OB)`;0IC*3^px(XRIvKM>3BipjTtbl(_=MB7m3KVaUfdMb%IroljMq9VQh9 zY_`<=6zY_L_l%&$$m&+m50r%uP#S&jmIo`#4vnw`&jwGL00m%+BnQj=-L1)31;N?S zjrdhq7kjLAop02@WWds#c+SWNfFdI8Lyo0P4uLV<ye#VQBygX(KeX!y2d|v#V4Z2pbunau>9KWU_SQ;=F`e`km4lSy`&92p)H8`bXS_UgYLy@oB z57p*ZT_ZWnVpaOgV|fC+$sx1KS<1DXZSF(6Txu}bxlE88S`znA#;ivMqL>y#_B)-^ zS@uboev=K_5|+>#I-tKc5@_|%Q|_{#K1Tkdto8&y?Et;6hKA{0^`sU@n(NT{lCqa$ zpjEGcE?1k!IyWV^l5|nRNW108Pj;n5iPcp49^X3D*-W{e<8oaF=xuGsCuA+6zNg8O zlptpjfnY<$q3vdJ2WmHH4GW^H3rs9c(xYy5hE&yHLO5^erbsF{q87JV0B6qyM0{=oD9jPfy7$ zfNIh*G-7nCJg^uC3mxqwt>mM8!%o&tGzFQ@R;XjMP)8DY9=$N7H8(RYm*%LP8ltF_ zH~HlrP1mb9tER}CPIVqqDdcfa8|3sjFSP(SJf)3bak-G)c&-1LEmRwtK?t?c6YeaI zU@Xa!)les{@gz9_z8fyHO(TuqsrYG;u)tvCQ&HDMz3_r(b20CvF6Bnh%y&scZLfKt z1}uTb6-f>G3|0|LruA|iIl&O_iHf$$HcZ!R4}A(QeG6*v3#>27=S+}6Gy&P(?6RJN zpgN~FeYFNpf(;hXeF}t*Pg&5bXhO6c54V47PI`_SlVqi}9t`ELy7n#X0KUq;~n zr!h(Ol~-_nE<8do1#@1WO_7oXT|KiYLRTS!Kbr| zWgV(HicmQ$SU5#{)X&M_HKb4Uo{#WooW?8MT1js|RIkNg8(B04wmbrFJC|bADPC*~ zq_?=6zVcnL!*vOJ78*B=!CTDa9EOI`PWwW;Ux$j7)_g+SOANlpcEpd9 za!i`>K6M3yx%e@4qs_FLPoleM7}bP6@v~j(Uf}6wBL4yMoag_bSocAdd9Wsvle~{- zo6pjoT_~f!v*C+$jZ*3^Zyw%ZNj)wTc>=}q3TXLhC>dVjMD$c_=gg8_Tk$e=QMa){ zzVLi}iv&KbpV>vE=xGg9@C>L1dt~20joPOfoHp82@8aE+a_j4M^ovGusOHsQQKvHx zL$NZNvCy6RQ&G0iI_pEZ%ZWUCbt#B?i?-TDYjeiMnvcI@a+2}2Qct(GmVLd8qGC4U+QVsW?JOTNBL_XQfxlB=H ziV~r!w$}e_Ykn+ks6E(Y70$1bs8;RIJ&~8L0(-ctCBVw^QwQAv-&j|JMD; zfvy+y)ygMmn=5TaZKrR1r-2H)VijKyPVFml8JBE~1aLjcfq(jNeki%!olw|*CU2VQ zfE;3!?xJU!MV2CulY>IJh?(on#;03B{m|!S_T z$yuP4r{W-|y=H;UEuq8OovUL~#$H)UTXg~u=~gZZMKvqBYC7v@nMGIVi;b0C@FG)m zFeeQx?Sc6-F?s}=?RRL%0lb?(;++)omOwjj+wN3x3mn>Z|#X3(LwcX)7gl zr`P1_oJ+?_hUq(J8D?H9Li8l-Nqh8?{X^6ah2hL+3QY!B?#iD;R zM%GYrAg)^a6xePG|KSv+xpIwAAAmm5Oj;Y-@lo-UIeJ;I>reU}%6&m64Ukt9YW(){ zPJSVi_P({B=@t#Z^ne|_0xzvKKGPSRTMAS>%opTrWVrcgW}-LiAY$NR)ImN0kML70 z4Ro*jc0!LU%cD5iK7Y#2vw#~iJ8et`MD%-fANVpe@_s3tBX*AN0oH8~&JaLTk?+WX z%FMaI7?Jwj#>rA3v4Xk)KR*=F_o;5PHF%1S*Ua8j?!%|#nSAFQ=hO`X$bSkGsRPF}M_(reN zO1eOWohwuinf2c&pX8F+hy?#424+Nl_onpbXsx5a0Rt@45%~7U;J3rHKTftjko0!s zX!e^Wa?)R5R}QQ&9O$(c&ae@e)J@bJs@D_b^^cm&t2AZr>n(4`0aPTo69^n`Gk({1Ynk2g+$=2BtWJbPeteY(--< zr9K5mtm7m{MOHiefGg@Gy=>D-2X{OCS6LvW5N?VL_H%h>d+Pvu8!>4ym+>0Ye6tsb zJAn&u7^<86RP1RQ2aPBQ+QlsXQA5FS3gISanNIwkBWX5b^b{$8I*B!AzT`n9YKIp& zT;Vz8E^t{WepYhtD7;{lHlcH}$ogq^pyPOC8#5z5O_vCqcsg(_A8zTPc5{x?C9MeT z@&W%ILUEE-5+x(g;dz*6a?k##9l>Tg(kv|l##N4s@JiH(zlD8G6y{Yr)$ZnS$pDr$ zi-WleSAa*(%dL5l#G>M>ls48r)D(Sn<#8(h_J4>ksXWXtlal-=mf}|9TW*A=;xDL* zy)Q4#XWpjAaN-rD8RAbGXD+He6xJ8dX=Jt=hFE)nJBfk6K&L4x%;MEg#%f8oDdJO0 znQK3apAH5`-vh2bkxK(1e86{$5>H-f17rn*;Gd4`Lyn=P<~@Z0cT@tqX@z>H-8Lg% zrNW-*D7OI5)oEN?ulXXSmYdocYnx$8SW}FveypA4A5)A2VDX134=0VTF71ekgCCvZ z+=qp_`p{g!?UX>oxhxfR0KeBbI)zxf(U;uWiZgyK72yZxc`4y(J4+mFG_PIHRlq6I z$`oj=UuXe*R$HLBRy-bfwg$(O%MWEYrIs~}zYC;)l`uG{7nae`M1y`*j_$3!*dc4OQ%6`ZV7XY%% z%CGUF2O-~`3iS;GxsQIdqjta_ zjR&J0u9=;q&N^!7Jon|3x-w4hp+j&VaL7t|E=QyXAI3RvbOzBoRAZ;X-^-r(pUjg_ z?lBvJTz*z60Svzy^HVaQzc(}T{w?t7-a@IU!M%ajs?ch9>vE`NtctTr28K0|V!0WY zM}_ZYjhCa)4xY+H{gEdiZ+RX*{+Tb5s&ZX)#8^5FJ;$FqX#fucSH-vGqtb&eNEdM8 z6wV9I0IOdLHhY!l@dlje2;eHzQ1CP@0-azZylxhr?)zqE;Qu}2oq8~_j8lPp-bT6Q z{fvxla%dx~(Tjk%VNoL@ZDj(@#T1Cf&K7Q{mCbTKLq8#|b=2p;bNM(E@8I0J1?t9C z)Nf4WR$zj4f$Dyx`G_@TP!9+$E+cuV$q$BJbzcd1_CU&ouD#UY7>9HrrGph3^r`HI zT6Itg(jNBN)xNhB75op*EY|fo@pRnnO6}!=-q#{p4BWB`&}mQPh=;*vd$uc8(uJA> zHHv|#0xb%SYA3vWWmIrfcbjQ@-XS080IijD-VNG{>fZ!TA%&=}``sRgY82{(*+?j{ zqc{QUBq`ZvIBKw_+>u_|Wozn*#%}LXW zcA!6}GA01rkfOR(7f4kZL4Js`GdZ~;EhZD`HuvIHG8kwu)MN)bsEH~tFkao_uI6z% z)jWa1a}2fcztKA-r;Jk{-(abZ_MOvg_zC~hxl|ahJ+q`VNu8IuOe#dJ=JY4B_!Frh zb>PhU7+8NG&*bBXT|?|`Sw@%G=RK@F-ph^uUqV+Rn?DVUwExAs8HU)FQR<=Jwuuhn zLS8kenm56A^$K`5VQrmdfXqbqPeWMcLrx2|pgTA8t|A)W(X?PYahx0W^ctUf1$@R! zeunc|rnQ~jQXSD|s(nIB`K3IPW40mwe+wRCC-EXEw>PCE6+>NYHt)SAsStU&EvNJ5 zqf%xn*x%2HS3PlaN5I6^^IDGOyk21&1I#i_mm@kqRn+GyYG;8qH~V(M6M?ll=XgIM z*2*dlaaLVRl%p-!Gm6sQEk!ZutvXUpK0$!C+!XZCj4x?RYhr;U(+i`@i$e;96KQx)cgij3!kJW&@_G z>;*cj;H@TU95jjSV7g)G#cgBOQd&-@fi%Nc5$quaY%?Xi>;PTt0M`Q#_eI}&DO4Ec zMh-TQq;^K~a_1OW%Q_Q8ulW*n1O~07&vAosIQ_M#7wd^BL$x&yRq4xg9=_Xf9t)g2 zPO@n?hHYk0Q%~h}=lAc_MF?)zoNgI8kBYm}yp~&cM26LIf z`w{Vv;ak6#(ug;!ZEmM5yz3c7t)KKmT~ZJJ(RS5Wi2Fl$wFKh^nqfYLKk&^+9;gL1 zAI+l)z_Y!fHOxi7#bEHjJU~Fr(OtD3_%a)1mFK)v!*DvSP>E8*d2Qxs8mE^n=|w}g z2?5f6OgDYgIXVAqvjCex0r%blkxt`|dX0|rMtvX?(Y>~tKT&r1&+Vj2zv_?39E=F= zjMzUEFL49E0#ojQs@+lC1nhYSG=k~UoKiaF9e?yHlbcra!H$ztNkLz_Hq_m^SC)g> z|E-sJwlkcY>mB}LlEII8@IGhcp#*r(I1Gp}R`1xI@QKkTJy1v#~He8h|+0$EySDYw0B8 zd|HTaVy1>i9wI?s+QGMsBm02=U%6dH;Tc@%0MxZy!t^Vp_m+dHz4OMneSizI>M?DC zbIuNBwHx@~ZRw(g;i1}55Z1~rg0Gt-MsJeP0;_y|VT3 zf<^*!Ji=}71`Fv1F58rr;ofe+h6(jl8*LQyw5_P`D-Dl|2@#0XJ*5)-OJArr1oXL> zdSJO&dsJm6;H@8T78>UKY|x9_@R9iu4fbg-$47Y2fE!n4WR~wlT&O z0`4L8dGBS0yh%(8#Qu?DOb^tLR>d~-x!RQPQ7!MPp5SS`gwFAOyr~7+)*J%E%UmZN zu;dP#plfKXbDQ^i!N8B@pye(WYy7dmDORuAwd(KXIb8fD7L)>gZTfLf2 zH~oS$f5&}!t1lSL%%3B4CkLZauQKq*SWUfeGI~MlK*=5k4ePNDqZlnf?XWy}I6TK} zyArv@P0(A;OAu!0>_wh5jjfI8I#ZzIoPd5|!L`c`2w71Qq$-L#X z0e9~M(<`o6)B|7gm_F%fJ%ib}4Y46fK`PIF_K4n?Eens7PO44rUVPlc^TT`N}b`mWxttY zV3;Yf-0=*3*499`k&5+oKzfY0Dft=Ek#$tY>Eo!rrs)R0-DKy5uz+}hiPN;F^sqZPZ0550;xe4|O!p1*(BlMv`Ww zrUPa{&xt9@<0Uh%!<((_TfocpfAqoTa}I+MZQ%w`U-EJ}_<*N~=+UTEO^+FU+hiY= zgYG_%OXB;cK)q^FCllCW25$=G=Ca=3d|%3Wx#d32G7Iv8M8tg;GXWj<#X{Jg*KEAF}z zGMXdYp}3u?9IFX-n)Km0KsG6y|EP=|rvHMult&C0!aW@av9C02@QZ9ht@I#gF|59U zq(v>&zwp*Q5yPIyH?Xz#JOc{aWLS+Sn6U(PDTA|2x&vL-p$_OCElcUlR-TLagp zb5O3If|vd-Z)rMKkFBJ}$dMxdOasAro?Cb!y9pd;g{FtC2EmeWZioc)rK}U7J#hYg zBv4NyLT&}$j?+EJl6A%%O@vN(oWkL$5Aqb9BU`v1&xQWvfdy5<3rXh`hmO-2to0D; zi1TtrEFpiVr7!`m1eB~h)JSj1etkiUah|($xm5KMF+b?OeA8L*MF*WX5~<&CHa}|u zRMNM;;jpg|;IEUqQC8}9dWUS`Q@ja}$*ZVQ+#DK89bRY_k;8u@$+6nIiyWry`a~B{KK%iaxF$D}dwfA_dL6vaz^T_^ zQ~o*$3?-c3a06J!8p`PvcXIGvD1E#B4|!i1omJ9oO$Y>ccejDynw+lc;O_1)xVz3E z!6mr6yF1D0t`6>QgAXo)!(an^JHPJzdH;WlwRq=+@I2?Vl)G%f>m`=14g1!Eo=YOPQ|{XLb^+MZ#bBv6LorbfmVFF%`%Mf23S4`wc+iLi zLQm7iE#hR{%bkb++-CogbjYW2qf+@6pYRQzo8G;|8Hta|b2aE8fABC#=8C|YkK)6~ z##74Q$e#XD)xbH~%s1r=C3G2(O*2ohLFjAo1+|hEJjN#FM!=}^a7>2WnKnoeC-WkJ z%@z?b8KkS19KNZN86nZI``}f`23v}AqMlU>dg9#hCZYPh_YTiY&skJ0Fl$Dq0+^(Fik6K11d|Q8v5$GC zI|l3^rUTAFTg~1?4QdHi6C*{roIQ%@G@aW>-(gkvfg!fqyr-u!8Zl5JM7rbTwM~Xd zez99lr4fG^R?zAHV+SF#)yNGxnsC^;Ahq2_p|ikJlN6#Nu<@5t@KFuslvrIoArqjv64d`PXhnj&cs)@QSmcn~uR7wTG`- z<)_g#u}^a)Y4jO;PiEMUGSoKkoAO#%|E-90=WqnFp24~=nApc`1>CKvKwkU7{%w<; zv=t~-4X%zl#wWJ`eIw)Rgt``LY6+#c#N$+YsofN#ijm{qQ8U0>=;}ZXQGxeSPgubF z@P60q4yhCK3>J*}#39^rqncQxY4;%!UufPJ- z<#Rk%lHrCtlxVwMjsp)!fce?OOgS;fOt-plTX!8^IRzmSCXIgHW{# zLB!wEWJ9iz25a@eR>OH227F@$)Vp0+^Jv+`>*WvrA#Lz{BjAmaqfVR#$an&WP8Yyx zkJ=gBjOJmLcgYGm4cxL2mxN7UX zq;Dt$)v5?ok`H6&8t5U&FwfvuOwWS*b^)@J`P@SOll;gXi}OsN1nuOpJmxw!Sk}V+ z#YXp=2iW7yq9nI2D3SC9UN@&SMW5_H{x@!(oFBM0qBHf;G0)Nxi=VWvji9k zxeQjWja|a?X`IQ9I{RWTM6$Rh$cg&VJPrU){Gybx2c)EHEn8_JKJOtAy*P-kKJf*$ zPGV53GcufG(Hqzb=E^dX7r>vCLxy~i>fjcEl?DAo7K}`ajeFbMLT7~Y9sva4I#q)o zBK}>^wQ+R=_}>*O2RJa>z{B>{K<-Xw)j@Ej>mdGoYNlIglO(CWy)PHW(UssY_9n2j zLRimWSj8sry@OQ~)J^*0-scC-*%+rYj|+jX?t*);(Vqei%|`5PIesi@;jy+#c65;_ z?&3k?(@rl$ew*DLRspbqNx%a@*CfPL&3PbAvXwY32e}9KHucpp8qU)Cu8GUb=q%Ky zGq|;EgvGxG{pKxt&l4q#zxw~mGVEtR3uMJkM8;Rx^+Vn5x_u4r6iv<1p>-|(JRNi^ zh4?T~^%CfdK`AQj+Bk^yYUN@j|nueGWn4fPOrpNdiiE(J936K=#OMt2k3m{pVt z=PfNPvcc&`7iLL>-WDOQ66!qR@J_qr2E}*X`7KqWZMFcXM~smQ^@9d98OTSdpu?;j z;68S_y+>`}m(Nl&ybp%ha5dZB_2Be$nb(1zP}~(Yx9oYzpy%=dE=&#WO1sFPMGt^` zuG8h^l?`&cC6)c1OX18$VTD@5yC8N!L^%n}n5MvuGJ%1xm}XKksTt#o>{Qs|C?F_v zqzo+KVnk3`f#>&E=j0`B#22-}%fTHi<=!9ysrxQ4+S@dQ~VVk>!w1A;tLQj{h zKrTPYN&AT-k+VF3t@wyYD;7G`EXFs~kxO`o8In!kupt~_e*no(uSWrCuPYTj4CItN z<}5JemvUN_lq^u7TtY{^c!-7?@KVZx^IC;JP)^Fh56uDaw}#L@nI|>%-<%z>UtINx ztz5ECq%-374IBVGB&MVMIz*|Z}sA3 zPdJeW@gJ~s@pNl$1B+Bm<(GB9kml1Eq}bfQ;|hv4mlanq-9Uaa{WU7zymRJesjq)X&Bdzn6QY&V0)p;F{yM^edpWJDJb6^FxP{sEpjaAI4KVbHq}=;Z;_05bX=5naWR4RjMe{g+ybeEcZl zkRK{8a@z~G4KK!y23cegp%?gq+r%S*-~_?aCzGG{AkJVsc%J+An=P)JBj;(r)p?>m zz;oc^s=7a=G%5~dfx&I29fB_A6cv2laR-_0cr?#dMI{E zcp~qS-0CK3x_P-9aF>iWm+GV=?N@4_}9Ef#L?Kl0A{T6U-sXKVollUE@ z_AbqV+FU?=t1afm{6MsPi=X07!9E~{3J2m+f(9Z^c#N(%m2C>04miRRd~0ggfk#O< zNveMGA#TXE?F7EUo#D3wc%F%+(js$hAcbv7{=sB>fY(%7g6(|ULlW!d@LLIZKM;*O zYA6_-Gpxt0?Lyd^bzB3H-zUV_n6qWCNI0D(u->4H{f^(8^A6d`y@9fK;w2bdTL9d$ zqwvoqC7rajP-MA!IO|>b8*J`IuEIMxu>(G5b8`j`gpPi;ekGHE2|opjkj0A+e~AjM zUFgRQs=b991m!L-1$*iSGA~r|fxoQe=|C|bNsPL2J2Z~}P$!^}(TEniA z++=-J1Z?X&jIO4LvW`bR;XedQYBN{**wd&lPU8bo1ACI!bmJ6s6Bcd*V(I=|OWotY zkO`HhXYex%rKc>h-zAss1RFOSckc`;C5JeUo`5&*hdgE{Rl+CTqLzr?ySuu`0Iu3) zsBw-aqo;cxs1tvH2aiG=n*+E1JceaIvN>E&Gnz{3XOfGz0xkUnL~);;i?f~$s405s zN=NAjyOdG4<%hHs-tPZ9%_KySrAw47Q@ZT`Ni+FBKmETnlVB(N)4e@vyeSQqz$=r* zk8kIhAk5e+MBUUovyC#zAUl~>sVOEH6S8tZ0kf0_*xw9dSKQ1fzXC6(bkx}VFemK> zFx|$`a@uV_p+1w4cBy>$sRXuxxfU`W>b6Ee&l@AY3b#4bHaZ)6655-!wg9DwdQQEd zN~>!}s;MfC_027{+T1r?p@;cwzo>C`KQ*_-Oj6qKm$FHr@>uWvCMn$%RoPZhGfg4% zmRx4WQ9ty=uW#ExwN^azv4?)a=9oPKHqCx>&eW1dp$VxHRCb}NtzD^#05cd*9aJ(p zrIf0h+G*hRlJ&a4IxiUF|-2o;ChDwOh3`S5yX*n2xFTW*O8qJ)mM) zrnpKcq6%q_K2Ija5+U$P@n>l%_>P zgQ;{>G4(}7gdWDcfVn2CY3p6_JE+!t#3ZnDyf^9wv_H?y1Qp+HG@rcER2lQ;_Su1| zooQm{s;YLf*UmoTd*&Rl=a>F_)mxocrR+lNU~HS*PXL`?b~TKidL7k8yU}~#O+!|* zNA>h(Mz!}s)N-%AztWqh7ON0dTs>1$)Dpk8siV$BZLw=@99X`Qs;sF;ae+?Z%r{((7&fHs_b}+&8nj3n-h^g%n84omxjiKR#IvGlF%E~F+owey!>jumr)&w zy5zU;D@0}U-b1NW!jJZDnEYO#V$>BjMpZCVyb=BxbI5@+k z(0=HK8_5DMws}%+iysh@TK!PF`~a|+R&fXALyF=HL-Yu_gZC#qH2Vyriz+_&@SHeJ9}55A?;!YnU4NTOuy@+PC^rT))u9A<_WJt zl?Ql>trmJODmbb(t$^lfEuO0cCs6^Bbxa=g^1W+n*;!y>p<%_@rY zGn;8@n#xRfpyUlV8%=V8md_^fF31l2Y$jAJKC4c)hRJV3pg4T4Uiv>&MV^d$ULq-K zCP2A$UbdJBu%fr4(r|}>U)p0PH%;aH$iAY@Wq-JBVS^~pJ~UJPXQrwBLMP4N{usLx ze=|m1N@cU_!icOf{mY+a>(c;L+T2tYOwUwmf&Uq^O(&Z* z{$LetcKaFaSW`BtqxYv;$OruZb-_pXag&5En!M;dJqPOFX;|HH=9zl$Wk#IvN>w#^ z)GX>~Mn^3(CH>qcE3${o<^axTNxB@G6g?<*sTbZCRSx`g@oBdUQ^;R*TIy zuN=5VdCf|75}HwlYP1#hAqVz(lQ&V#!>q&rL|m0ue=ntkb4BiO?T|Jz%$z4VsjtR-~4)LZXfWMUd-e6!YU^fOT>Z?xKcP`v5R(ma%S^>g8};0O<2|Bz-Y7NP2EYys$1bJ!PkF_nc6y6VMcCPOrb^U26Bjlky;-5I z`Ds|9WIHs3qQFzpxo=o*szrJ@iMInW5-$jMLFo9rhkTG4uxN z$1kYPFEHdojgR@nWLns-elhhuw3T@sb%^Rkrtz!M3~!mqPYF)XvuprI- zi>9pV>bF&i{4xGAf02o0XL=#t9CgoM4gGRWwH@}Nh8b)wV87;i)4cvdQWy1-Kpli^ zaS>NV2cbA_tqrD(oQ@NO^#OK}lb70o{1g#d7cPjLG@JVqSZ)Lthd0CoK29e&^(Y{q z;N7{4<_XwFn9l(IL|$7E9bqp@dM*i!>9o|>gLE?8oj2=g6x;2Qo|ICcvD6iSm@Gxs zxJGdE%b!FfX(<&h>$r2H4~hWtZtvc0J~0tjFIxwr}O4WHgDu`b-Br=n9`95=<7u_uoVQ z-vs@Q=YY?lxf56-@98a&=fdh3swMLzfsF@@VIuOxGRWpuA}U(M-_&Mgf}Z_GD>$in z#E!n3{6J;mK?9lEc9spHXZ^xd4~SMUYF2OTNMzW%f!(Fo>-mbLe=ECxtChDM9rP4t& z`kJOz478v)%>+LF&`hEZHnrO%kAQwyX-cw^c^UMeo#%h4YH_Dz(kq@ zsb9`3Q4v@taoO>8Dc~C84Yok}SO(hPpR&bUV>SQ>6F!3n2 zo5`{D6_wdNmFv($?WZk31nbIR38ccPG1NmgHin7=>**L(9H%{=JHpFwPS#?Vv+5+W zD~1z8!O|4iesg;gdoz)jaB8rRnju@olpyTQN#L8lw2-ViLXz?y6p6}f0zHmc$In3ovR*Alv{EPsMb9R0n==gtU<=T2;8E3VC0eg+)t8 z%lbCF?i_X1PLy`2#&1G>fHh{cx@$IL^lj?wl>#QX)0B~I@Cn0EkMA4R-DD9=-ay~V z6#ABIm3ydijsWxUEQfJ6Jso#Ay&hwmQ$h4BzriVi!xeF{(XZ&Zl#Z#spbi^h4^aXj z6SuMZV>wjE(f3esuBS0+%d6?)WA5f;-UZcMN1&B)%^R*NtHFzjuLS7v1R21!QFpsQ zk#-s~{5d#{4^dwjZJ~MtUwAok`w1N2R_jEv&l|#(IW5qb?ywehfn{z(HMA%v5Kk_E zC)dM#3mJ$^`2lQC2B~Jtc@11Vo`rv%gulse_9-ux4*Wz0*gvH;?9?7f4wmM2e9ki4 zRL=wNeHPU01o|%MAtJCYf5Q4c1Uh_zCIJ)OZfhgE{*!;vFYrpn z@h#v%=zNC^0Pk>Os!hLBIi22n06dj|>!HsUDk+)OO4KF}b6MEMTRc{Bq83q~lX4$?>jF6{ ztj5VQZp20LOa-Mlu*zujH+bcz_zm^pa(s{8sX~~-d{N%QP8R20vKf`W=aL&Z=`LWM zlfhxl1s%poYK83esx1x#Fs1upQe)~!cb)>>cohjkkJ0mTK*C|UR!CZT0JL(5IgGX2 zX&b|)HkDeojw~doPPrw$M|C(rM@tGR319jz;(^vcpu%VrI3GK3W`5X=uy(WL1s8x9 z`44r9{*Px>+h(3$g?I6<%^GgfLdZ|IPxh62aa3~vk$~;!`%_h`gco!#a zz~<^BY1{*N@tAo%0lJN8k4oHl&cQWNAIYO*CLqakP!Gkii8yzwFVrCL%q-12gG@A0S{gu&Yd!{!F*ys`o~Yc^E57ua;1 z3gD)C_PI)&=V<*+HD5i5D4>njt&2v7f52p5`TN(op)SLJ*^j-~vE@HzShyNL_*dj6h}cIQ)4cm)br62K|B3BL+N-8pJY< zZX2=yk;N`s(p{A6{u-RIDJ}|?;&nC&_lEBPGmpPo<|R^$QnTgU?hZdQ#ZaplB02PO z^ADIUx zt9)F#b4>@S7{JM~h7x z^qWY}`@sH~&K)t;U?yU*6WFuOI+rv;9CVn{$nWwUyLsNO;^)BpgHS`-1+SWyo55l& zfC_gCu&*Evz<&HKA8`AxA@Vq9)<{aQYQFMTiBT48L$&MyY{W#)#@k$0*K9L|4HX^$@Q>**k~I;Eh!p4DmkL2YWj-gbyaMTj-UlJfd|t(>u4w<)5A1dcGEZ1 zUZYSAS&9x-!MtAe70kN?4<@_5kC@Jf{q3tt@C>_ygHa*I$0)u~}9Zfph!S)(0zTfQ^}PGYB>(9p=6a0IPg2VzXqj z9ktJT$Y84RB%6z;$Y{)6Sp;8aVa@;K5ZIEFi0Pm6e47A08~Wn3OtM8{kTti}#$hlw zxwrH&A=D0e(;XhJ)`Oi8f%s&XSxnjOG_VHNqS{@KcOkMo!HuLArAEdW3eP*!ZbCGb zo~Np_yn+9r!zMr2>qq>?>IsDjrkRHAg>{bcfHjf54^S^@H{#d9?hBVjP46nNvk&bX za;P^)@YvAA;4vNLkx-h9M-})ztQ;mp;f*sQTDU{#E(5N{1OCnJL@h0&i^Th3Qlu>@ z>upDLv);-F7%Wj4Zs#CsBo1;p^>9QJ(_z=*>$|X@^ARJ>fd@TLQ@A>qVVmTh&4U>1 zcPb&lSZQJ5-~Dg4KV)2?^6l=#tEqAz&D^lQ{Y- zZA5qL@vt(p;eE^MD!7Y7B{nS0aa$A}ZBNKflakBwTf1JC!a^+uI(e5CAy>xKRo4|O zUJrSBANbe&Iw6pR3aE%J=j8{S(Khs_wQO4L?1GM_@YTRiGjjqzNa0lB);3 z8Q9 zpOnrc)wh%>g){Q-Gj=YlxVCF1|Gi^OUMkguN>X;l&f{eDMF1Xbq$11LExE($;Jg zD7mFMc04@~LLYZ#9$_F^r%FW&!;tzqv7B zBc=etmfG#)%-|Yb210fP_n|JT?z3_0#=*iR)I}vR7PT^%8l`kczG)}G@1K(@z(MM} z7`1HzXK5Uwy(REWn7Re8FqTi-(NtL2R+aJG22trE`I~})keops_6TnMS^E`PMYP?? zF@4YTAv;HxcF7O+YY^v%;g7n`ya1?$N8{<0jg5}*FQD@=cBi>#TXFl)#xh&S;|N)b ze0ezEkm+0uPmO-(666B#t3NXEKCtIOh)rIw!Sl|Pv8J%ija=d!Z=syF40sK@Wj3ZB z-=QTO%iN<=veL!H^t$4O;V2OQJ7 zyn~}?9T!FX{*rFkL{d+BddFbz3St`lMC2^c=G$)+N7aEnm~D>nW|_*#X#-erY0xoe zA!=RKD3>`bm#}uTT>DLrx)1Yl+i7iMv7NI12gEI@=35e0AQ62x@|o1+)Hg0hL?GY+xPG zzdR5c-y6U?d@cenA3_0`zdeTXbNN>21+ zSt)}tzow~58a5lJWCwOK58|ryG6l9}CnC5z^cXfhD^TSzdJJvF{rCs*^mMyY78^|C z)w2-kroeeeM+MHK(Wi}T@;&5u{ek0kmnh_%@!cdk$4O)#{-l67uz$u2(+e9LcX1-@ zLSI=6KQTwX$sQTU4Q*OEW^B&CJOz*b`A9{Sn!Ph_ma#Q}{^$Wbo9{sRu( zT6rT?c`E&m+lpC;__I6O!uki<#HfB;wDZ6{duq^4%g3#y0Di{{(OnV@PxBQBdKW%| zo%tP1@Jm!5D|%UCp}W*`sl{Q44w6CFvkvG|37yvU(cv^ze+GZE7d+t(IZRj0Dpw<_ zpv$haA;&YoCMNK4T8$t^@>SW_@2q>H8NVx0!UOQXMrYvdN7{u2b%C#H=ddR>diBR{5sq(`(J(@iur zCQ&D4C=Q^Mswt;|(l&Lo{nqfNsi2AZA#p4SGT7iE2AE+Jy6o&1Ai>sa_#S=?U=^JN@*)p0s-+%U}pDx7_`B&w-b;iJ>z zHr_M~@obgcZ?1;_7S_lI<2V3MG{axO2D$!zVD2~RE}{#dyx>Cb=@3><7u#^wED;Mt}`#J*gAwX%EKm`bCoz-ENoeBi|`P+-+^QJm@A)EQQ)1+SKDZWb{6Kj5!| zWImMuI`ZD8a_Dj_{{ojgVwXvf3UZmDinwF5^Lu#wddQ&R18$j2k1O zUC*~@Ga|D4@(?IOE@Wiq+%hmOcLI^D02Fbn?k0nEC-i+d!>im`xh5OwqSOR>)K`)L zZ93%LfWLjpDbSNT-qUG`p2|_?cM>zXN_dB!Kk|J!|q%LMvZQw_HR0kn5GD(vIV(rV25YW z<$-%o(1`09UwRh9)RKNgw9V|eeU9!9RXjDCaWr@IuQ6^Oigg}k60 zh%zf6Kb(WRKU)?6y*?*}WH;x;iJgzE5*;G+H|~SV|1FaTPaX%i>#jOx%JM{xhk0I> z%iGVCF)BM>=A4);Gu}3Y2k66i5IXIjk&SoMpV%OkwQ9m z!H%Q0QQ{#ry><^s)U)F_TNT@+-Lpq&vG!57pvm#4zFT zjOFAal>!2s%@*Y;z?kBOouxkDAFQVvv;bU@%jTEOhhEYfc^)F^!m6$Q>M!Pp_}35Z zS~V2sq_}>^0|mXFbbLfxxuDG%BMDIxzd+?&6R_Fy>uT%qhSx8ox1o|5h6-$IWbXa!6gflVTmW_s>PCczakG>vIOAXL#ZCmvF%dV#LNT5T9`6n#z2I;Sh!*@2qjaUk8TQyw{ zN`U3C>?diwWYn(^7Xa6iTKY1b0anr)`ij}!S%$hF>+}tg+H0)s2_I9z5ZSaaTd51T z<=e7~;(@ObNu#-xF2Q~ANg3Tk)I^KJpQg~htxU`CXZxinx-;wsf9w~$+AOGt6Uj8D2Og2>YXP+e{Wy;z*+*lrH));GBid*{c*HsDZ{*8x)4{p94ZZgGJ~`uLoB zIBCUTbF;`ccMD!Hmaf++Q#)cy{acOXs6ek+sl7;8wa?Sri7k~ zJhucQlwoF^Tv2gcAiV7;3efBH0_e6HV#4n%#J2l|aWaznE%bZaOLszM85{eV)W%GJ zAI;@8y3V;_(1Q))Ju;axpnC8dO_UzCxJxHx-471ZfmGBkrsBBg`FS>28~sAN$q%Ux z1wy)VZb;6A(AbG&mX)N!c zA&5g+V0|+o;%x0snZA6VoA5ztu7BaSC4psF4S4w@RlrRT)%PfvcJXOy1{MeL6S=^N z5aXPcnQpz*vzc%bg86sx1XHzmD8;u+sS$GOd|(O{;1IXjwvuJ2%??Kv^(Ri&HT{&I z$rx0Qa-oAtY~1Lxywy%Z4PNWfe9{g1H`(sc%YvOR-`#ywn<$>*wwAP z0&(g^(sI z0`cP>c!dnQIB@qgu&6u1fy)~911BVc!P2*aD(n>?tC2j&^`qE2q5KAay-T`DcT?Ha z(2K!%dB~Tr>X(6Qx5N2y{EJ_i6Y#;{oB%f(0Sh?=wV!xlTchU6OJJ~1aRXzjT1{L< zp2Q_}THs3-`1=i6DA^JHbp={~Om@m-^uS!t4rt$O*ufmG8dR`3Y-RUYq0xSCPsZ{C>8G3N3SdiRfyGYE zv9Kn?(9dau&IGJwGj+#4d_*1_jp*;ReC5CRiM@mS_?lbkOz4MoS`XIBen!rpPSVOY zjsu3=bwW2;dv}APBj@`C6irIun8k0*Hhw$$E-L^)tVo z>#o{B7iALY2X?w_0V13oR%Dla!&_bCYu>}hKr)8*gkq;)}DCBA}JkA?nS(OJ`_}bgeskoQQjkDbc9WO@MhtdOV$XD>SvlxB2 z-A|xtxezOk_e$9=;9wq*UG^-jb2hLsry#PQY=1-kJ)HicgA@k{(n&i9IoKdshFe!w zVoS!Dn*{!SZr(_zsjOZ{k@OOE`qk8u2fzz`mC~r{)v;B%kh#QvA+P_W8Y5~h+ni06b7v90sk!OBDtW;2Ea1-=W&Zi%_BJLM`qFvx% z<&cEKIVdryGRbupAq?6jC04wp9v)*|!i# zV+zC+n{gjI+c|zZ_Z=sv4)Ws|OZ6I9aymq1?eRqA+&>aW|8B=}H*_NTVrL=~H~=5A zjwj1$x!}rkJ4E({5qG2t9bwZ%r-oI&3mw=cDyKtGmk&gi`$aONvYtt<1OQ1xHBc7& zzbMKKFmceMXoUTMGtmc@c7;3bqSREgi6_Z*c#5Kk*zViioE7*&O?6*|nem8oQzKhz zfm|vKUOXeObf=M}r`ChuxzdI0N9?$Q*Kq=GvFzqm=q|U3w#fi4p&sK*mqZ-=lB|4z zrzk}ptVGk8ECDUZn(|oGOS{7tAJ#j05jUhD%rcxM3$dRQw1?Pujva?gr!=C$gTNQY zOHS^q58EDkp<8Lwxp^j7^7D3{qpz7;u(<^}m5i0ic-Df*8?rz}T#gsm%*YrHl;L(<6t%2ut{bX?zv(gXJcC$EGQSVq16EU5_5#i5C7=C%$jx>D z|8FBdC61TMwRe?xlk8JUm4cnWU^^iKT?*fD3FqN8vbSQigsRv?=vc#4NpAp-S{BU7 zPxb@4iU6h8*X=N@@*gx$9p{evAz!uCQIiEPM7ARa1HLKi_#*J4{pga2?(fL@0-Xo{ zbc2Ub5WGNhAapfl1LB@eHXiuHhrlH63bY1KjNNbI{)Q#n?ZtEBWEzmqaOq&1+oN(p zmx0~Pg?*U8%W#)w%Uzww{eTyYALAA6Y$?J8B{3p2SP|d{L%A>Sk`3_nrNO_Ag0EOD z4=95!gx->|5jP#9$udAbsFQYq?F8$Bj238NO=Qc1+;-ZBtPPzbZDO#~{=d^qmVpei zSh3PYi~gT9lmGM6|4TEu1rrDVGmBM0)5)u)GMmk`7Zb@aAI*I8&!YQmV*j2O*FcjO zTF^xLJNyXM$6N_*sSDe~Py&83YrJnzTec281AXBuFO|9CC5kG9sddS0A{(2ko3>EX z^nglhlGSRN3Q)DoA}CnCbmP=HPZ_^!%vukHw{X#tWf%lG>gqM z?-0~F<ERC$@tfJAyi>F|fR2sWLR1kzP^y zXfB`=_W>$shpAcA$TsvU+bw31*=^6!OMj@!K$W5XxrDeV9gQ)?{rAw1et^nnh8;^; z)Nw1J)u^fgPhb5~apjVDQ!jemo0R$ z3N_o!jDvmDtI+HIyQoQOu1zE9%{NuSE>}PNQg*T_uipDP)iy7-{bllaCskpS(IkY9 zX_nb*szX_u+Z0kSd}B^S0s9*`P?OaKbJ}yzm@f3HnrY~~Q<2hA9?D~qpof0}nyMD^ zDK!ccR|c2`QOo@{suFgni(lV1vB4Z{+pAg79hEdiZ5irF5fouPo!b_`GnMm`o0)j} z``({suHB0N&Fqh~N4z&)GEC{5C&{UcEn-fZgp}CUGEcC-y{V>pV$xGWOi5{vlM}3t z*sRbIrJ*wP%B=EJVy52^wKQs_-JsHW@q7;}Qrd)=M1I`ROg0|0y&u$Zl^1H@mS%^ny57XJGB|il=t2N69~oHDswS3fIh3KAKJ8Off;`Xw*;DL47d$=)PL37OCxOiOFEjd+|+mo(Em% zaPznvo4x)kZ*tT@zenW3kau2?DQ~)~EYLgNx0U_)c5hSyTC2vW;WnLD!(KD_>_|da zOYG?}^N)!`spx=AGXvClKU{q@B~&-M=cV&K1r8l{vMEkMQIpBuQb$4;k~ME}I?k$+ zHYF`k{cJE!c5&5}uV5l5hc=^>w91yWb=8rBPePwkL6rn2tq^uIh#nbMA@-!IVawWR zbKI+Mvze^AEEK{sv0ne09aPag4b6^jXbI_}xov8xk@OPk;gnz~_3`7WKg}L*uGy$^ z(;fF`R2rL6a?)Jy1Lnk5S0_WCtLi+V>|bga)SF{X0ky_E;%!!w{i?8kfi~Fsrc&rz z+HQ(UJ5>lwgxcO1s3HS!dkWeqGzT{1kcn?=n_d1&Rg5CMvWUaWL)AMKwlBNAx?Xixfc)iysKP=RWCrE2cCjVx#m`ghcFI-!!&EpMKkg#A8`6BB7x;8PaZ z##CFC@G{yL2d}6Ay!%~MRF(2Vp-4?^<3suO#$WAKK$KYAHpcGM^Ixm+&<%E^Ip(^5 z-A@hu<7M3Tu~_dg;I0X%sOf2Yd+}%#?&ksZGqR{34Qo8moQv#fCVS=8a(mpnWv*dL zZF(C>r&SgDjTV|4=3iLd5H;J(g3m8WNmXK?oV#%n>QX04$Azr;;l@MNpryYnDz96s z&V(K_cV#r4G8xfZBi!uA${zBQP<&Ge%&a6d##W#`eowtumG*JwmtpZA@+T#NY23nx+D^XY$w!YP8pdCWIa`5$Yf{^&hDf{x;Ly zR8?g{yW*ymH<&|1lf8e`0H^zl}Yln}TgWUKRmysl;)?t4a@qVgV4c)L|`LGGu6&FQGre zj(q0f=CdgPWVsY{mI;BPhj2P%=hdLhT#4GwE$|M@&}@1Oq&7G2Kt*+!gmFC71JQja zY=p}IZ0Lgd9l7R8pu#ngsh+}0{)UY92x8(?z?VvZ$<`L=LUKgpzj&kjj!f$hRN}}V%!)AW>R+sXwgYjB2vk1TS_OTQ+BVUK_rftpNaq{k3pPXQ5Mq(?{<_r zx@mj`?27Z!R{jD%A__XdG^nS{)9-Asz5onpHt=AjUm`cS#+v)s_dptVaeDBj_JfC% zlumGb_Yt+^yU0Xd&?d0vequjbW8MCsAiUdtTL%1}bU@1UBlG!;+;AqBfUa#RP-P$l zc$ZW6Cph>u8Ltg}2D&%FAm>=mrC=?zLIi1X^Fw449Nsf$8|uPXP%37IT&&@pTz(2ncq`@V)JfQxWa&#1~SBkeesS$_q#Qv}tg zN>bFla78H_s*mOQrRs>=wAzi8{OC)Q6sVvBdNvCfs?)1bZ>g*IQUcU~GVv(9O$$^i zTc8$|)#Wr3ToPTu{j!h13I5MZ?b-l8X(7sO@pI~IZn(||hDI$N0NW79-Q~%8m%Ak; z>?@n!`TloQ?SP6(6)BDN-!15*0;Xp%RA9Q{K2{Fh4&1d3&i7(Dgo;lOy%=~)Ew_j(_3r=Jl)VOQvnaH!_>+fKJ=hnA$VLcpq zbs#sU#5x(!mzVHGQFm(MqpbG`|6714Qf1rq6a5_q%@6QzO z$NkY)s+cVR&TR)oGGla6Ah7AAF6xCxFdrpG5q3x7xMy4)NJ0{q2fwb-L@4Eox^hltWIox_6+d0tH_5=SR%S>%??txv!%lWQ$E3ymo(QZXxqIN1N8i>ph;K`|S-_%>p}$s5I$;Xy&VFnj54~nE ztp@wHpZ+8>?NA`Pl_WKHpkSa&{oPGtB%waV>A4SAbXQQV2n4fpD%F9qKQ_G1SII#o z!)AgnbWA1T1GLW`=ih*zlynDpyR3yzoN6aR;TB|o~I1~98uY~X3*>jgxZI245Yw-x8AEU@5(vRK!VMS3rAxcywtUgI#-NAl1S znLx96ooD!hy(kkoM7nYVSeaXRx>9Z>&hQ4EPKW4ju7iF-DRez(FHdk{TM^Z|4lb@v z!2_faaKpoP950hig1IH|lJzX>^MtN(xJmzyy#EZds%o~dVRBAQ&N)g(KwNRuhZ>blN{ZcsnHLZV0YIQH0%U75!=yj zB0?@?YW1aXfh_00*WAnvmq>D)r0wNBmyx|)h0rAL;@KfXlMANdKFE-;Uf#1UBo&PH z>u{aR;2P_~Qt#IlK}P(9?ct{^5x$4EF!y=q!(@&fZBNnX{;iG0xA=yz`dSO2H}z8Uw>so7?j$+tYqjhqvk{_Zd8P4;)|zrJ>dWc{GVHhF9ti>vv!o)W`iz}j%G1g{-`Sf zW=MsLtBfu%on1-yJ{)pRp9f6!UyuS7D1*;}W3~q@#5JDwcqTazN@7YfNPH1hf6z&)m@t!0P8c&GNmn7Q#EII98m&wAY^<$Xcd2TpT}*%*{W zf9d0gqL9z@6ZqeEaS$bK32MQO`UIcR34P4jE`r)N6UKLxIynO7D(>T9djo$+3$ZVA zqPs>H#3Z=c@!VhbF~}!mjs>PXYTg8p%{U#*6JSS6*wSy&Rk~U0`USkf!eq4N%$GW8 z_A^npmORx|Or$H|`bcSdP6x>nyNcPgadJn&Jdz*%s5ud^Ff8{%O>%nkjqIn~x{J1| z7S{LRYX{0n6uL!d8ae1ls|EY}rY-Bz+jo5@vzT+b)x{CTD@s|=_fp)E+u^SBgDk4+ zRH@?X+n>Oa|7lfvW#T|nHMsG4xHBVc7gW04S`hXAg}u&+t--S%8UF?NsyFlVve}nz zwj5MX-rhvSOF~4QlOBqw9>=o3t?9e?Dbz}oqVj!rbm1G z%YA^~s*dmDZtE*DB+O3Cn-+Gk3FZLP5L3oavOVnQIOuaSXL3K7p`Pz#x7$KQR&t^K zB87Zm`<}UmdY93+qFPufvrRQW&F4q6nMtgeg-&r%zhqBHZud+-ufq#M%*e=?1ODz0q&8)hhX=f@zQYYINS7G4${?Jl3qYsZ^1 zD14Q4gLF1ga`tDEmkMUN>4j_MFfl2&{}cuN207uSbOBqo*3ME2T{B{z>O4t~$KVvY z{}^WB8(c<%z%ti$lxIhwJIzn3@3SWTT{F^-_tp5jW%UUzh@$>0{~Eo#RlwY*Oio)m zxJbO|#yyxI_3``X@)O+z|Ag;W)~_~6`=%`}w{bS94|*!P_eQszyOcE9Iij(;SO?m+ zWSgS4k6(!L$SmlDrSgq@u5WU_&zpb1E6M#dY078MBy~{PuWCl!1WH&<#JWXibCSdT z3t^|C9s`wh*Oro&v!0RZJ@42f_*N>#kCFFygB6H^_i>sYcX@0Dx(5GqljT=x@uSiN zk5XaqXwvqWHL{1=bt=`<0Ds@D(M_(97Qq`b2&8|;u)EYZCL(RdWuK3_h#A6Yu20-F z^6(sa5H9-GItjKH^=}~%`SGYXBE?X+f`L%FodtI#b@|o;H z7f7PSF#lq%oROX`pVao7aXk%iJ#}Ij zTR2}-*F=IE0e zTN>-@xM`Z-rt}ARzc00n7Kb68z^1GAypexR$@sKjhV+`Gst&O!=)Q}ghhYk}e|yYWZz5nj$_(4(QpK_l4F&QcDxjuv`oN$ zaG#Pq_AbaM8TX|WOzBX0;jUVPx9qB!!oOQVoEUGmh2OZmMEh^0oGon9%TfEaypMie zoysAN|4S!>i{{BFrVQM4gXOCBFtM(Q9TBbpdA0++_tVPuKeX?9OhYb8<@g4t`Bbom z=v0FkJb;_o(&gp}6w#)U$+C$K(gbcvf>f}hc@lT@Unv<}kQo<*^~ z@^4!X)fBKl2jAl*$r5cg;pvOM0}T6o-h_*cpHB~`RHDpBwM zW0PL91%2}PVhQoMQGS;Hxf&qBIQc>!f|y2fgZoPg`!T+?ruI!Vq%(TSP3P42Bf>l& z5{|%8G@U-Sx2X$XYB75O_jz&O-;ZGP=1tvT`rCK-Tx0Q)jU(@+vxZvYF;C06{63W* zpyy!?`i6_(X$ISdblfq0Jj`Lo*nX~(|JBX5o#XR^jI!D_zO6mv4%(Xj^+;N+~rZFsej@F-JpNdHJQO{$kJf)VD*KsG?#(dFg~-HF%u9ufYk ze8+t_jgxAd{fX-FU#ZV*lT7l0n)R~oceO#KY*3?)Uub^TA$pN~_pup{tKy1oGfmwU z98EPrMPHgGctnJmSnt>gI#NG`p>b4%kENj-O1EQ-%_08_-(!DDbtWOUqbIN(IYM~P zCvncK2LG1QIyeLefzu0XBO-QkJjUNhJ-d^L*IZKSJ(I<5b@6UE*dl3K!d7_==lhH3 zLfFY$x`rP4ToPwKWG?^fc7l6Gb#W3G^&^kmYQIO zh?DF*t4&m+ANeC>fxBjzePaK{4O$r1baujM-ft0bb9Uc>cs*PX$$eaGC*4h(*H_|s z7q#&w6B+P$&;Zsi1}^h!KJRzTT^hz4n+kT8p)Q>}YW!)3- z_8qX}L72aea?kziQrrCa&zsS6UYx46o0~z!vzeN>g&pQom?ctzx?}~Q|IA%UWaeHDWZoY5@sREn%?QRnJ=|3g~4&e6I za#OTYBsq?w`nXtj!t*>fi!>uyv4d9h%Uv#N!}shGGa6oKTNuOrFD?H?n&Gf|AnoZh zekvLCGB;!^Jl{fG5P9&dEYowYBRuB}GG{7ZNOtQQCR`nqebRs`rK_34884<8*-bFo z80{|C>7noAexzUOZTUzhQ#)QZNmKMogvr?1vld@abwyzb>d*so-ksLDZWf>RJb9&3 zxBwRasjj6O`CnwEG}Ahuk;Z-o8KXGZ^SDWxGuGK=@zr3&{^g|ZHCM?1x$t>Zhl@!O z_O(9D24>zJ474*~I+ioo_p1w47 z*A3H%daOP9DXpy!*ZZAJbx)<3WboygIWk0khHGnSH<|=Ys( z2xIY!HMMOnN#SpU4hrE>A1yH^J#|xSCekHs7d(UVGSH>9 z<@^{Or+GzWf$8n<80N;qkG|n9$!sEGe|pP{bK607@U+#L?N?K?k;zI^TV~%-PJv6m zG)L?(ofc%%QAE3%I$gJ*AwAKb9NQQET z%EO-3#aDe+O9v%2#;-Bs$vw|?DpB(q6A^0L2d1~(9ro96P}Nc<_vY%?v0^&8+k z*TBP~VfyxPwMFgszL^Ac6yS>Y$*7}GXx!1`E>&$H&uk+EwDuH0j>QANsH)kQYYz{U3LfL4pxT0j5XH?dIYeQFyDFZE~ zo_Wu@pB}CAI%)pHh5#d=Q%g@ z`I#y++@{9&H%6|6bg4+0pom#aw?HhKS`t6k)Srd@tZ2~4I6q5m6Hd3imjNN~SN_^C#}o zz35f50L^17n7bgFUuksEg0`IPs57WFH*z{!4q* z)+gF#kjH4Uxh*QE9vSji1Ru%SSTy( z^+>W=l9F6rVq`z@rUSUWo_y~dzYpyap5_ET()WBHcD6Oc8=Ot*Qf+J^<5b0$+R|Ku zwLB-2Bon;bE_aoPn3CG@fQ{31I0aTmm-^nm30mbMb{TzuuQNLxr%m~HukqVck}WoI zcaL!2XNbyONlsMz0;Tp7-sO8#J5Ag%x1Ub2-rS>XxY!H9a$E=HrKC3fiMhuoL3+>3 zoiL-M28pGI`&>)5Z$@9>3eJ6IzHeDv!XKdij)jLSW#fHkqT^JZi7FDq`zRUzHt}wO zT^VknmRbjwIfj{5>HG=zf&T;EF^XzfNe^nh;C0(NC=K4pWmkYfdiyANYP)2LzscLL z2a12gSBk!iEBY=Oy|j- zSp5wixrV0qkBHD8^S&3uc+8Tr!C75}a`PMxp$aU*GnsBum?GeaZgkXnW{x$X!YVIa z#o{FRlekk+`&;1zUez7Z5>)SXL0n(Tu`t1S;%GynV=M0^Z&-y)@&&zajir^e)C|Ee zJA}=LHT-dNL-BO*yqB5m@S~Ub=0CeF`aX5mEN<=-6Hqr#V5ZkavSn1BOBK6WhfCMU zYTwWf_tWhVsb)7);}oN|7-d#+IxcE?(8^F;R`r4ga$1^#WhUAa=6JAz`8~shdgP$>naUeSk9BKrIaSEMjq2!J{OhtE{gO0bW`c6t+iAahT;7xUwIL17EDQ z*>w*d{j>BHj}MuS>Q;E%B{EPCpuQdRuee3H4c5bko-~kamVv&R=>e# zw!=Ba&+_=Is&L?(>AMo2vBR79q-fDuse;?qA%_@7Nx48g^kj?vqKphdR9fDfY5U zg_`VSCRu#HVb?O~a6T;Waa8B?e7hPb{(0<{9T?gDe3<{s8Jo z3-`K9m|G-$3q)L1V4$|?YxYU zo@NtTVQzgQ1BDGty2!o4ypKIP*3YB%Eb5c_IJnk4J*(|se9k=$^Hg_!Ft;Hni=vCTLY1thz#1!H)Fe#k;Do|`(I6IE3g=#MbuDeO|% zml2W)9@;QhVnBGC8Gu(JF?PLxi1BeWlE$X4pU6(sJn)j|VSEbXhDzY16+$J;Pkegd z68K!t&4cK1-d}CF(mts59zMUn|JYrXf_9c^6zu_j`G(yg#h8PU8ukrV3NE6V{mLZG zWJ(9u@un;$|M!7?_y;~eIZLc~`pJNcFGTjrOtNX&u#UV4QxS8n z=u8>wYT_Lk!|&OQzm0huZZxOAv)q(Uu<18lO&HK+@LrQ-y;Ot||Js!H=d~@){H@%W zWU>v$Hy=+f9q(tnDK86kmiDlHf-;iaH8px-5mwK_IohP~dN16%#t(|=z=h<)MvlHg2?lnn&k_UFKl8hlHv478v z6YGALDrBCzvO^}D(za;gSZ1Hnzv7!m{tABOq@~dJz*{Np5iJbM7w1dyjf>OCv=DV5 ztDTDmzrZZzHnUyIT%yJsW&hIUelYrBW*g6mOi#bk6(a1fuA!}hcGMS!s13bOg?&p~ zn$I{?$Jn~23e{2#OI72?+i$5va)b5+HLMs|a2K`wT>3({xB_6zLQ>h|Z3MH%QkPAa zoG>aC>7Xs>Cy@b$v&DBN=WjgNt{~CioLLr0;$E&ZeJ7`Xg-r$RC6@Sb27gUP;?)+o z&k@ve^*BKf;cCyr`YzPFc#CF9PE80#>qheJ9egvFV5l0nt+@R5gZ3MHgQux-(8QOt zOjl*H`|omCQlSdIW!EzIYF+e)h}Zdc<+<%0JJPI`N~Z;MU3pDdZ=St7Ci-xj|k@aP65^ z*bvrhofL+zm=-RRJ+?GHnq2m4viN=XPq>EIbeLH5o4f_HTAB!1I6jLQJCA;qwMN0<%fOr$15M8GtD}Q(Dr6@E7(3g(W}V4k_uF@g1}nJ}ONrve z{UmlLc7!9N+6(RzE4Is7s_K-sEO93XXKn!~a;c;;gLiog=JvHC3;f62wYp3T$*vc4g)d_F2J7^hI{^pQ07qCyS<8uh7+iNH!HSuEORYiu z_kf>vS1Tm`BwOHDOMrZf(t~bn2{hdNFxRW3l-z@3NJ0LXLMB~e`^hrSP*&=bw|q(e zKTu+K`wggJxZg2a}k9;t?fvG@geLcUF`NDVr@ji@( zRr%b!O$@2Rxl3s?5-)T42R_bilRT13f3x(J*)3>=+wEIA1%4&Jy~iA?61a8tYA2t= zE#UlYii7bYdwi-Nk~`P>T2j|{(amt~YhZIS;Wng}#zR+M$J*KPr+rSmcw7BC5Z$|G z81L|P7|M85=dn1rmcjQQATkw$LwQame%$t>_KUhmkP?sG3E9sxZ$Yf;L>+RH{QU;A zA#Ta1b`HALALNUC{u=jXADKU=|5%S(tB2fg;EPL=(SJdNE=0`S>uRHJ?r{c&Y!1<* zmAvAwbCdE@4gW8xI!CiE0bWaGC!kMcLbp1|e8+!WV^p7gS{$5}(myg8+3EWQ6~}Bp z#Ox-f=0e-fYtz_9JcD-J+Sa%Qls=&fZkvAZdYS`#u0p)MqWTd!XL{5TCSt-U9)*cG zzzjI{y)Zpxt<8eYf!YTLnMWGCeY%2)W(Oo`3+PRm0m^R6lfFsKvDGje)n|ZHsZT!3 zO;y{}ZU$}TwP`tl#nB30(IWA)h(37z>_wQc)o=id+2yi~li0|2a1Tw4U+A{NxgRwj z>&dXI&!K{@}UOBHT6ef(zK zEmgwmZa-D@=Q1{2Y36Xg6U=ta31&#AwPgpBvSaWGuL>Vi9p2Mh%w+hC>A%+{@QXkR zRkXF37LVAHyMjQadIBb|Z?WBXg(I&N!RK zN+lxVVe~F0-uR8S8JgQ-vimW;6*Tf!>{3%7w2;kz=t4IM6y9E1m`A3$y{}W{MKFOp zJA~@I3F!Vc+mUnjz4WAddY37Hh2z=D01i9@_C2b9NWBn;l8z7iN@h^_Uy*4t73R`_ z$r_`CPQ$^4&)27gCodtzObzq7Hlqf5#Wx1MR>7-R(q1z~{UlD%DLDhyU14Hveps9h zrmQWGBAA<-HozR=c4lB^bUydK+;mp|ak=@E9g*L{Ufj9t+QENHjk!fSYkt20=g<(; z#4c{ST!q8zN~BzfdWF{|xJAx;?mFWQKPB%<3SZpr)6DV7!N#57iT^*@Gg+->m73N6 zU-wM@|Ni#>U(e+3@OH4=lq4?>G(phbr7-L12Rjiy3chgDf`arT&5`BNxl#6H!LU?! zQ(eiRvtjPFi;t{jrqbhJxT()%mpLw{GvP@4D00qpgE9XzVW#Qia?{6=&Qy2D6Lx7u zr{RXMNtn#sHEUdH*USv?K6Z}V9EjUt&YPJgUvzE4wqT(7k^Z$brcBr&tZP!by9tf? z(^28akrHlgn3rjgC8bJqxcMnzV~~L@ZGQ$kTuk&k`kX$F)-WHLelGBr!X?q6K?c`? z9=;iF0{tN_yzUyhDds@X*{x%<bYWOPb7bMGHi@{vALTOzDnQGI+G#N-n|G9o2Fr+<}pvA!-EEH z06ksDObnb!Q(U`)=uoO*8k#ZTvv9Q8rg!jZ6~Y~IGd${IxbxA-WcuQ+1iysq!xEgZ zf+o2s&pybz(K^AGGCD|%91A{nxpk-6kB_t)e{*(1*PsxybjJq8%?MLedj=oz`I0lO z4Q|hMkLC!*x<-=7zPiCdEw?2yKI{_L-u!0LGBGbL-F;hv$#5b+_$84g!H?1Zg-;`) z8}5p_N+yM49zifJc+LHoFu`35i<-Q_u*h399s3nI*sj7w)u2Oovq zBddcd(Lcg-VGaJ)>PY!eT$Xp6xfrwzDw;@GDWNjnDHj$n-A#*?U(;hRee7;ZKpz=n^jJ%9um+|NR?I zkDacKUAC}dSloR@x8#n<_@FW;>uU7#+0|ugLhDHZwFJ|%rH;zH)?BO>W3~2U@is(XQKUdlD`}s7-Uae&S$A< z8kv*f8TW{ezp-YbIlHHfA8j&5UItqds6gC&H$9w~P{z~_)!aA5Tx-+bT#jA}n!5CE zl6w?)G57@EV=37XZi=ikX_*qWDJTOkxDIZ{ge-{}_F3Z-(GSgt>;1e}dHbWd9}?*T=^&F-RAlHe;h@%~!!**Uwa>k8NJKhO^y@ zb9p(~5E-2?FkBd%<~;NY<^|1z`QfL;xlHsiPNoC#X(*9y+~-l|_waONY_OgV()Yvi zk-X+ugnrH7wJ0cK~Ignd!teB_tlN#sRje|RObBFGso33dcof|Jol;n;9z z+|=;jJuzl!sF8L0Ms&{Jb&;EqTmdt{ z9SEA!6@7#bzIc2BZ*Z3z1b@llxKCU@trz(=Xc}Y=`j{KGFEdZQsm^J;#!ronY~coN zc23_38sl8cVXo89KEmXe7A{ZX*K|YDh4Cyk8Z&xlSnwjyc5nLx6KJ_%K1ogGr?2~D$xh|qnSgLny@ETurGQe;RJCn z4>2~2X&$T!e~e_0e4EfQe8o)&eDrYmdSn|t`Ne{j#O?3ta6A^ajs6p64e!Rrg^$CI zL7gxSz1@rHpH1$5iXJELd_wnYmEZ$~@u^Y>-&32*Yx zkm&)$<`06{@Tcgu$Y)_sep2&rd1L^)D2In{Myp3FhMR*7;g=?D^jTyjS*=94I~WuE z5nU4I4BrdyM3%*UAKZ#8^Ec^xts2w_Q}Q>KhL?kTam*Tsj)eiojJ6b!dU z9>*08ndKh7a) zqhvTPl4hbGmG5EQj`-wK6^1J_SodFZP|}-Zpk$auP44MXhjXd!18FL?tz{?r5(C-; zE$>7h8wo#^n~LaLbSQexz~X7ZmAUCkT1n6JP%7CbG7Oj86Ht3zFH)IW_M(}p@4!Y` z{H4FhUOEb*(k`)3FaV#=A$avR{-QKMl^z1y^=0HW5amu&7qqz$z3U)dR)2;I-2op% z|H5(GAH^_Ld<;0eg(P{+C!+Q)h6xyrGiwt5`Q(1OD{MW!!OFNW4#9V2!cCA4t!W0G zkIzxbw=!?*O`FPBwM$VD2hdMfHnD(vOpj_BShH_Xr(TzXri5K=dilQa%SkAFti**@ zzlJ3^O~o>ipEep*aEYc3M^aZTupij`xReXYJ!%kq`AkwvQk>4qTG;mGzJyx3L$Av^ zaCvL^gElq;^}%fP^R7%ZOUbuf2UoM-6tE4$sgev8qmV7e>@en{`0u07b#ZhZ&#*SC z;RaNj5|WZyDH%2Puedu`QHy29L4QVG3#TS|PpA(5)Z4Ht`B3-b@G}$;He{gY{UmM8 zZK|~^{DvH+zqGaNUD1408(+hF7v=Xg(>~_9W5=F+pf&8l5QnqR=)b0$a-!aWl}_%@ zn>Es2nxN#~lw7D;?QC&fLUog$skI4kT%)BWKg9aK>l6+vAp>}G;C2EcbVh2cz6 z4BzJdSKzLf;LlgkXS^S-usaOT2D?QYp-XhcVxeTo~olD&iK7T9-WO3;Izmyd96kAbbN0}q+gc9P@ho)dyDup+w>d>@O%7wec4Bi~VJ*%M7Oy1pWN@K|KBPyWx3bq<%+a4q8haW%tGdJ@69 zO9*Q^1umtOO$~pa3YK%BUFTO5QG01!Za_-EmhW&||AM`IVWu)YK0hb9oR5`;G8<=- z=upnizx=az^ITv0p{M%~xbvf6VJeYb+Qa^L;mN0hp&L&f6T@lQXEMS`CiC-yS2?N0 zh%iZ=y-kUu+jW9@CaX17v@hIyDSc?pll8jcsjEah?BTaMauGbxdi~nx4(h^%=Cfb> zf3HQ9TNPG03unDY6-J}_tHWg1GZ{lQWp;7cVrv<@5T^8nTHhF#Zf@eqa!G)5&W}g&f!i6r zLT}U>9~uio{-?eGng6VDuDq?vZ^_1eC=(vk-F)upobtXfEh|hjUySH@MN{F5S)+%g z9{TeJSI~bze*0WH@Gf@pJbFk9b4-e$d%mUvUIdh1L(w4_hX9M{JF0gw8sW`i4J{~L_&li*AJiaeOKn<7Yj zjkmOvIU=ddNq50)B?t5&2aiNM7|$n&3f<`7jp4Wz*P>zeV2{vVlQbJ`oxF~F`ZxD1 zh`{X6=G)F<-at>gjoEIUeK8cVm&{Nco%9~?;ly)Z|8XPjuXOh>!t-Cq{Y6~tVhy_# z_SsRcG5Tbg#2hwle0EzLgfJ*fV-8Cb&QE?&)fQhFMIxO`44b3UeNT)*>sRBs1MAv&gWW-qyFnWwM@2 zDC6GsDRB|y&#MI*lc%mRnQZTFn@TdmiCow>&SDx3*yad zU&5p=#LHINRyU3HoS9*3(-WCquZN+lg?>{~XX^|t%##}pBAClJoatr-x7`#yVosSQ z(lwmw)|d^hDR*aue_`u{&9tfg(Djz)xVrz9hMezV{tafLrn1cKFsVRUV~C^^Q1Xv! z44&GpF#a1{28r6XBek3oi#9f!vZ{7wxcSL4NOS$XP@x(TnP#5V*DHEQOZ>0d< zpBeD;g>bDrF|9yjzvAu~!*81CN4s=BpI>B#YfZlqo;nAPx+eZPnd2EaKbIZma**q% zf~|UT8?L)Q%oNRxy4cFjG~;Y@GW0~v9#qsSbc~kt&8RqM>svucwwNYKd-l$oh;;KO z>2JE~Zt`0<;igT=!rr-P3{(9McRG^QWRX$sH~bI>xpx1=Brhnn_+TP+2N z`89ku--*4K51HXyk&cm2ODD4Ljnif5Rs4&XdkJ;tGqmtKDA&D&K70Ko$Y77iR;>U6 zWMYcmLy=6wz3ajo=*d&;ZkwPE90HNl5#}lT&&l|gv{3v8*(f`~$yv~JZiesRE4>#z zfnxkW^91dr3g3ol6KL(NCA|)o%x*tFDYYhDPXRgeTveeXd!+2Vys8Bi* zJ*G-M-vY+>tSqCd&u70Ssy!#xl|vEuMjr4RTM-TJiL*&v$l2{}GapR(8s48P(%*gW zp2Smv)l$$`BwBQ^#tX&vMKy3*H&_&yqz@9xhoTRmdmssHR)nh}y(rlzO9#lWozjXawZ#o*%x?>>V zpE;G}WyxoYXnDGOzthV0MdWgjj;f_O`&&NsWfSL19=#*k@JLv?Wt!;;Q2u@M4(IY7 z80TGk!^Fx-qVY8IMdBvBcr|?u-x}}E?>bPI`d9pLyp!Yfy7ZIxn4bBat4bf#0_iV5 zXdj=B+&$LKkv#T!_;xT=pW{u*;qSOa9mXx&K&)6NCs6OY#E0@!`@0|9Nmmv|V2fjm zs%(yK(24q|+sOQ*dsGkK;X^7RC(T%}_&4D!p7Bb&vqQQ0hxvT;qw*V>IjS$whL=iC zUq`+&CH-PEU)G>y?KOSL0hbKD0^tLy{Ry~z^Wb2&(UWMTJ7l_U2%MWM>HXM9Lsx~Y zoI-cX3hv(@!d?-21~TA+ON}2jvy3rYwFMaJE0+~S)Phg3O!fw+^?|mKboQF=vA2Ah zupSnkSVhTZm*Icx!dVLF%dJdheFfjk9hs)z z;9kjww_`n35l;-~>;(Us8_B0x#;M%vN||ncGiq&SdfHyM#S=qw7fe{i|Ec4tBG&jy z?5mv}e5l3zM~UTZi}(&qix_X|@%3}@+h?}9>~K?@yZIqrm4TYowfE!Lg;j)lzNM`| z7VoTCq#xTgX4{kejgbGAwF|1}WUj_8}@ePvP(XgWqdgRAKe(^19dAcOv^ z4_!uX{cI3?WnbS1TUy7XMTiFn`2qTzi&bB5{>p?y3ZPx_dT`g0K_^^<@ zkpJS~&g9Dm*(?)m=s5jYGMl5|V_g)N9*!{r#BoF$H}seGT>l8fCMNxtXF!k%k%Pof^# zYQ2BREa*uxh^KN$&*8c3i5I0jPjESTrTdP~mgO!*_c!}f((zZj&@0AJ`3aLw>wy6cM4j`tW;S6x>7m~awN zYnt6j-pY+nsvdrpL&iRZuTNJ)dk?-M&2w(NnahVq^?ZN4tp@qN72WpQf^mFo6AN$o0v**|0s z$S6O7=$1+9+1XOSyk^ha?ywD6dB+9e3uf55dYyRpyICz>vY21=`!KC-op_uGb=kbY zxmeh(*M@91&I&v8HnmhQU8QxYK6V6$cDdDR~k9Mjmm=4 zAuVz9P3~tVerie_Sntxew?v#i1AFb|4Yt$|`OTeiNoS%<|EVrf10=J^zvPG99HIVI-Jz1arH=0fI0l-`~bV#wb#mtd%(A;d}_XPUEACBk#BLp{4I}NM~BbW zW+y(kwsH17s^v{oN9|=0-HUjo$$R{4d0CvlZDB~L0UTTF2>V$u#bZ+GiE`0px% zDLVLyyv0Q4zzBWtZ#;1SnC$YOp4XeEfL#PHke)h!zJ1Ky{#zfhdU=X9|&VF3emSH$Tkm{>P_EDNjsq z&2PVumU>wx_-Q%`PL@77+d<;P@=~6j|F-hIq)tq2hu{So8Ei5Y^hdC4HNQ*px<92w zINZ&mlO?a+=UxF>7p0zF09GlKxRFY|9?|JPZu|-Sh4DB_XWJfKp$8N!ayY|x2F=anoB&W@(pdISuSWwAC9cj+NSbd?Bw4c68 z)c!@E@=Pmo7USF#{>^m#O_R8&ci^S6=s4Z(qV6k~Opd6tlRbz@a)J~;GY#z&@Z3XU zOHMNiEg%KVc+xcWB0RI{W`-Z@&_zcIvoaL1XuIo^7UOe44~gu6g_l zkXI=%@ijk%y&RLdRin&J{ZeL!hfNB4qu#)Wb&EI{=TF!ovek`}-}tug=pi(MapqH) zyQD7CifA*R%DzZ)t!CHit3FYFbUVn1H$WprG&QW>Q~qZ!@v)#*@(E1J%mse=5f@or z_M@cqA#dkveagh4D@3AOJ{BHunEnH58||KH(vw{W^1nkwN|ebwvkoqw-w9rM+joIy ze&%x7!~B+4>B;`mZI}1)JZ>inbn?^v&rC5H#cA5X9j+_ez{ivD1h(_fnDF|uETX1d zqbtK%?ld03XLP1y;f=1x?>muNe+ji;YjVptrY$alVcL!-YM$J2-^wu^jKlM5W%rpI zp!3~$KO9%}SGIg`ieA%GFey*uX!wp~vbzj(6#WWr!Vh4lQlO-qzG|?O4#$O34L4D4 z{(loU#cpz`d@rhscVYD_+1&UD*@Y5jMonR7C|LXo%tJP*30E_OxX{<-^#$O8l6zx| z$LG*DnZ@=y5x#)-VHQO;5MOpvnuv4O9oIj}DC?ClB=8sbk=L@sjJ>f^x2A}ztk^RJns@#K|dQNKCR=Ch$ z@0lsqgYN@Z=~UmM78>J!m2!R``r19M>cq#(==kS8rP=MKa#Q*end8+=|TyZ1p69VO1M#0&PEivArU!!b8XUq{;&$mNSlJ%@Z^oX4A5!q+hA zagOeBn~Agi{2?llg<2YX^{Lw=xzQEUGVQDf87vFR*I@aO&$^w;m#xUYG)See^!Ckt z9`l!`qu*?}oncnM+V8>bdO>3SIur%A6QCaKktojCc{X)o0XxO*_dR8dyn-9_rR-&o zR$ZGeu@^XNlMG~P>j8Hdq`46Gsew#|0Xi+4)N(0XUv3*{=RZP#wQ> z6{%%&*uz0B$w|jk3)>dlor=Amt#K(%l@0vU2-Cn;N^A?h%|^90QnQ&ya@Fl}`%$c} zI3*@!cYlGMYEuneb|0FtWakK+|ECg*g3!(kaTTep<6L3l;aa&slzTw^QknPqIeOJP z$tz3sb8{Bpu^E<0O`z5S17E+ z-p>nRHKKY8RIOU%_*}3;+gyGWy91KNF2#2*MC(aOafmy3QhPOZ8e;XLN48BXlGx(2h+1ob&1?8vbv@JWzy2?~k!%lQt%#?WsuQ)OL zb@J6b^5)lkvdsRz)D33`4dS1ee>A~lB8q=UwSF}G6746a|6SwUdeaJi?oUqgK2CTE z2~2`!rl0Y+{sxNKKxVz=@a}7A@@l{w&}1+soqY=14%d5SPSbwTE0sx1}u^xryG+oCd-M|*g{WVPmG zsie4pwKq{7n9Yk<(d7d$6>vi$2YWvnDJY|6yYiD z)?YQPEeq=X);2(0Y))3QOlw)Ce6d5_DfsM@AV;i$q=5@RbeMARpLkT*sOz%DUTCjSlG^XqVvd`vnH#Y)2hKD zJU9c%7b*O|{(BwkehD_jru7ds4HeueFnMMo$-!Ws&e9d=3Tq{E@Qv<~HIYZW&3$U= zo;@oii6$4|oTkbVDQWZa$wF#@arV<-ysiyb+eW6XO~+5_OcuHCUNKF{RQHLn{q?N- z$=!$fnI{`uG2-_mn}hztDg67Rngzw{hAaf_l(Lynk5fvMV5fe`l#F%6v2ylP5cv`A z%X;$0u;}Zi6Wt`A@t@ywd#UYpO zA!l8M@tNos@VWEYmiD5&;oj8hOn;f^s@SU@?=d_M6DO$3tnH(#b*>0J#|M1gjNqYo z?sV@+YC24E=yaLS@64p1;b_Uk9X!rIHInYA5^vg^Oqi-1oWb9opLa0dk3)gDrm@r_ zFT%_)jy1r?huB3oP^;O$H5PX02l@{B*rKk0yBWz&bv~ad0=MLA=J=-c+2h$Xi0-$} z-!fy}7(D8$495RW%O0R4!(_DjOwT8H1(M&I(?@%A%In)uwA%<&g}4QX{Doen3>LAbY1>5|WF z^TZdTZ+ZeJ{{)dJdwew_QG$bs0SD$XS^Vp|(VoQxU)bi>KeVcj4hPFEc-ExZbeZ|C z0geSlFUw?)sOaXUk5Rz<)lwz`}2KM z4W4W^D5fBDAYzGNU&2sc5WFHjE0H)4n(z*jN~*bTJ{3HU*ado8U+6e|2bt|M{g1QR zNM@P*OmUjd^nn(^GS5y;-``d61K|}@F`c}i?l;NoJW~dyyNEBt2_DbguSkc_b=f7= z{T|8acG&_<5F*Y52wb$JWKB8x9ly5}TdfnIZ`>0LU5*Nt7L3(-q7815sF9qqDE8y&(SkjiC- zA^zLV@YAT}%7gb-z&FjtF_bLvic9jxM9`;`@qe2ozOd_cj?G4l%@2F90erq%i&A+n z&}Om{2SYi0W25C7T;M#P2JO6{@1a-qCcMTm`k_v_h1C3>s=HA9@klY81%FEcI~@(8 zE8Ni*I(a)JAqdUjZ&^0n+7)#By?**3VfigLw_AY%WI=?XuE{bjJv;8LM& z90QRQ_96ZLlWaTrjh|D5y1F3x&NY_>y>_y^koI7a?$Qs>#Td@yMI!3^K@a{Zjh_&V z)LdbX#1*haU&wG4wY3lD_*54VC^)1JW;!<+z*raihh_jNgNx*(81CjTzy@q z@cgI2(@mAOu$Eh?xI6f_Tn(Q#c#}IiO~2+nPel1*ZnXVZ$4U|uXa-L&sFZvD(YYJu)WThA9 zJ@l`6u9x<+rFElwM{dCOjHAEvg^cIs7P0ZL2kHD+boFfRZND`#mJ0nmX#bKP+DjdthOZl1^#KA{;VGc+u{0}P*>&99{88Ob~j{> ztLT4?JE+y9H+S#{u`wynfpH8T9(vS$d-{d7bXXOb@(m&gr&}d6Iz$^y>-#6ZqqX9DqZcRDzF+xSemS4Q zOM0q^4fZ>eLeoc{X>s{?9uV@x?MdG!xc@6BI7UrwFUCd;aS@6PXc`K@^?J4twTssH! z?Ugrc%s?njb(0`XtMe$}Jq`<;xE+Aq?T(W}(3!->vS z=!CP<9NblcGaKk}Im=u8RUb$hJJTi$17FZSb{9B;AN19C}-^!dE!c^cub;nKYIvt0B5odr7(ri(HbL$xLTk#I_)YqZ1Lkis>w-Pc*hn z{m`Y_)91&>*G>k?4zdHCfUYXjjZ2#>%raQTjrhzTRJL9PcjQNT(}i%4*>GTtXR5|n zD)u9CPdb=y<%Af!%O3<6)du~aNn&K-DtFtjv+{-`hG-y>cPw!N+6xv$b+{4LFB&l0IGy3gHn$>TPf%MSOC&wYR9D+v{GYq z=BG04=j*ywXyvPjsPz(mb7|ao{Z^~FbZ`r4<0E{=vV5vCs5vRT<9^-|?{?`^^!y<> zD`NaT9b_~38z>cNKmwDQ@tB<&!ZI>4pJ}LtiQYJ!#Zpt>rOtbkJdqU^KMwwXDOsY5zf3-T8_lxd|3lte zhkI4D|Ni8ryE~*CY4&H$+=~*WL8YWb1O=r*Iyc?j-6}8m25rWl<2s_waHyMRWEkY}6E6L#i`5`fE<{DfA7) z>9ptbGz#g;`Wn3IQBavYmdV-vJlDi5ry^rUxSnilt5;MxFR5iS$sJW9AqJbI{APYK za%~z<`-uUo=baZuaP0qK2 z`TLpF1tI5aAi7?0S8RlC+@tF*<;L4s_a1RHVa9oLJzF>7jHD%pr}b7@3$hyH@78g2 zN_*%m5}RZoZ&yJ4>f7wDfF#wPTRgr)?*7QC1n#pWgShr#-6=-CfYpo~gw`G~_ zfyN>i6?7`NnLq7OZk-8PnH@xtwKh;$so_3kp49KS+B&$$4i~J-D{XC3*O3hJLhZG8 z+3{JKVLuvm_jr4cDwrw`HFtFvq8Ip;obot!1D(-GbxF11X4I$px!q*HMK5z6{nlTw z0lAnN^#K*1&ot>3)K6)tg*wYPH_W91hndBkh74r$ZR%&Ly*gC7r9fnM=yK97oT%5( zNzbvL;MKTprrMphxJZWqE$v-tyiC({d#up*`vdNE`9ob*7M8WiTQz6>G+!- zpY`k4qf3V_Uw-mgr!RXanb0aVf7owOuPz<>em1yE-`+`w^-flzRdW8YZ?~R(`t?rU zAW5sF{M%<=_Uj$fAX%$q39r%f%dWjsG)UIJKkr$hRf>ck?$@(Vr>D(=K zt$ICrcIsELYK#Bx&r|nK+$sYSd)Bh(_}U zDby(Jey@XOYO=W!JrFz&G6uQ4A>MD1QQkT=-FqFp6^RdKc|kDDo29x3pPR2S@%2$T zyaPc*oeTCd>LIO4t^bIhVWtMLvDdxA!9=x1HC9M>REMCQ*=BMFuOl_hKf&tQTEX^c z|Hu;z+~cD2f?4sSRp;PCE>qeN?2oPrW(Kta=k4MXR|=AN>nn@^usWyD^%PEsgEVK+WF66ve1M?P28Xaob>K!%4Job9247AZx&2#h0%Lh;vqX*SI1ZlM0JTf~~c|VI@rZANS_e^WG zH%N^M?koP8R88PjUz_8qpgCa1ap6@vZIWQVn(ejr=9z+uZ|+s_ z#&faS2vdUJE8uljeNBE}>l#16YpVJlysi(KaR_$jLG_eFe6vE`@mi{<-jCQ*CIp%In}*1{&v|uJ zUGFcGOTAP{f_F?i@0==a3V5@CfijzPfB<38!1Q-T%%-4~iHR+v;xP-AHx;70y*?P0 z3V9K8C7w}`(G{%WDDOseUZjaRz~5eq&aK%X=wylqJA(z$STiMh($rH+REEeBtPwxy z6J}^|D=4F@(KZcJw}cyVf= zYNgVcm#Tu=3%T*GH_jB`+5Tdx>ZB@dWR2Y(xe$D$dYj*{n9YdxGpF<)L2>B&xvH$q zt%j>&dYbx@i!uH({duKvCY{@EM#q;m1MDpR?Sr72X{D-|e*+AR2n7O#z(tM0{!z-r zurG4j(={o|)J9bvD5I{P5t$1q|JrNl_D65pg6z92h_nh)*gXs~+cK0+m(&R0yejrD z)sXfLTPE+2S3N|O9$i5FLUs=Iv9lBNp(oA3C^e)UX0!0 z&35I2_Uc|FMlDxqRPCU$dLHyvSitO7RUSj<7_XP9shX(|A=~q+)8=kuPS8Vr>y_l2 zZuO$(45xdP`3zfJ(`ee*6VZaIi2Vlv{q^`R>V}%jiR%jW(9u*f%cA+rC&4QAR(jPH zs(h?>IEeRFn~=RVfYo2@?d5#64Q>Wq%vU7adePi!Hb$uxYP;85{pkH*)&`5cjVf($ zQ+8wN%wlSpbHQh(m}=+M_I~klt0{`1e&+9BX~Z`ZgZ^rNbOUiFi>MYgNu5dE~4&GsuXbv_jC(9Pl!8Rr>iL zQ*>CcC#b@y*cNmPmdAe>FrdaW(KW&G=-J3PuV#GN*h5~&z%%2cv&>vClS!n8n#V!9 z0E3I!#!6LCjnu%%806S{Ox zzg6Wj6IG7Lr08Ok5jY@)siW=(Kbh*mFWzQGJU-=#u2Q2htW(SeNie?m$9OqEm>Q|3 zQhKHJ#K`05OjRJLW31U3B*JD{41wnfM&6_YVn1fS3oawst?Ye3;hSJ-zRq*J6#V72 z56;K0_saNDl`oP{9SfXk7@4WxGCNcTZ=qVO`>MiT8tp|2n?;!2CrKjHhB7^q8Lcyz zz9yC37`raQAQQdbtOzRGuf22(Qsd$rhLZdq&4T%~vU+N^MvIz3T>Q95jgkFoyV_#r zdoO}LUJG+eeaqUP{1fO>3h z-ZrJke($LZYGwQivoLaqfdTorc;H23g*U_I^yhlj%>(r!SdK~l8fSHSBtztUq$5{F zo*_n`^l}A0duyNC6THMk-!Z^!ZaSHsLCGMa$*9_@E0Hl?DU6+`)c3K~?IUlN8EJ|| zx#ZLIkMOxwJy+QkqEMe;*UDp^MvB^ndKq%1-}S_3Q#Tyix3B&J3DY#-yxufM+I~f` z_{#QYocnvKv+PwRWeAd)iqOgj?FlRc5!VQDR1ZbNvNYd~m;GhS1eVOl2gwHx1$U1xYgIq`Q{SF27 zW@wp0tVN8U!gZ9Dsw@;pd1(cF^1l5LGNO<^4g6g*Oc=NFg{1d;NmKWYy9AjXkn_(W zF!(?qJ^<4Kb5|qIaOJ{j2qB6?gpWmte?^k{@#6FrDed1wvYIA5mLO)3rFx()2<11? zHj-R^3bRo5$VmNycIO>i)~z?&=6e0O(o@1(VkC&VXu(Y0`Eh0!$fx$tV86ev3iwWBn0O=L$*d9!9UrNjH`6 z@gMEcU7+t9*q$co+yI0Bx&r=0Nsd_VwqE3K)k7H6bsGuDCie+Lvi`FDpgCrTi4g!! zW=)G@n|%hPImK>3)Vkd5^fxeiC_UNr6MmwxiwzC?;Wj4Kc*K%NpgjwPBW%2k)yedJ z*Gn3@3HFuQ1KGZmRsWD-Gg)a*+quPdv8%>U*Fscwgnj(jHU(U252SSjk<5RrsIad; zb_b-b`vVa3IFMPKY9TKHV+Vw3{bN9^$pEs%9x}=NpMt_}ll=}*WtQt|TL25!1^PW< z8hJ@vgzMs^|ME_`6Xnz zJ_sx}2uQ3td!{F?=mA?m(r{LXVFXjO$7i6y7SsCw63pX&zc(ovVVO)%1E^UcqZwb8 zGRz*%ml-k(0?U&|?6+*Xj6RR#;2)jEUuU1NdOKZXy9w$3I^?MD+NF>^8Hq37*!t?c z?EozQJF8R*i0r1m1KpViiN#2Wgf__j6i`_nS3`g&b!z|95JM2;{se82W}afN^tZ`r zfe!$l)eUk1M{G5(?KP^es+^*(Sm?&+wa!|E0PKh%fP4lcSVMr86UauIxHu8>t*Zop zI1-~$B8cnc0Bt)k3$LT?P0v*e&0HN>4$0cpC5+V(=2hrJV@MX2~c-yGei&3cB>}D1`kzfXwd5T~`9b-sCEhEkxn>-Bs7XoWr>I zrz;zFmisEB+aq)N^Fwk+9Aw^ViL*7_P<}R%RMM-lvGkVDd51N8_f?w9L;d!Mp%xQO z3PX;Z)U8}z=%wrS9RPokMV=r$G~UR3AwOKdZb?B+l#x+iOrepShE&IdaS< zz_Cjhw%5^rs2}STMC0gmM zH-vtf$=OWj(hvu)NI?v9<6Q{|nTGPO+ZEL_b6h4=%+k568@ z42>~D-U{-QA-CFI_Kv=0k3;7kV?aX+_UCd&P@e=eJ!L164L=1yUhI;{crF_H0r^A< z0HB4CaAWKYK#$OT=N8MK0Nno|RW2aA+$rQ`2l(b&E!Vs7%(4*;w>d6{!gljdbY}EB zelFo+&D==dtJpZ=N@cs9XIzFoItr5ctgMxhPE1QX57}%I3=ltY?zmva>jVM*fp&N8h&g*T&AFEw{b-=B3 zV_2(*`&n=C9z#b@F_&yRh^DasowIp*|C!Cu4HW@+QiXMOE+EYwM7t(BR*z+8PnHbw zHb%exwyBGk60GoDdP1k~Bj~$B>`rS3k!33L(0?^e-7Eamdg_dZYSkiA_n~sv%gwq;{CpPaYm-%tRaV;vF4lD(JB? z*ObF7`B2|*v*oC}!5W>lml((Vv&$To4O<}&`&Dm%=!{#rhC?d^1#7nCPou9qa7 z`bK(@*B^3zV%UZ;ny1JaBe5?8=Dyq`f`2E^Ifsie&ZY~6{F5Kb_(#rv9hXd3^pkK+ zNF}b8Z9;S|ZDZ9n9VHWNa?4#F_ed82MBBh6Eiv{VvO$9VJ-5EcI`kxN$4SlLuni=U z{u|-gHDcCX^_zXH=eRenie3eny~hoAGmz@MA{Xbh<6JUhM7)aBM?P_?CIram)DEfr zrqIR5gU?-F*5)rcrZ8WqO0tks`K_!*#2jaux_pTFi%Dj?z1v%2~nlCiqj zus3zmpSm^_U?;iY=0lt{(^K40sH)=O`#PPQrH|Ta30lD8fxi#^N_&thWjhsF^#n+Uaq6T#VAsTU=ap7VQeVQ^vXGwT3et?~?g^i7m42qOF#MwdMw32L zlBkuiJ3g0LUJN6+yUTPb>Y6)#+rEy~nA8%vZf-g?MOizUSpG<#4bp~_^?g;&oW}+- z-hBs^)4|m>$l?$sC5#K*qJOcoOeq8=x7B{#M-KXJ-AHVexm}{L6rIQ!+gdi$flifE zx&*yM8Jonvs}!{<_AUs}5AAmxRrQ}e?=_KIi2b`FzR9idQmGLr?7vGV~7=_2# zkNt*RbCum8eWt%)7&oW=U)^3lb2%AH(t`KMWLHTUUEGJYW_^-Dk{>1~R-)I7P}5I# z->6MeLyQ|>k~+-S(9EmZF9=s`8J7vsxPwmL75R+{=?hNkMC$04biX+f?9CujWoL}> za5BOjT}DnqS{CO_YByTm53;hy9wDizODtHyxq465x=NCg8Y^ngsl~_!#4e8P1TlNY zo{oonD@#|}Lzj{~c7{tymz9#=nBsDW7q|emmeh9vQs`BTbN)^zb!p@-`MnzZ`2;o3 z0(~4yX;CWRQ5a#8NDQB419Fm=sy$+ycieC!CMAhEA3~_7iln9k&I-2uE>ib6>iNx7 zLSL!Bkupq`D+qj6o3b+2)dfAQ4u$j|mqL7uU1tEDLozzGiLN_2^FE(sJ$t(Xqllg& zl-R_n*@R%PyzYoduq78QRRNj!$UHVB><@0K$)SIeUT#0N(n5CmF6YT0IZR#BSh%u^ z!ANHW!IJy%>wHx!a7H@gdq3?$Z(-~;Id z9hjfWvJx`7{g~<6A`~oZlgitYSV}>KH6vDxa(|mi`ZR39>EKJVTQ-^j{LN@0)^%zb zIyHpcd)0hBQ$}&Q!+IjqO68HIS354j@v+%RW_MFxpw9TzZh`Qw%kcO(*98Q;7-V!} zT_#+`H~C(_PaV55;rcGR+xo*h&Y5XjB;M}$`e-A2u*Wc!55p@U!CA4X@j##-#T zUBkcaM3n;b=6>@9Mho8`M1`@!=QYUGv%%MmjtlI(q__HcX2uQLUC(?h70#*5etL}br+c0&k)rp-?N0NogU@37nF(yta2CEoe@2RE8YU+bfeJ5$SEGZMn&s=H!km~AfVnYtuL~nJ)v~r=G#tJ@<419{wE!(l-Tya;a zGBc~neE(6bz*5%udtTpB?bTYDtgE}{k&ZG>4OXx9FeLsvsCkofVzU!Z z-%*FCVa}_yNAhfzAUnO%-58o61d9oyeUsoTTp{$0m!~m7o^^r=%w9 z5oc=Kv33C8yZ9>+_B_^w+&nr7s2#KMsGsr|K?B){_ z<77HJ`;r@_W04sx;W@5H0`ih7WCH^K)~b_2l1Qw6>Y_3oLix1n#WfYP6FMYB`pVRN`l<95`Q0}1eiufBPu9!H ze!hO2XE{WDjrcYb2*@yr1Dn_`Pi3cS?M8xY^pph4Ze=%C&vJiz_4u7OcDbZRMsuF{ z{SkHXQaS)nZ#0?d>mRd!t4S+qp}!BNf-w|u*St5no}Oj9$V&IV-K@JuE`m5Eai6oo z&&_4MPG);0*h#aI<9vdQc#}KB`!OCtez#L3r)kCc#&!Yizn{L>L&BMneA!J(>xI}M z3P>&cKChgS8vUqQ?y4f8DP+>W)bqLvfy6n$*6h# z)g}oYViw-N7N~DGy+xPRF?4427)U;zPO1T`+K9g!px;vE%_vM2)4?yUVXa%LS|Hi_ zlS(QdF}l1y6g|o%Hu0d1!!TDQ=bLUYTQIYKB|quuDhY^ZPQNAlJP!iVH1xZBbv-VO z)6$&m|AG6L(~vw=R9E#C*L*OfqzZZcN83dYl@~~A3)s%EvrUOs^Raa021zVu3u1}+ zfs=8J?qa&Dt{Q>qPnQ;8Hn-F!2W~;8Ex@&;S>05fL4Pds_*OmSS69~mPb#V^#IpG| zzyF%}o=Mt)H@uR!=yc+=1}#}-GP+a9W!?%Wy0oG|)n^51{Ldx9Ubh^?Zn!#s@B(Kd zj~wSB`<#eyCre`gyj-T2e4^61U*tS}No5&=3^vBU&HJ85{F=xJLa}E43b}T3Iir8bi9PWHIB$V`{xoW27@{R~vImQjSyFaX_@W?=!4 z|7!L}I=0+cG`o^(s`!g^jNEps-8pwk^0{~Y&e)acI>8twxnr#4GMCQ0;)Iv?os04B zBOM+A;&8_$4u^zw{3snKYy!jXdVnJRNZmCpOs5N(q+wf-S}$xVZ9+#6l7v34np6t^ zvpL*t@_#v7K>C~d;WBpX2JaWfBy4uSkxi4C9_iKtG#xdf6L!41#zgF zeCQ8W?QOv@!AvV`e7vq@}jGLEQKY@o^#l zBUuQNwobkU)hq@|*BJcuI7rk`B0>voty6L85LNpY8&A~8>1S|r%msRrJm4tjbX)4` z;!;GaxLqpB(^*0+D5Mu5areQbAGm6Ef~x_h8bQ|GpFLj-K5876gO%!6PFOt8Cl;Yt zKIhpTU?>l%XMWIQsE2C%*K`r0fN}{oqAf(c)^;8BY+bjU-hGu$0=LpUd^=oYw%9{5 z5zWA5cGVI6!W)3-?G(0%gu#Ks>8ML0`ntkrX+-Ui#C0jXRPxMW7*o?MuZj%?o>1#|@-$Qmd zjY01ynCXAI6Pe(F{HDu?+w_0-Go8!spffxlEC&%gMo&GIX!)a?rdJ`oekd)&)}|I` zC=;l3GwR_gm=T6kNymhhc~+C?8TL|jP6Jgb08?;CW>OJ-AT#K+N4ekOgg%lq^B>bka$80NbzIpT+ z^N3wTsr>S|4bg;=CQr;-H-sm$)6G&v>5gi;Y{4UBjz5{3URFN~hN>#E%Jroen@q)> zm0CQ|NLbyigX~DVOiKD=$%tvm|1YVB%h|1bm&WdxyAnL4PN~8rU>oS%3;T|-iqci*iIThj&3xq%N9;2 zKKE5W$RbnN?Sen8PyId4wZnY1679iI`$}FYMpODrrHNz>=ewu&2D|hQbxVCJ{ppPM zs;}ppB7V+rGh)|)pzc4LcpKxo!RgjBH{3evrf~?$tGI8$!=`cyl84_(mhhEb;EIN` zcs_qppr!M~Zx!eKT^U36%A=R) zD>{|m*6p$Fy{XjqrQKc7o`Sr?7%KKMZl;{!!ivpyvN%3fPhwU^_D5kVs(ku>uvR^# zFIZ}7%RM)VS6z!ODko3*svfUDP$wAH^GIzp=`c0qmv`J4y6Ne%-cK@oX z>SOs!bz_udd3mO;Vsad*tANTKv}0i4)%7bd0F*x^RIQsl^#{&%{yeJ6)WDvmF@jvr#uq-VR@J2F7su-VV!z?dV!l z_@9D5Po&P71`_|deqw(I`97#i`;+{vF1z1T2J=bMhxOS%pXj*A_j(_Q-FUyTOrQ=J z2tIfWX3f~kaJ8wtpOA`g3zLV(bQ(X4e-IqTxWRrkq~g8Ea7SEj|5LD0pV294Ig$Co zdj1)gJ^Yipx+X}*BXwHJ!b?5@SxBy1_%lF!DiF6n;e_XRGlGcRV(8H`vloPwE3Ft6 zbQAow2*~sZq}A`qLf1rcz}^>?x7`}*xHGbvCt`_KS^S4Kga5m0?|vjojP;99ok{>sX06S1p{vbE|~_n+xhBh0aHBJJ}r9U$T?x=)saH z+ya}?!WMG<+3z>7oaBNHt{)Z++ql=*iEB}1p8-cY!>fEj1}V7-~8OQ`Un5eBlY|IXx@pc$P2LHx=2It-vW~zjo1375V4rxhs@`3vcu62xL z;9alj!BofJ+phkuNFuB_5!a5>_lAtz%@n|vG=+-tL74POk<} zel!XXkD6z0P)q-7xhRwxX`2(j7pF6gWU!1z0~fD~ZFnu!q}<3OUsJh)5StZ&v-(olS%Y>wWOU*5Y~?% z>XmT0{Cl>fy6NVCL;c7443c1S7oA!VqZ#_DMa{FfdhyX`058a~fLn?tp9(O`tEV^l|e>7)l!zs$6^ zZNhlPZDt_WtEYVHo-Tuo$1IkXkd_O6At${-S#l2sC%H*?xz@GRMTrHku!a6@IIApFYBNmUa754= zbo+{%i+S;iJ;uns-(lLHz*vm6$0e^_2vc4UMb}$cX?IZ_k7Dm#Kr@@(9YH}<5Eb7B znJl@&N;1pjbe+ki^Q4LC;%>1<*& z6G1R~>*2E04iPT#a&^KP@~!SpTt(L^<>fyrw9Li>MOe$OSw>~m3zlY$_k}_&p$E_# zb)z%y=_X)=dw`L>jc%u>M}2zP)piStv_T9~ZUkqQLyrKv_(>Qd1=3Sijph!Vy>7$;KvQjM0)t+daG&TQu*0cTK}R02SE=|R=VoFW&n9C6X#Aq0!Hx?P|7W`G@LP9ma#;EA*~?Yj92evA z2NQ|78Qgej$M-7-YO}!ASEJE*%r?Ek&%LZ*dObL&*Bvp3_?}cRj%1S)k$q~rJxA@* z%FT9*$k&@(M_1MCwJF2d#0BtEn~#WGOK$@K+s@dA4`KM{qOpmQKZwEYWR6V3=9YzC zqyj9=A~@H4n2TCbi?UNp4-AzX$tgYcCu(E-Bv8*U*v)nLoh5W(18oW0EL;aRn@o!P zwj$pzZ6yK4|0sBk{uMSgN`8z{s9lMT?V@JVLw~a zo%gQ5fE98#z}d#5+nP&6;@VxwFH^!@s5TygA?L=@mCm2e@0AQ|g94QGv+}v~G8*MA zR~_zR6ez+|{h#jbPxZ%`=KfBda1Gq(@DDYe0V|t`5}Vvucir!;i_>F{BX6u@E$*9D zk}CX;&eRY0hpRaw1^q>O4gQEMu9|-f2KBUL1BrgX)e*67D!Q8P;NZ7idOtTfNCUXR znQjQIYf-w%LhQw*dOh`9DpWuxBto6&S;er&U7YPX`i;z@3;q_os)QWiEc{Nl^`0H6 zzhp1u^%(hZki+V`b$91OZr2I40CmEP>C*Z zSvTZ+Vl3l#BuALqJVLv<#;w9Sz1Ec`I{xDJN=Mt6xO!Zlb#3H56S#%)7V476dIQz- zA}L}Q+D5Ld8~}an#OJzf``DrSvgr{Pl(pef%xBxF03LXUbfNHDNifmvwBNf<;m%+w zT~h~?CHoBnbR{)${iRu~#-qzvgY8%R2_XIq+LZQYkt^n}lGSJ;N~+{xby&T?TZ}T} z1bIR8oa$3;%~fxx>o$XNe<}@J3h`wVE`ycouIz+U>*yz35|}0&O?MUJzwi?K%ebCk z8Opo)(e{`M7lCJ%S9{Qkj6;30jyf#D6aCoM@Ra|B>n?Rch-&*_y}G#UmhWAhE@Fm( z)^IH|yGw_;!s=l=y~R}xFSv|h2R~{(ThEq)X&I|~feEERt*{b|q8^NTZ}Wr9u;1%> zesj0T?<6~HMS8zNTwa-jvE!*30KOdcU~N~^HbMb~8b{9wC%GE#985+&Q;ptbJeA&2 z_BHIi9c3`py7J*OcH&+=gYQ2S9Av#apz26ps^(U1Ar<}xXTVUD_m{84y-TUrj-h@J6#o%usU3B0;c&K=KLLhFZrc> z_?6J>=v|CWNf=jjM_q9D$r(LudvLZ%m|iQ}FI-M)#MyQQy?Hm6)V7nYvf9sr;_tLB z?7n9Y;?Zy~u#;|e#mGN{QMaP=_Y1MJ7C57B=>fqEqD4dE*m!pf1hAq^ktiI)YuRGH zV?T~T>$Q-$`;i+(pEKJXk!1FQe#TQ8jGC`_I05tF0hsqv^d`eV)r&`8+F3Hy+hMc& z@B4-Q_U^H%MxWAy&cC=nSk6ZepelJKhwb}hkC&>Rd&eJ$;gex$)KWLVQJ%;=DdhLJ zyQwWSnuM#8B>atk^1PSlDQ z%x##NM)c(W>b`WB3ouIeC3oMp&x8JMt(*(q=&ZUrI;qLv{GDxi*GZ~^lU9^z;e8@) z&Tyog6BcrVSdX7T`b$z{{y-iGh-78L?`0DRBN|b6m@{947^=O$N9LLV-;&0EEW=C{os>>xym~`zR#8Rmr?5#Uf>Gd9bL?%^RaQ}1 z?*oB5L0?tK#YY&=DY57@$DpfWlocxYjac39xP$J1$u0|m5&C*Ci$NZYpuqNh)ETgz zo>G!=HK%n7IEE?I#MJDzF4$}l>0mmu%d1Fs(6^cJ6CY9UC#Dmc;(m66-EFwCmM-4r zATk&5v!bo5C)>DE{(X4p38)(t<3G~K`))ebO9gP64|S}J;Tyjs=a04P+>6LU-mkCw zl#bKvFc!lnx#l6<^R)QY*duX5PWMk-R*liG|9o+=48 zMU#3fgIacf@PTT|^?|j_ut)(lA5Ygm!E0|tw75weyvH!?*%|9lfC0jHS<-? z=m_-dPrb9z9=JBYGZ}(KT(K5PU9e%QcMV)+KRBmM{`*G}EIoDhE;T zusMs9(!)cQPeoL`YN(#6Qu=K4WzbPAF}2msV7RH}{cQGfeVXxBFpPDJQ^7T`fp*dC zc4Tl_-D8-0d;DIjT?yrM-e7`S=RL!fv_Z{|=Ej>iQJu73;SuVpPDGXkUzz7Y`Ji#I zf+y12Z1U#2E(aH=4c>B-Q~e#>Q?t#{XiV^ynrPz9M||3GDw+4Q*U?mF?N^!!7~>n_ zqD++#o47dcPK^VorCd_R$hEGv3J%^2wp`;t6|j-ctaycVq18f zy%@bL5(FhpHnq%49NY<3dnLIBF}WFmpDq{9ry|}%Zz>+$wp_xNGid2;_c}$-c<p*JCt$7EN_gMZ_9aRupHcyN0J zOT2kJ&Ewt@{A!)NG11oQOyC7?o5Yc8ylR>FRo<2$yD1x_PjKUTRco~Os^CIf7kkK* z(FJvFE;W2OGJ3^iixSSkTPCwA zqNZ}e+;WxG7O>x%;sypM*z8SG^=%BQ<*)5d`!slAcY1ZG%sQE|>SO+{h;3uaP@|1e zX+3<3Dvi!<&c;sBeZ9*D|B-p5^609tbnAjn_E}^|q_o{?cB`ma=+3F8rm6lOb;Rzd zQMNWo1{bpV8#2aM_Mn6*vB9pk%u6a-ikKj@qV_9r6F4?T0 zXR032V_sKPMpfekHFEjX1#eIFY2F%@BRT}%Sqim17>Q~=l~>55G?7S*%ZOVnnVO{@ z2VBKsvZ{D*r0(aX#}oT|&=zG@T=1*fDUZw`)iW}|9Ec28jd7u^2x7dqRAp0Aec+A4 zH#nM0T|1dB-hS^LHIkv6t#RgG`-N#$z-SBdlrja+^(qK&_JJ&6`YO*ygRXp)Q7>i$cWfiTunJIsP0`2BsdvZZ?uUT-z*Hu;jB9qG*Y{XMdyQB zW@F@QJiyt^8gEG?b#$P4-zytEqmq~mk)qM;xIqsDS=1=^NiZN-7JLz`@aozP@wp6_ z4SE;x4F920nfFXb9IKNfm*Z~*jlGMpRd5x@dL7lY*k0c4*skikpqffymYP11--8K} zJ;7d>xW7#%Ro`o54w@Za&0wxN7;S8lnOLre8N&#=q|`!%O|M|Mx~Del#@<@5yt-wo zntUjcyBl9G42GgFoR7PE2pJ?@B(+M3e*GeT_Nm~lDfQ>7nK_1|yD&Pp8KyJ}p%Kyg z!3^&_SAAr$CDbQs16OjDR!vML80XcvFsCX!;0gM1T;_4!3e{ibQmZ3bf~lYa-x9D;+r z8EjB_>~&R1{p)>h#+hl+1wn1wPb~{RRv)QUmQLJjXl6w&na&X|NQrC;_IY`ws45X( zPJQJa#q+d9cL)|mVpRcCF8C4VW?wLg6-lJFm{q|f(*e(N5uA@z%)7k9N}g_V)mTjm zE;0+Cj(1jdbu+wgg3>CxN^i=V>NwBy+p?;k7smEy2doRmgJ^vb$)P3_TXU-kxQE|W zHSpdp3NC`)JqfM`#^jEc;k?eqXWk&V8&qZYtPWbsy~uv=ZM8pWVdC)3>u4CCKN8FE z+h28m^MTpMCtVrDxtwI&C2D@nN~%^+QH|qjqB!uoL~=`|ki_U4#+gHCojWtcrkxzt z!`*8BE`@xd$J60NrLZiQ7?;JbN53&0RA4RRGuqSny|i=b?JL0u6qYq~Kv8?gG-8Cz zZ5b=I@KqmBIQUmGHv3qxJ0=w@F^9H^E%cJn>S@fEtxn83xpMDN(Iw~FfC7+{ENI{1-gU|e%P2fv6xHRDa z7ZWZ5!6{AcUyi4f&f5q>U(O|r2JH-{m;oleg1&FNsVi`~Tj01C^4+F0=%^Pg#1Ei> z@#Wij`P9kdX?L%wh+ z{p2T-*PWpI9b?k?%jwBRXa@J`9rA~1X7;-+@M#xaKM>u`u)O(gC01t?=+jP=b8A35 zB4MAfp#B8cYB^jmsr?4Jod1jbZ3~2FZD&_Dj907V1TMfL{v2E-&vYTbf?LcA_R(A2 zpEiG(By8w**@7@!H)J^M^H|WphHk!#WA`4EF|6b!)I#G?i?;w*h{$95`I|bc?@J$) z4PS-}m+U2%B8c-}t94SF@jaP9pu6J}x`j?FgWkz* zZplg6gYxPEL%~+qW;)LPhO)a69PltZ%I=lgoW=$Cy^`B0_*%EBGVW)|?0+eD`S)X> zD-}#R6$4LE0_?o3n+u~cRyKIQ=^ipt28CVGM<$?|2JOiLr(HHW@v(TgO8PY=m%FA9 z=^W_XEW2R{YWZyb+F*~d61X~cf?X&tBrcq%8@rqGi>d9hN=0dga`AonhPW5N{!VdA zz>r_s;^r3DK6I1k=(Ls*$!5ZFC*eeE@X@?s1)qy)!%dvjS9Y~oU}w1p;Drlhovy~n z+-+L1?iavVSK3jWiQH}|C$PSBKv_Rd()a~jU34htSf_0InbZq+>P+EknaZnW<|&PW z3H{y8a{urg4uMW(0Y@z1RRf{k$rG67{|Xj($`)~D;YyysJWMyQxjOty+g-n83|Mn1 z=`}{(^&=|6>^#dGa7riPEz8@r=o7Mp7vxhfj=rL%G}aH%L1*Knu7EF3$|rrFVf^c& z?QDenF&b`X7!HYioWZT`U(_*Q*ruHObEa4r@I3dS#%Zj_g&&7=PzNF`?gtG94$?nKvii-? z2V`Tuf{n7*~Q{Bt1C$S-l2KrX(oS3|P<6 zDA4}VN8CpY1naEUxpyT|Sc0n!R|fNN3UH+zp6&*458Gr4apW1edL(G)d^qoOZg{Xy z#z{~2HsjV-f*s~#2vGV z9_@i+%FVs(7g|IeH>r^%`tZneYwjgJk{y254pkt!;(gZjV$W&J~u-D9+~MO_)z~ z-6~mpuC@#B!*g6mQ8Uh^^&gmH0`d~x(C3J=*-(1j0)=lY!$ER4xO;jt{*AZ&Ex|eW zmRiH)gyn{-SN;AH>Xcyysb+iFqxPxFGkin(9F=Z-MwaVE@2k#M^{CQIF7J%Oxz z4z6?xC-Ih^0IRy3eKv$VTGTHK(mKW+22HI2L(xUD(N%7zZi|!Sb{nYWQ~NI-g|x1r z90A!#Krr9Mi&09}hE{@c%yabD($uB2>0qt7Fb$V?H%{#+Fv%&fR2#hO zQV;nvzYbQaxnF5%EODxzzH)O=j11@|7F~Yb*=r{}DSeQ8)x2%y~DC z%hZ;#ici#D{gyx1?PQ+BJ)H$b<7w*?Q%bnIE|nXGJ9P!S^c?jko=v+GEmLxT2-znB z=la|=4_k%RVD{r2x;1K&?L_!~DAA_5be!Rfu=ykOZ+fgt?*F9wn!akZjC8MD3%$&1 z0mfT8eCoOdbE$c^OIbf9?wLfef@^Irxxk5k3<5eJnjd`irA2{8&GnaDb#v^yY91LN z4J%PATqXBqwM~IaIS&Z@25{zP#P585F7kJCchSD!)bFP*s3wc;-#Wd{=4X|R=u&d~ zhs@g`!*^U=InB&~shsAaYP_E>%*JcilSgQVwz1M{$wuY;`XKTb-B+#+b!g4-cgZ2| z!~3P={ky@!EvD;EL1wSu-?Xp2-ZIJ#vkG1!7y7FIY%O2(an}fSRO+xpSYKY-(s*3I zc8?t+Sy3Qm3Ey+6sSFm&Uh1kEoaH>>dN^*QFAxL1^(U~y5);V}lBu7VbA0k`E-_l3 zD~zU35-#KN4s?Ptj}ghci4$#cU_9W-q~QHO!v~ha_ssA18x)H5^;)W=8@jsR!_Kjl z!b$wjRjQhAU`LutX~|5asQ{+@Sg-ZE3Kxm_mrP$<$WO{?`^N2cHadVaKHMHbWv~Q) z!P~M~$MA%@QG1l(mB*o2z9-!oq5U5fRUz3KmW9R2r01d`S})6VsW89$S}%3!Wr2(M z#fZg^^nSI){mE0>D0#wu{?BCNCiEd+>7@R1li;B_Nq?0u+|5*>gRF0!aG5*eGN5HH z9UkKeO_zzmPIg&I)TK$_%1=>?KT+fPo%;3>d{7Ej_$MOO2U3UK&9wlcPy>A}+uUQ_ z%9M5cs7n{SIqro1!=(uK5+%k-JZgy#{RcLy-;nIyi#1tp&g*0DhUAizE>l=Y{$UqA zP&bJrDd|h5sc~qcE;+_nhhOLhZnvoe&+moPWGJ=Q<7gK!_kH>vj>BTn8hn~cGSfxC zHN}q59VH&mz-s*)8YX6@F!APFBGeL))!Dj)^TV$#Ds)$rlly7dH~i517d_}Z_G_N~ z9+#I@jkV&+tC8{oPW3M|mgU?!bpQ_TwtN&`x6`?VCUIEWH6x;yg8%4-j;;y2u$c4- z2kSHJ!`9RQ@4E594u;a!m-+rQHb_L$~1b*RQ^|X8yY8k zDeUI6x`VwzAN#eg!2E*DobD4;P{}2&iVcV9C9b^wn0~7;YQxmFupJ#OMDMYT=vg?d zEpr@y2cO*mk7H6PE}PWb{vJ8VvpG%t&nPJVaL&v_Yt_KqjB?46TjlPf|CwYPz%3_| z?)1g=T@^{?ZB^ZLjJGtFbs_#u#C`Fx*OvXg6@~N|Q&+WhXM-P6*3_{hZ4+Efvr%2P zkZ}wOuSHikn#}qcD?7u+i04|n5B{f5ZcXJsh>l}a&{6(2E!|y|Wm(ikD&KYJbRN5# z!C*4WGNivM#eTP7#yJ{Hv;aj2 zCcevS(2^uUP2p-2(4;-|^RuWF27@$pF<d1SItcYo{N*mTq?Ts5pq z5gEN;hHgPsRgs)E+RU``V7|8Un+J7@@V4FVPRkQ?#FfG$?y}lNv{|GIQ>~OV`RR`8 zg;(W)i9lE zQa*gRv62b>Ne}RY#W>G!h{y(+VgA~J*R7j$ynTaD65$d@bSydjUvKb+pFWVD>r6gP-Lf9o5%446zF z6wOOm^Y8UhGTI;N0?wORZeXMcj=Kx^ z2f6g*?b2?%D?@d0A}EFixDlhCugkA6{Q1$k?6+;~G}p;}N$;9d;~uAPWF`pvsx?t> ziCw}w<|6CY3DGd~Y~Ob$Oe%l5tOzGc7nc|Ozit#}Reu|H$LJ?gae z?nkxI&U9rM7QWt1H=b^+YLiuN*&}KvZm{cALPvEvmrJchNi%_XRMmM>Jw$gw9G%NE z-skfA8&Hq8)G;njm6G~gxUn6)GvedJ!*_O2-eNb+pr70<6{rzTk^@$gop6EukAMGL zn+MGAVUU-R=x121vmh*+Y%^Jo;$V+ktM*Ddx}p}cH<)IK2+1n1f_db? zEUf+o`!&d9I(F)F{l*?dg|ovJQr*C0cDljlsa|b+adq=*ZS)?KpE2WiQO}Kn_g_SY z?_loZ6yv&M>WihsukTz3y;jz_jG#QRWT#K%M>LhI!?`w@%+VPc#obxA=8B!_vRXz` zmA=;Jf>F{ya_c5Gp2;7hP#I4mX61ETsO4_j#O^a!+g*&z_NK~0wM|-zgcmrm>*@TG zp%-l=J5&p4PnY?KGj>qFrE}r|7$GYnIXU5}TzPXqk0832l{Cb{{OpzmX0>cWbJGg1 z!++HC59wv*>kYwaX|Lav#dc$>>N&L%!5`U@5Mclfk ze+U)@v3kGE;yYcnQEKl()B#`>?oSm9@@yn&xD<~>ed1HXB$F*t0G+Y6M>)}}bix&- z9b6-cMXkYSkUgwJt#BMY|7~K>=QhTT(D%$)>cBtfY`V#f|3%(ehG|)SZJ+Lrp}V_t z?rR4P0)hwr<>l1FEo=Jy}I97c@EjtL;U)1f96I=@OLf#6%4Ddw_=>${_rmFkm zBV5uSv3|RMw6gfcPT(DNP&G|TIfu!D`)oGX(wrneeZ+Gf@3Pu6uA*zjZJg|S!NgYL z+4hxv=vG9~AZA7ZIa8kH^QXdZ5NF!UII?abPRS-&-r`P; zhVy(^?xWs$$3@*8rXwUU8T;MerX39O46@rSlDB zCC6!)?^mPk+o%r7lUSe$vt4Rvmo}rZ6y%?ZO+(YuuNX!$|%t5 zM5e&OPRQB#QqohIkAd+W%I!YsHU$+t{%2T?*Rb6k@uHkW?R3MvF<0#{xPaDvfT~L$ zW0tv(3Ueh))&MkC`{XzHL`HLJ^MFcM(WhaxEjeHp8t*4mUTfv=p#ON5(S9hux0O|P zpG}T&f7^%fJhM^NHRC6A5?xgWk)6KJ3RTn>qoOKln^X6+_5Yb(z6}+6VXBabDo@VN zqMq7sz-!}NRE!6GX7{6rUVGes=HMWC;Ciy?aUzvUEme)1vcgSMIYeRD ztV(c^1F3Oy>IEpEFMzj7!XvDgY4MjVQWNB8H$e;nuhtLhyNPBh|D_)Be>#=qQO@-+ zKK%?-{yF7&&dp0aI=}JTZdJWN$WK*CRo_n~d!_VExsg9G`Lnwp;jZxi4%#SlV~(l2 zAh{^{c_?0>ada#8x{df(nFA&V=;JCGENNEe6U0!}{iX0e>#gLi^C0)vuuqB9U3zU} z;TuD$&kzP9CtStP+=%O7tV(()X#JRK?B)|Y7Jz_L=*;f4$|XCy%sPf#w~)M(&s`=C zC-IY+68V98?9$42Tt%^*xR6)Zg?IWJ%za<}<(lb}#NKu2zdVQWsY8XC z8@2yD79o7ibH65kWKKfw;DSo%9nFl~q3-<*FUJB`LXK5&JoS#cks3%xFgYkVwcF;( z>YO<4-nQeZE+Vpn5csR!wx?kAKBb#6je6}rb;(r)3;kmA(1rRDWnWuvd0{o(;8D>_ zY-hcb`&JLn)p3~VYhdmViLT$#Q<;NixF-4AxrCJ`Ke~qUs_U;F5Yy9vA{z5_=0@Y~ z8OwYMa_(`IY;9F4H9^f(`53`p4dvqJXv8MD=iJv(MAEn1H})QAy1yE##<=sK;Y;E> zm)U)QqV-#FM|pITWz;=7Ti2uO$O0!-8SZ@=vm74RyX>%|pL4H{!=GKJ3z{%ny)w!%Cel5is$v?6c}^`hfu6xS`7Nx$ z8CyaY4%1PkP3PY%a-EoMSjCj7BiRCNfz|az{aK$OfGCyX`D^m78!S$6S5C z(tS=;?xqeAi(vK0;f4z8Ep=VCq9aB;FwOAN-bI;N0M@Mv88)e7F}jMPe_P6Ag#D^4 zm@2fN63HsjZQIX6iB8n;e=}WRuKLQo&)L`m`_vhJt_C+?ovac~WQK~AvLnlZ&XZm1 zQWrdscex{T%{x?<((a)O&&)K$(rT}aaZ6+>s=T^xuXxQ`!G~@wT-aOgnS7s^9s@V~ z3YAb*n-LxFK~=}S6Ef>i6$OK@bu)sIHa$Q4JAIW~F$BNfEqo;`92B{UjOpAboX2z2 zus^viDlL7dvF05dE~V)or0~z}6ZuMBmcwKN`v+^Vri9#~07=?2~9 z^6I>qEmNp$b_EOS=Bh$!89LfLxX%{5F=XcKpoqJCpXMO3OZHuppV=rmRRgLQram$cJdaqqegFjXsUHPu7K2Mghmm_Z`D!h@dx zNq!8wvs?CXH)8X_(yfDid{50FHw)hCQ+r=*VP?%v^|xt_YMC`wt{yz=Yx83Bcx9s=6fUo90*YiP_!|l7efQ^N<8AE5Z8F4HfxwpD&qfUupa;_`j z4w)|S}=eYE`Y%r0^r2;i%Nqs=g(#=j1EQk0qSS+rWl2AZDq%4-Ukd8rcCbJ7iCt4U zyDvCP&Efa6%MiR4uigjgI+c!kJR`Fl2au7=QLh}~pNVkVk7J@`atSs;WpLCzG3%I! zjEfrQQH=URj;9M*lp8vdQ(IW=w4v$ddaGDb#+~NWb&@gYjO%b3Lr_3tRfL;a#eHf1 zc6nhwQ^S;JhFy6`Bu?XV`v|!qpML7n`VaXx&s|yZ9=zdYc%frMh`N8nduiRHUG3@6nJ{^mURC=*M;qg-qJ&WY< zE8SszSsqjnC;`ZuMfDtY3ICMv2h|&D2WDJSp{;Sl)nPXw%&rZ!%5gGR6Tet>;A{RQ zAD^@TiPS{Dt^xC$^-9&sYrK-z-80kDZk21P9jfByPRca?rYfgOxqI{@w@?#*94uDF)Pe97HPb3tnVWD^Wz-dM ztL}gSinwY%5m>T`EC_-s=Q`1s?k%%(W-pNG;+SGF7nHl7D1JtZ2P)+_d)g&* z6wlj=Y8vj(=Tr<6RdZFC%730qs;^Q#U!gJ`Lk$-1`ly_s!zXr*`H$PR!_5@2aA!l^ zYHF}w%>dkibJcw2LtdW2&vv0w+`n>6*v_r0iq&=vDD)?= z+n;78HQqVZ5dCr#K8{tcvaVZ!{z$3yYQBzhTfr4KOj}ih`4BPcF=(r)er2+A3ajI> zJnquyq{Pcu^|{OD4R1J|{euWs(-G3WB&d%UBnxXRg z(ee_my-!tc?%fCS1YeWejzq=Nh$)c{Emmuyyiu`gvMXRV!gwSlQuiP$=6A*ELKdKN z(NMmGECLf%Ngkn7Uxt{qEt1Twvg^fqIzSub zmf#mTfF-)q)uQNiIKq7Ra4*ONe||d{r=P%A_@EP_B`UAt)OzDVB`+Zv|a< zKH)3ec|Cl0)eXjB7`WyuD$zCcV^gUMA}^ijohqwrB=K|Fd$3KfL|M*hVXEz#oaiEa zx-IA+ncGj7Z>LMja?6+UGCi`nj&-4^Y#QO4EMuR;8;^yjOc(TmW$G<6;rPjG**w6E zh6^$~O1C~dtsUg!$NWY~>9X!q={XlnyjL$pdAB)SFE{bLc7oj(gAo5BkH@Q?;hty< zH$)zX-56|H^i2$`DTl&IO+piJ5H6}EOl*aqf!}DC*@kWf_;#yJ4d=+THBLw~8E{nxDeJ-1E_ zR&CTqvsQfxo^A&!9O3_wLwq9Gv}0lf%=BV9EW_NpwxixICMjykkcraX@+>;QxiQI4 zOcrNcI*?o~_qMaH2;J9aVh-7SGZVj3xr#)h9debur;=x#bN5=#b3f}zig|i;UY^Pl>OXf%wy~SkS9JE6H|C_uMC5H}JGp&kmO92QIt8}RePUs2}EKLu)l3i#&pt2m{jxduv7ga)Is>mkp z7JOhvHNK+iYKdv! zu>GK(3}n0mE|cDD7OCaBk8WlSY|v{Jv8a%!zVTzrHEz6|Z+EICDxF$}OZ*dX;78^U z%i2w%`aE04Pea|Zg8F<@!rk0k$IJlDv{dzFbu#R7nbi+be@mtq(GeN0C)xtK1Glah z%9uaCF|1K-h(~d(UwGEDIE`K^BKT@CT9mMC(?iz2jC;V#?IDy~PWd1qM z4s}gbJpGG8>ZoW0&MB*M`L^8BJesB1AnMccy}4(p!TB|*XB+6hcn;`yd|{Z+AKe|% z)cuAU>aoh~Z-ogd4HJ`@Zuz%CE#atW z((BRWy6Ix6DdbYhelU{F%>(%;SO^BG52yc==?ymg${wdi+pqe-cy+V0)J3q>$7n9P z*uUbd(>F?tsx}iGN>AH_XWvRlbJz9_)}j2F0 zCpddQDx_g_gZGPFs=wL*Pd740 z!raO_1y;CbeBB|k>k+2K z3|2SD-v{Lr)8EYx=24ASCi?s#n#1VzrH;y|V|CrIzt4^~>oaCo<=|v&1sVQE_Gs_U z&}IEn{l$|Q3v$l|qtk_IaEDx?&(O_nLyh&j+Xlb!0hQl$_pT`CTb6<4>?YL*X?#x^c`fOKVe@&(BFusE12HyW^LtFytf(E zI$~~7y0^8|QaHYXY9st@Yqu~m4bHMR9MR8oZ1cd%=K#$l>}aU!7x~$4jQJ5=+7Eo! zC!!td$DW|1?tHG&><`Ot@_9#}|E{d6>)IAB4LPNxO-Z+^lItfECISzqQ&F4Bp@Zq@ zi>XmT4YpYAfI&Jfw~!^q6Pa;}x|Qf9x`Nmo73)E;+#dN(IFPEfi<79UD>Bcxj``G$ z<~;vN#XXgp@nd%~L<`M?e^_{I|4p0SQ!GE-C!Zdu6sQM9Pu}L-aQ|u%- z=8ZOw{6*FwTD%v0j_-5?5g|^+(0eP+$@v4V;SyI`W`hmP;r_3ACaYJgQmst=5F{X%o(1DU4lC;8xEMQOk`j~ThJ%G7WR$J$BvzT zVTLeMkj?xURtQ$u%RvnzgAtMSLF?c}P)}Zq6cNK>Q{yiyWv;Nl@83ub^C*6k$%wy6 z1m#8VAR}(cS&^w|HcH4m;fuZHMHcgYq%980JGhNpa5h+AQkxt>7m?JA!)@|!SlhG= zwnc7*XM$mosnUtw;>VzjxE^F;FWyG6OjH(aL}!uMd@pAh5!@85%~U>nMD)dvcQAG# zd;eMl?ZXP}4m%h5Aczx<@qwwZvUwC_3r7S4!*`-Z-OXUDX%v}^qotWB;jTr}$|-F0 zsvJFI{t8EklnyC>EZJ?h8^z z--L8a!?a=7_;lfk$U;1)(}JBr(%^GkXxqcX!Dqagq-J&y7jzBQ1xwAMpkk0da@iyg zJI2opT9~=v>R?+?FZS@>?XgLNMUiSEcgX5ke(Uz(#$ZG22pmJ%O}a=Dkv+&Be#EZG zXZYuYITkhwi$-%s&j-VUymm>DH@+;Bgnq%v*$5}(s~{3=;&e0XY4`JEh zK%|tIAFc~Wgd1YZhNr^3@yEmVvCY}U_LFO7Q;D{sHD_gNxC2+zfiN*BznXX~L(xIb z3v-BfaNrCJ(~8m}nJF0AFS?1(#8WnS#uYR5pV=7|bziOe<4E#Brwz+x=k%?&2|={ci#j_7P=d zDfucoFL=w&5+ax+ZUMbp)E_J7K;;p1pxrf%)Sqkb(Ij`ORIsbq@aYprbd2IYd? zu>~R%@#mh8W(xO(1w>Z7XnTTp&G6vs=#F4g=%N$Znpjx8i$8BDCn=?9X!_vm)n*wR z@74u%O_`vsyB@7!ZbZw=WcbR8+EGyz#^5I|7R(RJ#Fh@{g#*O;;AF5g(!?ANrUui) zCE=d1r)U}e5N-*Rik$40ZDAsNE{PRkw@A|Pv#_v<57!fYj)i%}N#occyCB>hwqU#L zx}b?D5_}TPAhyO{3Z6zY##amLh%gu+@EeL^E;Vodhp>ux7N+9)%?vY%zoQXTGq!WM zAXpg`HtB+bc(d;WBZ4_N4_BFg!^M&EV8}wjJ+NX&6Y%~&!)bkGZ}t#RmRKW-hD|wN zj?JO7L{>8Po8UbWgG)0pUFzS1O5Ef{(NL_8jtV-(_XskIy}{<7NO(DT%gl+L8a)&J z1Q%#7Qv$E?$LhF=M(;$1g}21a*ckba7>}E-lKDDpB{G{X+^=!L8frVDQ3s=|lgM2DJ^BDE;aKW{~sMY8i-P6&ntR{S2GVPEIi;JfGr@n_^iF)qw& zmIQAi=Ql|v={-joG-?+d4|c?siT?!O%`Ow?l9=7$w&;{#A{&k4z@A@4o5&wPt;MAc z*9QgQmHr5diOy!M`o&B%?aivldePs!=4K=}YlxFo$RUZvoA?hzHs-y=gct0`VI!l& zKzS+tKXWfKo;{P@*t6Bs)D8Y6C+@{n`4w~NUWOZj^*phfDi3*PW8hT>I=`D-Atvb8 zrgxTHKM6;|*Tkp}E=tGuH}{yjDJ{q@iBFh%tm!l@f)lPnP1%{6e==286kWq!l<&;w zK}#0nj=9-%o0{UD9jg*_SErb!J&8``zpgZu?hSQ7-9bJcdyg_7{&kKJ#mYxf{`_x;$sX}$`GWkNfzQ3X- zGu^oz2r<7};yzSueK$1)UYqGpZlKSh3d7PDK|%Z%+MnlmRTff<+;#<+qEf?8Wj$!;p)e=Slu{4>~xLvkQ2 z_wSt8Rj!vmfE#IoZj8&Kr0(HIphXw{sk#PxG27oz=XrBQ^(MN1ZRpGYOK;^a9Fd}H zyu)?Z3t^eEndhnrHFqf;BcHiTFzPR{0GViRG{z#Nm&GZ@hyZso{{|xp; z>ni#Ptb9CG)@bu9Ncv&o_Nw|4t?AH9DJ&OU@ua4)kUY( z9X$FPcaO?qsOky#au>etxGZH(x%#e^euv3N7jcjdRO3yIeqh;JslOLP>{hDwdU_jg zeHlvbP4*;Dxgpb=HiTOo>Kf3id)FoRt6_+Hqkf!1=O7LIe!N;GhEh{z_G_rr+M<={jo14+ z>a5fBw-!;E9)+R!MXcilruP-1{pfX!f?XaO=FCQy1a{KPv zhRiKZt>XMg@CWET&95d-*Rs3(8z#6tQ>W=aFM!uav)~`OD7}}G_=omT?e3+6>0!ol z`XRVFnzLsp|k}5S^>1q|PHc_#@ zMYpn;Pa!ASl+@*&Rfy)gkDK6%p-{PmmSHic`A6o3#h~JPMSmiRPs-=0=@RL!Xskx7 zUGlPR1s^mCUaE;*LUc>$)}*70lucKbRq07iq1*WcR%fdluO?Gdvx(0CrIfg)4!PDY zt&Y))T}N>OzV!o_&zFO#>FZ9yIn=lLZM;gR>(dLkB9r2WD1d_aIP)}5pw9VFSJ3(G zBx?V0YM}U?%Dsx~z_j%luDDIiy-W{p{ehaI-uCDk+e9T@}Q`a9~{dNEI|ty)ZbmM`jtN}Zn~woKFX>L`({$h zmv#l2Ym-;!PHj>@5|+W9FeiBZ_2-Iq0{Mxa-mJ;_Xe-s zB)3dCx@2SgQBKD;*z8n#2adR!{=$hqe#Kvz|U-r8K(M7N`}x{AKbC^J`_Q;GMrK=oA(t=d!g-RW++o%U;d}PbL(n8naE;Y;I4XQ}b`;s9Gfy}x*`&5V=(?hr z*~{GIUU1r_eM;X|4|P}FBivE*eNJ@+4Mzr^RwKPeEwx4T4Y}VP<$FZAal64NU$OZi zCA?*SwOp3cKe_yVBh$1ux|(_<-0LIv!eu7Q)Cbf2rlgHJ)O$}zMh*&1YhIUxUBH@+2PG@qpI8C2K#okr=ZBJsNQzp`elwS zKB}@k#tqyF^6{<|c;gTFv0?HvGYB-p&Qi1*jnIL$vWd_%A2A8qq*Z8?%KL6~yQb1j zO$SnWOBdt*H}&Ie8r@sH2O62nyBnuU!t#!W%PRz1my!QlU5!(F-6y=ay3Dozf}ZID zx{e*`7e~+pWZyhL%Wc z_NlrPTc=-a;&^0M)Q5n+70Rf zo7g7cBG_qLn+*OGo{qk1s;c1=cEfqzOLx~v6WM%eCqPuW{75@nP2=l-aT{!Lw_E-p zKgNC26OGk!^(|90YI8~wxvNa%c+YKR!tkCTsjf!X`x(0^)`GUns=qk94e3T?;N3P; zt5h|06_&g{s`EIxF+SE`bxqt&v76^VfV(%{?H7f)Q47S!@)@0$3(SgGz=>%D)|zf( zd;u5XJzQhDW2s0Hm4ppG7aZ9S_4x_Bv9mcRyF@O$uzwPzJ2TVpd3eeUbJ}Ef2VD-| z5105iJ~5|i1?RXEIcuPL;5N$d!OE*#RBfggxznuxnf0{O$X!=K#?w(woFc}2PZasm ztqT^YE^3UvtwuXx^Eq}MxWln2-9kmgr;9P1K6zIB-uUJCU90k|dz;SYNNVR8|Czn!a-;VjgWC2JRoji?7Mzj+?_nVw+kBatDvSD$gP-6<<}BLX&IhDAO6&n&$vQx;@?IHRS4(|QvGy1yn#Fy*TQZKmoz38juM|YIpJur#2 z0ONctqplTwYe_HUp!(D^&%#aREN@ba)IL?5&pM2!`#z`ZM>OKo)HyYbc>L6!MTPW4 zE#Nk=nH#m2Rol?xyhAjoD2(c?H`vtVyqZ)cHSG}9Q5{AhecGKQPWCs&se@Ok1~y*o z6`#nr-@Di0ChV_m~f;hev%dh1v8R4e-fCMhb8#Qt|a!%_U}yIm$fRi*X2 zWW3ytW8`;gfi(8Ic%g>V7uliG@U>g0loNL1jv@m8qwdldtt6Z1>p0Z6(dXJB``Eoy zwM%%?&D>s)^HRA3Ra!yujDA#W9GLC=59+DvV^ZnFexTo}p7W>osRGB*kD0FXft(tH zLubnoc)lK>ok@Y_tu~&7MezN5(BsCKPuw1&cqui?C!+qkYf^%`c7Z(m>F3l`$58Dq zMq%seW`^X}H*PbEj?2t*cub`+S*}H$RKOPJe?3r-#R}9ZL(s?Uvp?H)rk`8D?>4{| zBHm6^>*xs%RVUGCXXnP`_c+DvPsD%=@@;&l$;tDrTr$tbV_SpU`obQNvzV^1z}==3 zE>tc(4V2f3Q?c4*M3crwB(!~n?cY3u!Ri*VZ;MT<$GD~80m-y+rpgp^IBDFkblw-i z+0~QlYN=f7S4r)A3iq$TK{RBU1WxPj;-84Ft$^0&~ z0k?_anfNRf)KK5h9G0)Rk;@IcQ1t^cNlTU959g=7?Y~y9-8xrGcxL}|%VaeaIkVIq`yC3BHvTIzLm^^a zCT2*jb!TiQcQ0H|w_*ylbVD{Il;?Zxr=K|^SV_g*2@Svy)rnsFKK^YAp9X&5C8}EH zASfo&a_)<&k-jW&bV?!&gVSUC5@a#W>x)-30ysAdJop_>WxD~dixTQW)Gr?Nhl}2xLoT)LE@15ONcC&08`sHMP zs$D2|@TN|<*-X`L?kC1Ka8rrI!}-nffrMglc@n9_1)J9;_AlgS*N(VX#gx<;@HB2k z36O)VJ{EPrB6Lhe$@$-_PHH3m)S_h3k5yC0yl49{ZkRZf{BP_kJJL*-S%dX(99gKN zZpx&7k}U84<4*xG|DfqfwLKUCt74AdWh!xq`5#KjmFk3a7d?pO)xk5XbLzt48}lzK9sJ}mdCajt=!Z6-30 zn2B!crE2X?$z@D~d1Wt&Nnsm(oeE{9y+-X(n{1j|ZIC_man8^YwHPgBS@(r0Epw_5 zQ6*ROOkO6_XVCSTCFPxQi(#;u>isTiz6Qrmm#O7c>h60X8gWp_c_-X;P}_Dm-Yu@U zKBFp|VtP5cx|`gii9D6hTw^*?Nn~mLMm559@e~hE$X8}#z6*OeaV`ESyQti%Ie2%h z?ay0UBr40r;m4?qx}t7u50BMYX9ZVPlp$5hb2WqtzbutbNtcA}e9NOZ+%MFk_c`fv z%n^Q~u$_qIWz;Y7DA{l>r?Y|H6aIp~sgycOJr%F!Qr~Wm78KiE5}2)(?%S}jI}IE6 zDcYzdE|>k2jZFo3;(NG@+eN~(Fm_L>S!#X{|P*{R0Qq)Gv$Us97?Qg=$MKqX}4 zGpd8p>W;|-?#bxbrs{L+bLv&J0I{~Hg2%SYxhq-q7ick#xxD^!_p|N8gs4sGKv0OY z)*ZL}e76mq=OFIi0b=MXB2Z~Kfa&Tqb8Lp0-1>I-Emipx&Sh3~I}_Ax8-m|b`9%JZ z`a)e1b#dNIGAm^!SysMAf%(*RF(l&LGS|uZI;S9Q<+|)|nz+5KsOr&#FIfra3MM?G%QE0n)tcnL& zTod&NDDZPv5FVq{*2gM!#}ZcuDa_ci}^?48n8lo zbo!TEMt_@0VRK|k_cto6j`E565-n?1Ul@i?`yFnIzNON@hoUznVt?Wvuqk(=y#=2X z$25^OY&@x?Z&AIM^QrV=mzzqyh%St>s*}oPvY^*x5*9mqiut!J8#WW(sxRkj%PgFu zC-8wU)xT`68fKe<=r`FCev>PRV)Y`5&p*^sYTm6biR$F%`QGZ!;H=%p9ZjuUa1Z7a z3AVr+Y*vrJ2_LG__LR$`{5oBB_C& z%+EQ1hU+W0$6X9J_%|vmOz$NAc1|L*(9Ki|>ej^0aDgqSu{=%+OI~)j-IGEC{xBrAwM9E&#`jz1#SC*-I7IG&Q~D>&l* zwbzI}Oi1x-K^$v2Elb5hH2vq@neZWKbSx~*LGpKX>dh6fP$|t(Sed?Z1jwx)U6E^o zDfuu(Dg0#BA2sJB^`jhXr*WtLBnm8$5%|lu(c&Ja{=Y6;D@*9)?kiu@rRA$qsXn?3Cu#!z{ON9q!B6Hdsbthp1#~n27oD}8 z==v+_U+oy#69s2!pG0L-OVxN{N=Cm|O!R9(sr{)o8d7a0^(Fb~7ga5Ix->j#wv%WF zYEA{RE$@%J$*O{T*KMbh_7)7<@*uI##I}+AWRa{W77a?(d3J)Wt&4-gD*4rFjm=^% zp)hQ#V!WcB>Fle(FRypm{qdlH9^o_Ths5@2WX|q-xKbeNLAX_l`)vA#xsTuFA5iA5 zpeEe+GTYrxQ%%)MF#i>?K-J}0FV^F^?T=r4U)gV!p48qg~SdXLh7wY+UL5r)<4*zR5%70XGGFnYH1lM(9T>4eO zWmSl8CuJi2JJJ2DJHcFtQ842>%w@aG{YLMk2KCr7`i+_Nb!M7%0EIHc4dyh3x(jOB zibG{HQTl`$jta4$&Vn;_Hhjeic~+m~%_&`2pLOZ{pWNn+v1wExS%O@4jyfa>&$AG< zXL&!~4WzHs&hMskv_`H|KPsH&oP|7UA%80=+|G1$z>T2J{l+)+-BnjA>>K#5#stL! z_KeU?ui-VPrWlbo3+Kgw)tczKx;+tN3pjKMiuXNe&^4Oxgc)3m;fG>~;p=d%+$NqC zBtKM<5uePT;rA+|H>v!xv|57_nGG1+l2*;{XPvp^4-z*PC|6V*<4m5bF3&i4DNysOJ*yYbYc`DJ?F7M}8NV#-u{ zZX@~qD*L{+o8F+(>8xOZNpxkqgYgF8qgX>X;sR%NGETq?{Jd^z88y@>wEMaIYuLLu zp5S4Zz`~A)Ntg1UoDlN5M|n{qk0w&<2w4a+N`F)m2|L=K->F3?K@O1 z@?$Z0rjf+Cv+5Nmp|BrI48E+2z?57DnHS|QRUx8Zbz^b9q-LM;FZ9$yGZm(&Jlgf8 z$`j*?@RO#3K^rkm>4o~p-FAP%vE|3h(qHxA_qae#YN|H54myQ9VsF}6yn7VDDEJjl z$6~^T)98nPLw7E($|V2brcS48|BBx7WqN9@RBDl1jbyi2QLxD?^u@?roJsL*p@~8!L={l>?xKU@r1*X=W z?Q(lp{Yfq>>7KH^s}FbKGnZRsr<3(F&uaj6&SCbS#(<&d8@T)KBX`Ix4vOgU^vpN8 zex|QJO^og4D!{4#!CQXp@`83&+jVX`T*)K%i2l$D{n$41v&gem)gWi=WAgle#F|k~ zs$6y)Ea=xRR_DPZI0-lG1N9+qa1zygRc>{EJH`y4Ixp{Xm=nIeY5?^$|t?Ql(XDJt9F-DtPjCe@$dwM>QT zI5kz&3RwL!XmpR-82Jo6Pc1Uv7VuJp8*v5(Dx0q8d#GkEL18q^e_^va zNnf}txvQkxj+XrcH%DcKC*Kh?ABt@p*J|ScE7_{!-k%(>O_QxZ!@I`rHL#4;;>Z^@mKaue+K)vFbsM z)qxyv%4N{mVE~q!$)Kt+E(vq_M#*H z9c+6CznLso(02xpUr-AjtQ;{tw_8NLi(11MQ4Q5oS4M46F{+XJ+a24uOCo`3?EsA8Oe^Kfi+ou#Wh)(!<-EVL)V z`c;W3TbM_h$@lP&xEq%GKbH%d7_Q<6 zJ5NRvXgvOOEmaAai+C!*hkRW|b69P(xpaG%h-v1jeIn=OUS-{1?i%>L6muCf>rLEU z#x2T?C}VQ?DKO>>)HHh$m+^RfV&`1KM8m{7o9>LarV@~VCtLiWk`iI(+SGb4 zEYJj1R!zkN(nzJ$)ie{k#B-Bg3BSN)@oUsYTP8Iv%*Be) zoQ4W2xhkeB__Y42y-2l@-G9$a<6EMDk0WZO^Vf0aY@`SE3$v9z18E*nbHQB&^zT&D ztL0Aa3;VO(MU}8sJez!hkI(Bm@IJ9HIq|oqS`6^2=ai;&?yFTwOn#_)$wG zY}zbEZT~)<0mzQ->a<^dY1b@FE(lPAJlgW44eaJ)XN~HUrPV6k+1GPN9X>N znv)8CRbOE7?L{p**ws`y_@Gg8zT4#L_*Ck1n4=h# zfbNbHk9!gYuBZ|4bz{X-yPHV8N*?s1dAc*Gc(%#=YK^O`ySfJa%(nCkdfTCD68*M< zwilfQbon5nM4ajabgGyvL{w#lzbX$-TgmN>bF1N+Psqt+^6bpKx$cJeLtyaQ?pJGN zTKgLQXP>LAV%atLjk_A|4aT|{x{&m@xgX42R1@iVALsUV;S}Zsqy0|Bl~@-AGyKGq z+NtWSdnu2}p|E-<+&^-@I;Y-{$7_?1iu#GRu^%h@+YjwQmlniUPoHwk$b*rMLm!ey z$HSYQu`lf_v<7|rA~qWza}C9NE+u>l{X4#Lg4jeIwZbM+LWDN6`vlKbOEr;Cyv0_t zTi`9`*-!D2=g~!p#uITaeihyCQlks_nHW)8-T*VVwZHKR1@Gq~jK?%r&1Ll$)n2+N z>8Yw8hOJajGny*Dyn0SehwD)`4j(z;`w_#MxY6nY?8R4bLOE1td*7V4!%R-%L>J!Y$=qawJ?td^w~Ea={$ z!rE$%F-`RV{`zwa157RgS6yBV#!>@apo)1a>$zR_iOKIqfH&{kAucd6pb%#}lK1xG z<|yme!6(P7Ipoo`vJ=s4o-68B+K(JlIOTnp5>9BhIV3A^4q|nB)k(~9vt$zR@=}<# zYbpadWQfbpe@`8L?Mk@A?z%iGE2tNs*#hpooa08RO(q4HwYXe@e&den>_Yp%9>L$A zotXL`oY`QN(S@)oAJ7X)O|E1U2eJ9Sy$RFsNG7Fw)C@d-P-KC}uEhWTLDp2E+~-o! z9~j{_GcBT~?Lgmgi+m+VfvKChUTU{Y?|uM5E##bzhr!NHq^(O`l9l{;Kr+EYr2(-L z=y-SB%^K`*5iNB(%gUVB@&T!lr-D6zQpQ?ItIjq6= zwjTA~VPZsfX0WZIXYz|IAitpo`w0I>1N>E~xcl+JR-41WP_2DZaz{_H_Gm_F`$rq{OAKK(PC9(J{r#!JMBa)JFBUEZ^E>NG! ztM)MyBVLF;+>!$B0hyu#by_C3mrCSeY-*xTjB_B->|}>8VG!R|e-PEqz_2}0Z|nK$ z3%03u6&bX%MNMk8kvzHFeGTiLRPUAl$qsHB_<5~6K^9L1k6EAibj{5Mi%sS3w@?yh zWeH_>3+ixpSV)tZvKcuqaK{P*n*me8r_F zCstFvK?0TRRGUb%r$EoJEAb~US2aPRZ>ZyDy6oyCs4|nQEqhUSjOLu(;(M2xBn)AJm5rK@k{Qp-=> ze0mxwLGSJKPWhH=3-b5{ zH(5?)tH)@+l~dc>cp{0eg_iNLdCxs$gAQ92Wfl8@J}XxS zn{5I6hr^@nhx*GZA1qas1oe~Z>QaidXiP_`mna+8s;|PR&4N$$1sHHXUonatlA0)v zdWhfWwtcFql0(fNeEdi~aP&=ti8jzW$s=37W@op{IK2D|5 z!zIpbpNei<7tqroRhFlGR4o6HxEUOlqXb?5I+2RVPF|F3x_tJSPjy=u*x z)oNA#U+tOv|6lz-Jd-)p)kt+Y))Zon;HvP7Nol|@u8zAXeht}bWXhWKVG{gfUyH=_ zHaoG~uCDq*C6}$l&mygOfQM(Bj1vuQ9+})04l3J!@RpPnNz_W*UrFT3aII;F+oy(j zWLmJvF$eA*BhG~-#0rzv{$_L8FRZdV;q)_yM`LFMDNJ|4+&ME6ZMhAKqotT(Cg9ac z9Iln;aW}1qBsbOU_S)0MHg(Y5Ml_#IB#(qCi}nDd3LRh4UUFV%r*0=Fw+NjBF#-I z9G$a88r*lW;=S25A)lzkvU>N8xmi@AC3%8hdZOg z!zL)wQ%6gQ5|N&wq-c*LG&R1^oOs@{1br`6T9MD zhJ6BoOK)(XaQ3~4jun$}`cyWH!%gAaqL^7yJ5ew!S~OS`+%msJD+HUu{6VZ47FjHs z;k7~A6u!0{**%guGQj*GGRgt$NjnjaHP6`d_)YMe{ZR}LR+`)4^f0mM#^kQSvLRdC z3PxI(qvD!55-G}l&Vz7ur{#^H6Z4Jkg?ns7G%_=SgCio-m|`MB{`iHX5F-p**8q^sHCIah3h zbDn7yu-mkd-4$%*WH;w2eQ!o{niqvr%|)?PloDypL327h8i|o(%usdGA24bzKCfrGK)*WxbSXxmfdxIOfqpQtb`l!aU`AjE;^FW z9TUzMo5VVEQ2ZN|F||zQ;1}GySEKiWd7`TrW}27^qMn}~KEbD0G>9|BOh%kul_K+l zzNTI@t#RgAWDKsuE0J&UzhyJF_T@0M9Et~bi)j%2ESj1j(X6I$_)=`ZcQ-iPjBl#1 z_$tzi-zJNl9T_ifL~;k+@lO>AP6;hrMs|U}j@Bw*cbL28eQ}j@mKML-Tak@yL0ld^ z5Dw?|y$+^|Ltznd*bO(#TCyHE4tv}n=Hn}jtmNj7IRi=okrp%E9u*zm7# zR`7K=J9;Q+8rI|%XEh>hB4f}pWD?J#y+y0wakPOr5|B!4T7X%KrTd>UQ~ zGl%a7m%@IrUve8h7t!bs!L#s9Fqmj@6LNQeI9n@-+YPZ^l9|7pq!Zz zP9m-j4!W?rCkGoWmxoot(WYSRZ{Yz`J;=k245RC!H^aU`d9#fhc{u1HVuLEN{Y-46 ze5k~SCVlXY_}b(N%E%j>`zE4a7!(TXYi%e{W|rpBopvEjDvU(~2%;oX9GY;sehjs}g-hSlkQ| zBf^y`I}u<}*hVyr?qvI8TXO&p=@Bt9tYx>G<;3Mjv4Ke*tPg6LcBY+3Z2H-_;A4@= z3^7GTTT?q1_1P5)P*KoxxpD)lbLFH-mG~bynM0@+1xKz@A#V5&5-SMFv<-c{A>60x}rKs4?%f8IRD!lIl zD(O@p)%NOVx7p``5i9FkGwJCccU{$Hg5Nxu#kco&+z?&Kr`2_R4Y!eQ-Ya!oId_LH z?4R=QXSdVeeJLAygPUxiD5lTwsYlZJnB;z-i}sFQ?sDO9VMCY<^gFhii`bp^Q#}PX zr;56ZIwBbkpL(dsPnsJtV>nxV19$Z!2wqY#|B60oHOjRj{!5jZr{9xhfuXy*rF*V(uZ@J#2#Sb^ zNQoeVAPAy9-}(LjFP@jr$B*}|ICI6h*Isd~<5-KlAcggm&TrH@wzH)4yvlPIcFJNo zOdqzR?$ic00Yofd)HdRI3iEzl>?ya> zAJjWGoxe*qKZNP3E$n?MMP<4vm`%6*s+$RiX&IQmdk^fT7D0(J>Ee5zKr^UMmo($92@m)oex>!*OhY@(w+P^U>8 ze5pqExfMIk^@yzFl}6YJ+}ii4_~DoM!uCa9o6cQBnZ%7u@YC!xw?r=LMr?ki_BW;c z7MBE@_kBLmCU+8?dMiEC3^Gu@;dbY+pK-UYN#Wptt@V|~cCUPz6c$=(KuGQJZ2>LVBqAP)YOFr!~9Bg0*$B=WKbcjy6#zyfJ%uW&chh8x0idd0E-m)mjHqzbOlf!Knwc!3ng;(Kty znSC+48=l=hW-QN^FYxNS=$fg-i@i;Z5df zB01w)?(;Qy*RFE)&FA2WMg0d%YzkrjJqD-9Ah$vP*oMiyORF>Vb+DY8AT|ZS$zRgl zGSCeXZa?v4X|T^k-FvcEzY3m85zwXuF1^hUUiuVd>oMOlRzK4$pp`F5e(v0WpiFR2 zmg{=Z!MZX-GBK0zbyG^t@p%fl1Y$@s=d{VzLIHC^miu#N8=rE4POzWx9$S4g=`GB$ z@_kKj?BydLYeU#-x9MmVv7_V?-QG(67iLYDr&m?d$N1LL%5H=km&xuUHZ-HV@g|m= z#l{MA+9JQ}4H?bc@k;a-hf7|Y00LIjHnd-9$M9GEjp>4;xyujb4f?@jBnbqtt33oB zlSARM(T&Lob7z8m5p6dT zVV6ibcrnL(Lm%gh`8H;zKSY%N#1+M&s_7g2X1XxHzpLqV0gR4+rKPzJmKDK6Z{oS7 za7PdGgsMw@e_jQwdkQ-VoA^3*kDW@#yiUsOJUn#D#hIh4xK3`*Y z@(h*hGRpmEPC7QHf`pIMCgA|o0$uDv{haTY$Bv2RrOWrXHV%C$K+*j_hii{?c6_dA=shCbft`NGwgO<;5W(= z7nMZ#TUUZ}Xv_DSsbOgl#Tirj(`6N5Bi*05-)-kvWbH(R|a}|J@ixkH1a3R z|K8>wxSKnruV0Vn%Hxxrr>}L_ECbJ$m}P;BzeXDtsC46up7{?r*INrXRt3S@)4Y` zkh8C=MeSjF;-%?(zpr0wTKg*a>vZt!yuKTl+JW!{T)^8Vl_cmv%?ZML4gXM>9%PC- z{4afhUL05_8_EXTRgxGP;=UvvHPR&8pa0rYW^=w%VYR#kn{|8eiD?hET2-^~Y}i6b zpQi;m$Vj?ju^zswQC@qeq-@ZDS75g!#o}lIE@y(TVQk%~?%B11l zZ_-uBWN+eUA~M4ak*H3GGXU3>n7TrX^IF^FH}Iz$kuff#U*kT4Lwi|g>t5ynq^G|d zOJ@dsut{R0K&5b%miOl((={E~;ZSTULH5#DIA`k92b`^w@w%4WAt|u&#rT9Vg4UNV z=qfs7X=D~XCP(+b9R1%?riYmTgCRXOx!ncC{I=)-Pl68rYo5vyc5nVe9^BpB*8#pP z%&CI*AUSUzI6N`-c=AQ^hZ^{CxNzuq9T@x|DJaEZD5gWnHjRGhBK<}aRXO#PNo4F7 z3bNQY_~-VzUmv)7Zl!!qRDQ{h#oDi75ykP(Do;!%&a$*^69Ob;rYsWIPdYQX`ZGTS}xI8`FEK(lNpWnjQq2zzxhTq1if+8wr%Gpn3?#s^KPvDIy}nE zm$zNK{{jYv2SHp&WZ7VPqe}mQ6Zj&mWEa`FE5F2e$p# z)QEm71>7@R#|QlBT^J_${fk=Bo|L<~9Grbw3n^e8FT|NA47kc32-_}{tEhOte&yy>_+{ID&$>q(wBTm z{75nr9MPV+QmDONluLYy@;=UfD%Es{YfZ%8goRGG1(<}`Qr-*x!M8jjhiDZQBpl&h-+?t%80z@#Z#B4owWNo@A%9`L(G}t*LAxIQlzy=V@lTq%aTQ{p(nm z*bQADc#i*R8p$B@G)BwlQRXspKV3SF*A;XSFPoorvzafiavS(9_L$^#g~2b`K*OYr z;rd$;MFBH3T+Gb3uk{ym*^EPrmP;_9g z`K;}z71G;O^eg_M>rz>!hmO0w2c5uKlm{)T(vozxOeJ2^v7)~+GhD3W!mhfEOn{wa zba^(i0b`F@K-F{==3Op-9Dntf{uVjJL~VQ?-8e5t=n$-=(rXsXVUGWKVFsGyw~OSc zekxzMT$UZ5Wa_nuu`zya_#yYU3z^S7^EhbeTlm8!+qDwP3;v_7T!nO|HY=Pblo7ff-W6!&}rYC*qede$PHiKT|^P>CK za-4oa5&sjnmT4%G0mb2o;21kA*2)87cy^xp$Jp&wHZQjK%*~XD4g5I&DR-xcW@nB! zQ)Q_RPf1e^bc<%Ami$g<+qa3RN0iwms5H80NY1i47%kj;cxdm~41Tmul_b<#i-(@XitAb`r8%;LT)Kg~4Ks0|eb*H+bL9ha(AxOc;drMuI!SW-``nh|zCG1e zW!+64Se0ybgsdg^38*a^o6>%PnMu{Q04D7B=4#lEZd)fszwG~JN?t+g;NsNY6@3Y6 zvbOMBXZrI&Ie$R=no7xgiGH;ujw~j%Pr~=rp$ea5K1VGxhg?2`Z|ff6)nL-woY4Wo zd=ky!*OI}YS%%fI7hmy{xfyl_ZCE0W@tzQ0 zy3qMdPb99bKg$_73VF4HbeC!L5}AJ#tPuFc{s>V!UKVRC)}@ivFrk*vl^z^yh50mE zzLSgLV7RsU0xMU7ykg)0Ww0ICiPX>(3}(xCIZgK1T5ALyWfUx}31pWo=$1Bd+c@{p zaz-XN6Fo{!F;#a-c3G9pLIBZUIDrU35+4#yNqFztN6CI(ezm7Tnd3Y)-b&@zR-Na_AP>ZJ}E^G_ygHkNioml5OX~13D!c81zic3af-1p3wjz=s0A$>~n z7F1nF$u3&LyPM9xd3hDD(}_)%8zRZ@n_H7vj3i&HZ)cgpWCbmlR1gPGegqNs9j&Bu z(DhbEa~*~a@hovNiEJu`&ss*~ZF+l{C@@x=OAYQtXjUtVcg={6%|qWjcM9ou5my$yb_j#E$-N9Xw8m4@7BskzsqSecq z*_QK5CE1B&^asdNdr*N_Grwqcf6k^O=5``uDXqUqDm?v3G-cCupfs16W(f7gD6P&N zDq@TIsd_MeDY~a>!ALyZ?c~yEXE$(1>fq;U$%$xI`?1s}LR_X&oSwpfv7Da%s~;Kb zOM!@$BL^LAhSUGvqT^f#*g419BvV)N_$E||1@tfTcCZ*fJqy&JrJaQqZW8Q~=kUQx z^0N<61&uaYVU_ha3k;i)Ohe*!S$xDDGZBB)S%-zKd`A7<++p@nTQmmqbgGYqC-XDj zbRN;XI~i0v6qF~?@wKKOIWS3Q$hSE!xL^^_S{Qz(Au(DA*vMKm1 zY{1Emku@%pto5^q2CH3Fs>uazKAXBS*wRu6)V4I0#}8(W%!hR%Snq1HR8}M}cjMib zFq``+zE_Z${Ot#FSR)659j>4J1q0wXC?_-E;Wtf}M{X`vL>}J-)yj1@MjyE@OyS=Q zp4FP4-4M;g#N{HktZu=p43i^xx1QV-HaG{LfJ@{;*>nr$`$Ih35#2-%nSyI&GtKoT zoU1!To62$w#O;__s-w*uv~4%2lqSfuFgrY_9@-wS)C6Qa||1M<{BvfE75G&%8k8}PG< z)bed?ck1pp%}Mt0q-^m0pVYG#gS8-BU$Sv<87N6Qo^y4bCX;0dUgangh|-2Vh{o*$ z_H0SA6yVwImvv0oPMPArz+4W?Xj^W6OY=~t!`2xJ#<&~QG)MRxCPw4%imo=Nbh+7Y zztdH62=;Y9DI@dDUz}AZ^RI$Wfv*&`Y4zc8Tc`*{Zp?BN-#-+z@7?7f@qg(kvbx6W?WyD;riP zLV$Qq09X>QKB*UVLTc4^(`I>hGpv9`2r z%5L9opws*9EO4;eW;WhonHz1t;?qwDTUkN1d|5x1r%a7`S33KRMe9-jVeF1d-q@PqPu#>K1JG?XaQ`LF88HA@Gwl2alUw zI*w}RFt5$r09RJu1E4t~5Q30yZC(_Z2lx zC3&cyn>UE|ebF6%K-L_KxBo9J?px9WNe8Pf9TjGJpR%+0b$SCY`e96cDsR)+soE>} zTjqf$C3q|B(lmRCUtdXrJTU)(Tov>WwT2rmi^5lJMmtAtyKF>_SEF?z9VCnIDR(55 zd0pT=NoHwHWxG#ONkQ_C=H@k`cX3(ij+@N%XV%CxcTq<%y=l5GmZ9!|Tnzq|I)0um z$46JRuhHkZNgSGpZz>zik`T7LgD+H?yV8WJ?t<FabBmdNWG1vR+}wvnLhSF;7} zh43Lt{k*98ZV~-&gyUTYX$O0%C^2ukW|7u%$nLbUrK>3 zdu@b|sAJ#vBh4TD-YM9Zzi3B1@)LNMCG0L<;ZWotIKdS86tt3U+`h5>TXN_|(7#>w z4YI|lvR%vC&)r*`{19m>OdGIk@G?`#O()CWQi@7Fr%wkifRfO!OD+U*`fI=p1#VK3 zE{b0U=5dO6HwEM}qs=W<>BJoWqJ{9D}w?VuU` zK0akSYV4XIudAgP_4@BR87}H$7=~||H>v3RMThwqeD*lrKdo#9Wt!&F_r+s&pX4^|upwa*?~}o7P?Su%lFUDbOm>mHOr=~$JJ^!UsJcXkG1Dgndv%<- ztLx>eNzDd=S!Mz!)`BRXUJKc=G8PR>Q#we=urAZdKhho?AZ6=)ggm5YcwDmCh%K(2 z;d~mu2Nw5gS6#~a0o=I?wx*5o2{r>6RxkfG(~c(VV#oec>Es*eOrOCI(VBieHu{1~ zZKma@XfE8 zR`x%hLw$_{B|EP7_#AKeZPZM=dCnEUSzhx)rHGawJD5X8K2;Xd`G_IAcnk~rFP=ay z{~wC&!aVP^{t7X&2Q|{h@OMsVG`L!hcLkmOH?l{vn~iQZIAttevLOGzj$5}1Mr<*=((lql&h?a>K_gto zcII}K!?O3FJR5=y<|TVcnLBb@1=2Ccfl^k z>l*tMv}UfPKDdq?HIWLYlx<}{0qHp=zj5n^_(SabX>Ox>%4hX;?KJHDJD1;nDQSIr zRB)r{gx%(M{zbzV=Szb5EYSk^vdhd!okj(;%-jSS%E%4a8x*pCN7ML>AS!2dgcta} zh3tiy2w|T^-R8K2C%nY)`vBXeJ}f3~ojlyPQAWquYtE@sb0iA(ee3 z8{`)=gq!-%Ws|e$c$QI{)9frcu8TqV zym9tjqWpLl1J+T&x3Z1!ET_W4(F|^(pQ-P;uJ%`V!z>8T>1Vc1xLA6_3>fUI`^U16 znqgmXgYK4hb?iC%bQN_Os?#srMwt;!V_WGA@}L{y<+`@eX8IDfe;-@OWhMSi(~(rf z?}9lslA`VuF?AF;=zjRBV~Af}&sVQ2xiq;rphdPfNVJ}f5nj_+$N7{ z=JUh+{!wD-p8X{;GR)QGzdqpx-lyJV>X^?fqazWYjjD1Y{j3C{T2b_~!*v`e^&B6u zaW+4FpA~Y~XQT_Z()RXK?GZ4IeEv^9SxIS+{m`x86KAz${P*%dYP_xBDBbl%s;F0W zR(M~pnR5OS9D}kpC!P2>yHv}um!_NhRVv#F`UbhgrQmbfEEDY0Xbt9PCTdx-<^$N- zT~w0$>@xZSm0BwLQ2-ce#?e|WP` z=?kCW1nSz=GRsx<^YkU2RS7>;7r4J%M%!P~**8IAc7#iV8KA(&OiiC#zBM1|F1Qt2 zq%u8>C+-Ou@o|vNdc?TX+Cy?lAvTI7f{4uG^R3Z9a{A&tfmQHBhESjNrj{;Fg;G?{ zkY#McH=F}qm@I?o-YnF*!Be+Ove2pMq1Egj*$Ey$7WQ^Y9|Uor`rGtTxLzhuHGH@pIR97{t7-QiJWDmdoKO?%(s(O z@^X^@$wL`O9x+E^>42p4qgv2mzezXpub=>ZsJ+pWWU8Z>Oj*w2x5FRsry0W}BGyIj z$}^c2ZEe$;vF3Z-$E@MipmeL@%HEMI_PVhBTMNQm-y;+BoJOc4bCdBMWeU#%?o~xe z16rP$h+L5xv3*#U>U+A@^KJO%9hp7-SNIE4mkN2+oVK~2V6QT9tt+u?gKcjA(Fa-; zZOTPy?Uzv9ykR#`=l!UCZ725~xn`nt^8;*>U4c)3%a^AM6k{LY1=d77_(UeV7zN^O z<~kOk+tw1#^qGk>RXy5Jo#7^dg1l>g(@*RQZt5&k#HY2Rbo+W_2L8T{1yq_9RH!VXVOxD4y&Ng&naJ*34SY})KomL_pqoJ{6u?|TDCZO z&vBmKH(1MLbkkQQzb4WPC_(->Q<;mZ2ebbwq6Hwj`8D}GBwPnvE_ZDee4=IOAMJz6s}L-B!jQv zvT0!|_Z-@jJUWYHz_PQuYo?K%jFzV=ctLfa*Z%3U=oAA2uLq-XHU~&*UEfw~*uSXo z?qGY()X8pHMBdgMpIkpVpX{|)%x*2EkF_HBM`QWWm-Xkh0CzQ&k0(yH42sGX&1@f2 zaWBv`KB9}bpT#t@-qo}=kG%|v{T*n;yJF?3{=lTAUxP0t4|Qu^pG<7qtsAtreN%_v zkG|y8JL@mZr|d@$YAk)4Ur`YK!!t>A1<5UzyF7N7Z3D6qZyWgknAbm@dMyvUk|bv`zi@ zTAJ+Xy3WUYZ#5b1x6IIpfM|9Ni;9yvRO88@59jqMy`$}*>@U0Dh@kzjn@d!7;-|vU zO)cGIm>*AlV@*3(R}V=eTh+2*5>`e=dsjD;lgzSx%!KeC`sXXikE(;)jIdc{pDV%{ zU-fHr47Ftg&SAD~4F{Hev-HgB;8AN^MLqL7UCLQOA+oqN=5bg_iW(#3=%v4h{T~AL zZ$&*{(=LHqbU55;Qs(QAb!*)x;Aze6bgJu#Xf8*Bt8CQO4%M^0rAz}gJIRMO;=vN- zB=ueieUlt*aC9DCxuG`Jy<`|hPP_ktOWe^dsQRzMna^dbm_uO)m%-0<%e62baBW!2 zj$i^|D$Z~hwP(X1tIrv(;hmD*-T29?ugk z<%h{mD!%jbuCGmp?;)@DoT!^93+c78wUOApAij)UsNZmdPrFy~%G;%~&usTHh3+$^ zCU$oPb!oly{yn@*BhaB#<|n-xs1g_%?AsZD{Z8+?6>u_n_nL;^syku*>5X53?}G}E<0t70RCi}h6z%64S;Wb=)3elU z1x!&bjCCbxJ@*P#Uuk;@d|;2%FvaQAE|cL%jAe>tqVxe%{nO;s z9GcM`p*wU%?rM5a{Itv+&uOcYRrQhNNEXo0;Ziqb`n-E7ekSan1SyPNWT2vocdH!J z{P9s)wH;i<>dctfOs>35lBgbf(`Wcnw^1KGqhexe4p`PAsUR81BU1LC{R6sOMCWN0 zd}_)b@9UsW3HXv*bWk>sE0rP#$Q+*46Gq{OT+}!12y&r^XlOq-t8|w<4KGk#A5*wq z`0h*SL$3ze>_{C;rCuJJYQgIj_o;pPux{9n@BM91U1ylm_M2d|E|YA2HF#_-aNT#L zi+N!7nla=W6L}IpyKk67xzhRIUuL|gB8R&;*f&!AOu7A$2d@iLw$F^lhB7Js)-pUYq5D$Ds4arQ!R*F59Q>uNV{UPJkXZv0a$ z2|g{#uk7{%Y*`xjm&Za3vyb=ORwsxkg1`;J%YFrA^N zsh~6Xvz)+>K`Zz<75+~N2-CrC(rLt%-D>fyYvcrzUA{u2e-YHF0u@Oqy36nQ+zCbe zK0124@r}PnQs!eXl&$9XurE1X8m1aCi$`+6P4n^-HNajo4F%aScU(_vNxRgSuouDZ zMuW1plV!S4qM+FwTpoW1oa1ZMoToXRCccULqu%GyQ zbPzN8S75F_L*4ip5o3*yk|V8l(}*XTd}VnXhWKal25h;Q;N{?o)Y0a6<4R1xx(Oyc z5q4Tj$-vEjoO~V>vM`xSVIK*MeybtfuZZ~rkGI0KVlv0;GS`p8aUZr22!_Uw`%*M-aM@D`?Wx5sS#)sxB zs;}YrgC}wxkJwbFU|pwF$S@k}9QTPUr(fYUlJS_e+yvPicGj6NwwlUU@C2z&_+DM{ z`n`yxU&)L}S}h;6G)MGJ7f)vPfyUsA(EOM|c#frJw*0Bb%xvwVOw8~Dbb-7IC#e&; zbASDooe#OBpq$c=&3t-B)3rM@D-OFKH8b9{h|4c~O_DZ&*OuAjXII4$P9@G?Bt~x1 zba?fqCIbq}9=y{3;FvuO|B`XUy(jq4wZTuY0MDAL0n8=tXErHj%7Usa*J<_%ll+Si zop$S1Go0A6f-2+@l|^-bOxB6w=_9U`DK) zvRTDHc>2zTJ9v>Dxc`g!Y;F!-0eU*Zu7Q zy@zxk&_B(v{%Om%Psbk)=+*DTf&J4pOWi&V|JJ+j!2ao*rEQ-!~UdSavf;Wu70FeigC?m=XF7@!B49cFS7 znZQ)ckHag$n(&w#%LcTgk@eBLVc)QX>Eu$OM81f|tfpDaZ)A3p!d}5lc9*R(a7 z1Jz}-us2+)DbW!@7PAG7(_%C|znRZm8~0;$R-|I2Kbs+A%)#Mno zDv4nureT+IlY^tt=P1mWDIS@kt-}TE5o-`0ihK~f7&eR4M?W(*vNrN8{3>`~4zg`5 zHe49p8ND5iL`$I!tAYmRd}K}JVzfzEJ{XH8?hyOYPQ)J!Y6Oc>Lnfp7%M{-$`Z#$8 ziltT2JjpZAcJ2*647!FTg86bYG9dD4FeCmDue=2P*YDBV;h1R0;OT)6QWQGT*dQAS z*1TX|w1CSTSB1TXKB&TL{umt+xfW^0);}N3i1uhu5Q`qIQ&=N8mWs7XxH35!c106J ze>K>LBJ*6dS^Vj^+2Kc#it%ORdq#%@Wuqg)wL!r!b+k)(GSUajD30!@WKbr2IWizT z9i18cTCZBr2CG>eZ5K^q25CRHI{IO>F&maX3ttRQNA5=7;Mv<{UACzZf|%|hD7E>a+ABRiL3~Q1?Pgb@#7C1 zjphg|OTVCYus?oQSPc7Y7?y~34N9WR>=AumtA*Xsc-0L~ppEJttT>Pu*%|aj!5AFq z8-9i^_Wk(#;aAc4;I~Mlpj=QF#puA`RM0X0KwPJwa&RD+8>Wih3%?C_a12E%=NFk6>A`=S&8@gx zuSs|-vj4#H_?WO#I4Z7S7Rr=n%io$U*6#ixrr2;PVsInanLtJ}hps1qlL zX~Mmc^PJYYNQ{{syb_iRhoWIzfcElzPGd)SEaIZ&gUsQT=;y)6@M^SF7=+{4cK2;` zTDXOiUmCQEz7nRZ_e$hARuIo`WC~|QCq=&q`=EP#7AeQx!O@W~gR=*oM<;V@<0I3f zdG$%OUi^ACe8wj~PHxO^w2Ul9dp9C{GdW{eJ=!LDW_UHSHU4_!aPn==u{fH&dBNhi z=0W=8?vX{26X@7pkeevgdW2mfsl#EBcII$&vMGt8_*ryq@LjZRTw?GCO4%vVp~(dz z*&{Dvf>wj#O|Z7@s)#- z(eu$c(U0&>qrxH4k-_S?Gm)L)!Vt9>x=g8ehxa`Y=^s{M@_Oq?y=dy-a9l3lt!!{P zQZ1~T+>xzr!CVgpl8ao4 zj>I!hkWh-W#_~JpO;Enhf;s*xB%(h62xFV6t;lcRw z!KXo^{WW2Sr3oHJ21F-BmIT`)S%Wdr5@FS#QIIy!uwi6stzZKVM9q_l}OIux8#xNY*!|)kY{1PNTz5NCNE7w z@Ax_W^;_W=FE@_l2~vllbdEL;UJHMYKNTzvA4Km(zs8fb#wYKNW)0sCPXx=uF+8`= z!jG8`us(E=#c>;hI?46I=E33UdNh`k!jHo~!I)rXGEdd!ZzC`Xml%u6>Oa#RXFp&>*3pxo6&2@IfFdG^~jp=ax`Q1vGJG*YO9|V^8F673Zqxe68=UB^=G-AHB|YF{ZBH;PPaFF4mLO5@-gy zeP=(}e}iV?AY9-IWQZ4n`_fal+vE0v?d4n2IUNO0qM&U_#u)=HHwz~4bNT`k$O)U< z+jOX|X%kdtt?WH?4R89ivcxa&iT+!KYYcl~hyB?9>Z;n({(89C5B0fWy_B*C?0O#s zUpb-^?MNGMQ~QyA0vPmKU(fHBE%skKM*jxqd88T0EazB5KJc22bG=b(trn40^p*O` ztKggW?3{44nd*&!olS?PxjP&_bf>(6W@iuT zk^mHE5f%9t?gJ2oZMLAEK^1Twu1YRj7-YB|Nai=>)VXXvki~eq316GPHA3DT@oPoQ z*RHf}X(q|5riz6{;qUn@wm|Y+IV8)_oTYGck859F2sT9yyV_)OeeD8U-IkS2u82JZ ze`*xm!F<%VRKjppTl$LLD?0~#QR!)4PQf(oMmipE*b*=*a{C>oqgAH+;z?{>mg5z-^v`@Z8b- zt|(7wxlWZ1S_iF005WaRiTn)bp`b5LmwAxEUuMZaG40}$7$cD$bstMxh)w<@4a+YjS26&%ZZ z;Rwz;DnCcd(ygjxhsz$Sy2Q)>7sp6xo4-G53qGZzTpD}JqQAT7akTlweafDAFW%zO5he2sc_u^;5y_%m`q zuYq+3{6y-6K|Z?~V#@nY{t)MvkKTBk&*6VJYo(&ktY`djbcTDi68jfh%XwdhyYtM9 zvpxMWyOE8HxxqA#V56I;#kNRM{||Lggd6sZThR;jbv=Fa+zBQ9i+;Y&Hw*p`Z5b$a z{0d*rPq!D`D0_kL*cv-Y)I^)h{-pV&pFWfoFi`1rOT6vD39bRl_)6--5~xE5wSeB| zr{k$MbLoe6oQ(w+t4IIY`6PP}UE4%yWygVncCp!+gmyu*a97vZX)r0BAH%fex_-88 zV40PJeg1~E?~5z~``j)s`Fh;Vq4q~fw7-X`{W?2acSNVz9C}aIqm(NM_FW4Uz8m+i z4n3^ZHqM^b&h+s{+0X5CKgM*U6V{g3?rK-cJXhJq*vht~Pc5{V4>*bNG;(5Lx&28u-@nK2)b*w85s>MOwhI0I`FhEX;Ve7&e%#?~{ypE( zz3schu$gT~p=)brTlOD>eNU_VC>8&DD+$JzJUAtoW;)t5cDvmvTfrYH zV!_u<7k67z`~G$c9pT=#^1)JcIl9=vev&We_WA0*9^KfCwt`<^(rG5GNr$Mg-ROsL zPK^%cOc?9`fGIjf=VEWax;t))FRl$099$m-jb(-}8w}Hg$SU94p7#sv0C*OM{1y#- z0-WzeIN5XkR#4-1dR2>aC-a*}x}82yYFplRL_PYWPN7F}FdS?5>PqmB2DWdCed;MY z4Axq6`d-a_R~zfw%4z?*d(8L$*DUa;m_eT>&?nmtLi3?5<-3~SVbG27Gff4~bP(PA z)i%&3C|SPMTKMQPwy5{g%l{_-N?kvST`NDkdeYzT)EJu<>uiV(9Ws@%(is0Ge3ZsK zw@08mPx#%>CB!cbmDwQW5qZfr0V|5vYp`rkTiGv};+0)~O`ab#U>n-HpoSkJVrzpf zcMj@fgZbb}&oz7PR8S~|JG+vu;|8tZZh}Qsw$pqPY{8$yrOe5i1q+kDk@s z=qonB+G!7(QC73iDQpLB|EsH|Gqf0|dB7}_Em{|@XeTP_#qLV@4g2W6gxgcyE0}#_ z-uZXUXm7cFU~d7D^nn=xFEJM8*H2*s_!29aq53~9p>cFK*fhp$qH*C@plxI12Yn51 zTFJ-4?#N}=VfWcx13$+1m3QeAm-A!gKAnX03A@a9c^m+_b zIg_7fBR(%Tc8Qy9!H+C(?{Zrv+pTs*81Qb^&yw7BFl?H8 z^1kN5&z+QFc9E_p^LfaLH`lxHpi;P%1APxykndWD4pDv7vU%((zS|Vy((Srwe2gA< z#buS-fpx~x1x$|$<$%daALMBKWX-6}KsUFzMcPZh0F#T=7LvfdDQKdSp5FMY$(^__ zdqAms=(pxNors@hr2SV)`PMv*GO)qkLtUC1u2Dx@hK_j38y=c1;O@Gil z_N*4yoO(nn(|69sjg0uN{!HXW;{84PLAT@+;{ON2{v0}(O1HIww|0r?-=MdrX5=?Z^kf-4{?{n+CHGupuZ57nCj+Y@az9PD$NJ)A0Q z-0z%yK272~eug&wN3zAN_{`VVF>;Yy=>X4qw@lU2cAUK6_vn4jsG%RsB>o$+7^UfKK2=YiW=&lx zUEF3VW25#2EDQ1{$!?1}_C9dCE?7^V)yb~c{r*vyCE6C;_air(s5sGHM}@!AHkZ=+ zO){C2{;Df%Zld=sx;iKH1^G`s}=b@hK1aF`%9(NoTH9_K} zjlWFSd99o_HSn7~d=H<}Z_h?2Zh)&F3}#OAI-RVO)C&pO1ppw1v{lFJ&a$>yLgzo z@M+ihaiH*BgwxOl`cytAXD?tX)A?AY38p(wGq2nLOSdi)xxx-CIT`-h4`i*?eIDkC z^z~h3KAGZj7_mplWHZnc$w$XB4|!Z&JDFUnlTC70h5b3c85Y(;wv%!9qTiWE_v6jq z#`o_q4YZEE6*RT4+xglP*4=kOVWM$$+r!TyuRZ3g*-CaHeD8)t>br6dPQWmKl^gZ| zU9Y1fILuANA7}K_bv{!W9@EjitXspZwmV3CA0oj?xOtacC!1c6l7pU>wCJb?x_&l? z-KW#=_Rr9-4Ul>;&Suz`Wh7eOanwQRT8VI_e5c^B%(5918j!&Zr5}_-`r0RG3V)QB zeFdA1?4vVQSuyZ(iXQi0a>tj(OEj}PJUg%8nT_z(ho4;Pef5Iq4ZC=?4Em2Ad2P-moxX18-Qv-=lsYHED#uk6EoAHP`NIVs>@r=!u#&cU00 zqAy7y_nD7+E#0{SFNXCQZ_LcX(H)82F`k11*bIqXNtLR-u&GP86fwa;uVgIcA7+n}j6GyUdT z=DgGrqn)IZUd123XFitG+R=}+{iqc^I+IcEv@7rLhmA}u7XC7I%>}Ze)bcs}@e5=? z8f9|uyPVN2ZpXLqY;$TUZk5*q^z^nqvW9>-4+K(c>cZ0{+8AaAC*?@JgR_ZqLzvZ$^D%0&`YZ40cD|Vf4qL=+d z&1Z|-vbL6ON49p{rt{U=p_ORI$O75tU-y}ORa>1oK9B4RyjmUq8-BS1Rc|vt&bINz z4lcH{Mdcper;L8#vY=C0C*QiCi77+<8&ZW{TzlQE^O(|+?VBdHhv>*^t!%DrJPp2l;_X4lCi5#Pj)L zY6?n($PY;P-N%_UcYWG*yI|OD2CB;UOf%SHZz(%%$?BP0 zzzo~H{7K5R?sx1qSu8u@b#K={v=JH8pYpC7Pq%3{x%wiy)@RHN84mVP)I4yth_`w1 zp>@c=_vt6!G4y^d;gY$DsNX6w z(KjA$Q!4Mly#~3P=HIXv>WP_Qbr~ofb$#*`^NuWp72h6z{sOtvJ0<}}V-9RNv#*qzu_9F^e+pTc8VWDf-M{a+eOCSHSTt}GepbhtVm-gjHRb6fw+O~DIf_RX1U z{KCO(oaL}+LF)3ECSUl(yy-I_6cUBBg951>*{uZxLuL+migW>1C-%?_-uC(*nB zdHx})&9W}FpJL~d2lru8*lYf~V73W-I$uMk*=y3$AJ9JBlcKOeYH+sCwI+VB7*)xc zAcLKv`q7zbR2kC*6W>N=5IJ-+GfFWHXry5NC_@~Lp6t9BhO5;ps`;ngwuV51Pw3f*K49w>;^+GlK3b+@O zg@`2C?b)C=nduGpvEM4&>sp%z2dECS5kH&xLh=D;wG`X!0b6V#7WWOh*sKS$o2KFGWU%k)c)w1r z>wU8#n5k#b0KBDHsUp(b@@5B|`W3`C@;E&DFGkw9b@+tYL2)Ki8}DgqNYO$mn~M85Y&; zFvVd{kvrA2*QKLW4RV_GvXd>Ssp-*F^R3X{orAr=#=LNnoOKtq8WrhfG-X+2j5Dq~ z8;q+^SG6VYs>&Vy+nqGKVKYw@D-ArFm*BDaA?&Lq$b&LVGgP%jQtQIEevq*0H2k065Ik0?CD%oVpNi}AuzohHk zQL~Kxfa z7iobFP51Bke_SV`>^SafchHEo_B^%VuTn6ftKZ5@$6d+>Ltn&>;r*xkz5WcZ{wEnp zYMTy@A^RZ6g-iJjIw|r$5Rfe15jVSovDAznF_SbRRef`NlG*VKTwYtjmULreomoZH zc%RH~fmGF2Zm2yXh5cx~1be2C&X-t!Po|+)h~-nA_ubHsTz9$s8tEFgN{+!p6BLhc3UQ>L4A8rmQtm+(GI*{e=X#u6A7!+xfla}yhw`aQ1ZMFrC8*Q z`-OP05tM3zzNb@7IzQS@WnavvWSQ6Wkiu4`Dja1`=|kN~)|d~J8wR>XAMZ}c5WOdr z$g9$U88@e*xFClksZ1=H`0XsJ@*UOr!!F!8fVRYj35#tx1Jl&cEQdOI~L_NhMASIrqoB!;E(-B6W1B|lk=e&}nm+admW@^dnU!CILP!oRwP znRru}c~#6lq^26B3G$ee&d;}c!(P>;E<)6~53=?n70Wg<*8O@wir9moKGV!5qTw2C zgYU0tE80j{3`;pdEPvadqTWFs?giv&kOVXE47JHQZDijg1AQOGPHSqp zc&Xq&(2f2ksACT9!ym3LzV!?&@V&YYe*82aE1yVL_>fEeFS6bbA}grvZ|Du*7anV2 z|FVy<3AQNy>krN0=lNk^TIG3~(@i1!JGtUY)Kd-N?v8+obxj6p$_Ar(yjLbFjb=Wl zPp~63gHHt~D$v|^zifaf)zt5!3(>(w{L4XkyOufqM_fbDhHgOxeqy_h!}9w0iqhXM zF%4}I{fXz3!qESlzg~#cusv;dZR#cdk=|45TgXu2OLgvTIwEyR`2p|r9w)aQ4lgqU ziP$aeB`xTaZ9yVkLDvE0R4iw{lI$e2-{SYlBHuyRamO~3O~!J2r%NW23WdSDcCGwk zw#sro?La%7=vdO<)vu_yq9Bsj!`xWp>+sLVMSo?7axOV#`^kLiVA(EC#grDD_#=>_ zb8e{rof)1RWsKIMpLg7rLknEU4w4Te4ShYWt`mF;$8fZ+u}$pj^aYZbPx6X<97yxjIBxPY8bSlVadj_$O}gRZ)d>VAeywRO0Md8pNHy7{)QU5wq`L=n;k zJH7}?by}HLM+fp@(9mY^t@Ll%8rjI1r}0PcaVmm2E+*lbE+V4M&@bYP+Nk*rtapX{Dw|<(CfUuPAveMi zym#vV(~ET08vc@BWivAUqk!K6N|F{8LKC}PevkYu=?)gN8PQX*70#{%RXGGUuqFIR z|AD`!awqtQ*z+uGY&&RazZv#*PjF9=GHRcn!7L`){M0MA%vz$yk8qg_=r;2uDvo~S z#8u$9&Nl3tVEXMI`$h1&|CKyGwS56Ua$d_(F+3#0uHZA;pLB~YW-F?L^ZU78Aa1@x zZ!U-DN%=(}hV>baWIS=JMWmQelf4bk)4U1qs$YbQx+yjFs*B+M_c zYs_tGm||L9*-8(3dxxD&#iUb8?DKDdnhf$i?Lg4jBYMu{HPh`pZozZ>bOzY9h3z2I z*3P7s+DH{x#*PQ0``HxMz?AY2bUqnY6;079U2=a@HN9#JgUS9*g)v3m&;&aWADEFm z@e10iHu|D2BuWqGdzNO}**r2%`loW4-56s{5n=m{Jc7qIK^wqRi?V}$Ke#|H5UWDu zwdYZU4C1W6XR1?b|1uGwnT!hNYOEbY550#R#V;2Jdp*kO|4S@yAd{KgSsP?~t$d5; zSVi@6*yKQ0_#pa#XZkr7_O-6j&F(_-JmxBt#v6VtZ*xCNNooI&iKV~a){c^EHWS`v zp3Qaef|=x_`iR+{>#@h(V9+)20zGVIx`!DPYWd~97~bMDDFq%s(@&Q@8D@Cac<)>|U~Pv6f7smM_C}s7W9lulPOmfbO#M zwU*!D4@(z00?%Nk@4;ZGH8 z-?xqoVnWbJH-cA9v5V?jnaJ}kGb~mS^HPKC74k*>K&-13)_hyM+@X)XD4dnz38?5Y z`_lOD7i|@KB^Q`VbI-kF3ldK&lLwt30^UW*_lo^hP&iWaOoVfNh}cxz=T;^O%DWcS z7H`yp6HDS*+>|n2BlF3a_v#$KQf9D2a;cQFv9==9kiXTx+$Oer&5*M?!#^}-ZC{yT zf1{F41PR$ft+&B90zdA95BieaIaUhV>A@=TxKuIiijKmOSf04KRGRf*L zyYXP@T_vrb!A9kN%2s22*N>8pCdO^^OT$k1|DB^u*rC3lWizWO;CuN7(j63K zKbgreTNzBUp>GC~wG#U|N_^WO_v9JRtcsoD4hOaDwQ!Oyu!HSbo7$EktItVhkll_U zwijo2at?PuQ|icUo~P<}>uoB9L|tYpg7eiiCwv||o9rTyyt@~9*%*D<=ay?3DA~192oOiFi;#tqLR!jcFHs!oLg*x&GeIngZ2``tq6u>^(P#@UD z`?}3zii$6bD!Df*>6}nOd@j&ca~WhWlNb}XZ3mvlCn#2;J~cWU$FQBSE%M%l+%HzrWgq}{Et71s8RwK6R4AF2iJ#a(=7b9jq~b|a9y6Np*Gbr(bD zsAW)5l#rkr9upKe=whgLHFzHdJkHd42YlOG#a*ob#?&qHk!Ue z&Hb5u3U74>Du&FyBH6GaVl((_w2D?BGkj)yVru0gZ09ik7IKb*P#tuTdq7gwBM+QT zZGh&dvb%A1TVMg3=m{dwRUlk3)D?NoGO)o@0m)9uYwXwB%D*)A3H#^dA88%Ur-ifu zzJ4$I!oN#4u7+pXi@(Q|jvl&Lj@eIuTx^%M=w=C!pN*LKKVI4ad3|Xo06i;41u*ro zjQ)i_ZV8(f>Z&bngGtBPbuv)ZIDZrfNfHw)&}YCM*8=Zf5WXgja7#K%78xz2{ZQ${ z$1uml;+!s_Zrw!R01JN$bzL`P?*;MS`qUC?uN+z(JU`^oRG+JI0<0H3J9xY`l9xjM z5m-Rfey^={6m`^Q9LGH=A7g?UtYIB(*Ecv8-<4cP_*ir|#vw1djN90hbLkD51Lady zE`=JeJ+i5p8UQ5#ql3rlkI0!u31;C_sl?p8RVMH?U%qyna}1^G#1E{Ug_J253KG23t~FN0zXUQfn?T1l&wVX(c2Ou`)L7qfWuIu{!Y)}%gZCLZ;D&H6Wp{d zehg*NYJ5Tx@wzj?!CoeXSo~yE${q0h(;&NDCzWUdU8i*DAbvuNc@gr)hqMnJ_*HTu ze4DCCX3DGO5jE1wCcLAeu&}hW7bs?N?q|y(3vPnRRcSOv@5>Q48O(tDxO>loA^5b_ zkyri>gkmamm*Y@z$D{I@K$W-{eTXOay0(^P<|D0ckE4EGVc(-`)B?5B651&VQi}#4 za%V#x^cq+YhvW?A(5BNHn3J;8=Jl!cuC1p{_z!&DaNr}OWjUq7l;InQi(|n6a6qYY z$O);2XjBMiWc8H02)02sU4qVTMm|S55TPzh4>!@r_!g8L2yR(P4}KE%W+c|3_a&Yd zqK9(bt+g$oYOTlV;A8SeX8P{v%q9d|=sR15dQu21<_0pH+`5}m^CEB*%hFW&4qeV4 zWSXSs{C=(6!u;w5s2P`f>~BDiIR)_b8d6v%Ndx*z+R9idr?If+vQQuI3`$dTF6%l5 zJ7l}-KC*FBl~TFERi^5M6vk#%ka~`0$==f%9d+MCe4AV6Rsxb7ERdQb>gyHV4?V2XKQg3d@_Y?%oV!%CwgQ!F~HP4MOHr zn^(vVj)7-P+DYG@*6TF9a#tBgm_8tPX zmaN2kO~Dz!YWh?DmUndvvW*B0p|sMF3vmk6vv+A4)TN)(Sb7AVUwYc6z}0O7aDXZ! zuc^%Aw1#~Fk9tH<>6_H(-F-wQaTiz0f0AAw+6|@wqVBtt*KdXrzNVZ4_IC>JG%FX< zfpP&#=mgYm<$$VOhxH}8r@kakB;G(1s*h-qZ!IgJsM{uKIS|9*#TVHj-Q(+N8Vmii&AK9zon+Vv^Dt5Mv! zG@2%{Ah@`rHHnYXUVGrZ4yQRXLM*=auyi-=v4jXjJk`hV8uATHM@dJw!NlmP-MFCj)JS&YlWYU8@;^$-Vm#(;<>U+4 ztbP%;+YpH1W!ZwsD|2WEJ-6|Ao+I5VT41WMLG3bvQt%;4gIn;CTLL_K9(c2HR89Ar zw~z(TLzLXiXJ|Ys+T4OY1Gc+uD=p9)&4qgYv>d0Uz~pMdK2zfcy(QaGXRM*5jjYLK zr-`$>BsF+G>5;q7mOIe7K8(yl)UC%|kmD*XH49{wOox8GpAYyidEpnKZuwB&)VVIi zlLE6u4%;hK4YfrCCmfN5sLRjVli>|~%KWll&eND+l}*EK>^v=v+eWsI{TlX?6)MZQ z_8gt|2?CtUy>ACmc38$s#IGv)E%m1=Jj~UD0(_I3j%P3$+=aa81fu_MGV)1N!=*z` zQcPddWduDPb%8ZM23vg@>e}1DJtomL^wQR#A9>6j^h1!j^l*#uM0V0y^q!;e3FDEy zjP~FA3sMX7h>LM!`5(>X^i)NXCrkS0|0nTeo!9EttX{2N?P~u|;>rK>)&G}xQXwxH zWYS|1V~?;T+Uh5;B7T*-8+_~ntQK4p%ylP&^!~TtO@q||u7W)rdDUREn`Z{PWG)>9 zB!@AM3yZ;RdfU(~cUOa(!MEW$KeR!0$n6dXY3=3ksJ$Jea%Ww$Fa|63W?;GFOmiL! z<|@0t!`9|ma5q?FDw`D$DqV3DUNrknPxC4mfp?YH)yH7^S?-?e9u5ss`Q;{vt__x& zf&W&$cJu0m;oyzmNoba!nHbXR=C@}ZhA-Gg9I&| zKPZ_X{)urPMh-%7_BLcu-Gh`tAGbRCt63cF3yEU8V6qw2;15VDH%7)naCs<*y4vnv zoZ=Ky)pZHdVSVBo(fMIAn?76;dB+@eOWl{Qkeh<@Ywc#6_uQc1A_RJ$nJy5X6^0~p zf0)yabREsf=ty@Na?%EnyQK^?Ito(Kx^9SD3@gfMABOpZbapNrNjr!*d%HKorNJYU z7-q+lD~9h#4?*k2U|-~WQ^IU=^~~gG)i7H^PB%Y_g`*H>6%00pscdRfC^!Pq;?uBS z*wG#e|1-_Pb7Ajj2KUsxGB?Bg81yC>f<4)m#VWc!?iZI0Qa^DUWUI>w$zuU~+;oM6 zEXEYT(;gAF4BMDD{5(AA1Ht()o9~JLKOIpwFDQUAcVp1a*9_-U4V%$Ea;xlVlM2$e z9auft$^mK!<83!e2HDP&z?+h$5`?F}26q~)43o?FaDf?%A+~>-HIam{dUP>D?Ktm_oFLlpZg!Ng1VKziMwj6VLt++lANR~5=g5eOu)o=w&3STSQBW&vm`8yB$6vBS;9ExW5u6xNlq$tQ-_bKAQ&l;5moa|0ft0eqmBbTHiRKCTMD% zTtSn^O$(;EqmieP#?b*-HaZhBwhCdKYY=>H+ryIogedoGQ_h%3a`Smu!n8M^!T%I; zS)+?wHPd}4C?eP*voX~&x`;qWlgr3&^1qiqcc@`jm%kw&&GEU1ln z9E^5-(=)TzXv%3!Q zVF#B3etNoTXnqY&ng@}k?$@v@*66m}J=PUBb0X`*v_XMzh1~+dYiD;LQZl>~>~I(( z@6IKB4uSL>*V6PgT}^WB3wia7=(=zSJjmI|M3ct13ksV1k*c=0nP7HcrEATw4}9YN zaHILE!N9Ov(AW)v-`)_s6Z{pfbep3+-GSg7mMNYH4nmAt+D~w6=o#+mKuEVgHn}3b z+z&x=_^k@QxKAI(n(9%=h#@KseWE{uIP)BX0hZ&L2Cj-ZD>o707TCe|ocj->uG_kz zKF*AEUsGyZ$S)3t*(QNxShLV_jDNUGzHj393d9 z!)AXl|3ErkKTPH~V*JESNHY^$Zd1y(1!1;(}hhU-ibJKCR#?l(8ge4pLUaLbU;-wVHUeS)`qW!p8<-Bz@7!<6Pzj6=9(54q(L zgOMYbU?-*Er+Kd-4>TAQb@n-h(jafc~ZrgSVxHtHq1h*b7<}&BF3p zR@;D3un1{y60P+y3ctXvkxOQ!-h=$lfmXa9spxPth=)>EJIvPCxhM%oO9l)^YOFV@ zyCiU5{=^U9#adV2;|gf?6$2Rj9Hs0y{>y)=nE}06dgY#=0hT4Ev<{*g05<=kN3w*n z+5h}MXxV%Spf@{8#Nk>Gz;p#otAEk=#@o6eoHf;!yd8y75-qr_n&^J6V3Wlh093rk zr-o$eSJ2~2i$iIYgZ>~5ry`vn3$p&#a@|(sQ_@1W%J)qAvni5deIz9Cmp z5PpJ`zKh2D6lm_Y0Yr2PPjwtt`t1SPX|^rJl}YFaN$#Vz383)#JWA)|Ggn4)_@JxD zS!gh)p-X@}n(A0kyJzT67{@e`_eb0C=b(nR7vdiP$t?w-eG;&Z(fYKG*4dAFsgIL_ zpb-qm5T1;h4sErDXjf)~5bP5@1VH!+O@QQXgDvSdbAOHoF95w==ZYp4u+u-Z25{<7 zen5>i9kIZ%U3fM@0^K z1OTXAoC)GK)onVHKhoWJI`Mo(5966DUDn?L)^|i1P@48b!m~%$>Pj7>22b)QxzE>7 z2BqTtlqxZ^RzpdAp85y5Fj8}+=0bVxA?-%L?z#aEECYcQ295DsBJxCPIc()7# zI9v)en!>I$&(zLnCeNYec#0c{d8Vw>M)EC2vF+E9+zvMPi|o+cbdmGYGQB7t^CQX2 zL-X1X*r;2{hNSOI-$I?ItHNsbriOb z0UXZr-|>Dlq(V=m8G zxtfl2D?#m!=tzBxM*bW666BcTTsS5hK;jnqx9-A9vGKe^ZlO_d7ohesS*uY^0N{6? zs>>~ZNt)|U9!WdGQ)m*d)q;sw|H0?VzMjEtSr%UB&mfW>&F|oe-{fVopQ}SKxS!AB z{TzT7`der49MgpowRub|irWLaSF0#SS7U_ee|V*Fu=s=AAFYRGT8Iv!!Feg^|F8_; z7qnuE*d7#tZQrr|s0<+f9kL@F$fIei{X%L(Ap19MmUNV~7N|Jq!FZ=<<{Pcdsr7{{ zrX2hgh`N<*4G=T7fppXhHz^NJtT&H`zZzikVboAcz-958T9auQI0h3pGDZcOIyT z-p-4}qeu^>zwVG8$b1a%dJbDQoF6x613dlD5PnXPWpWP? zeLL=so24|?-_m8U;W6A7RzFOun@f-kT?U}|77sw{d={@nBQG9ptMYtQAR|SC>rVx> zgctC~u-FKflX1L|+iD)jbPoc?65C6b>P|VY*%RBquZ{$T1WP{Q2Y=T*!Cf?+7CP4Y47T%Tp6HPth51* zwm*ip50Mo-9jDs>jrz14N&KEN18j;(TnJddE3A4VpSHJYyJ?0-LIrs1GF%jp`Ef*w z%sL$nJrIWFth}VkIuL(zPgYY!iSTpzOS*D<=`9%Hg}a{`@FT{9f(Z5@1`t$-Eu5mk zAiVu&3uq%=DW_r8`*i@QZUtxz-2$+31yyMmJCGmBG1D0h(aw~NYd}=ih|fa79}hX$ zAZ=!U!hrhKwiU!0%xyqROOElW8)d6x#H-ih7>vqnrX9Efpxtw1d_9n(vhz*=QI91H zBHBo*!EyQ($iT~~A{qv}s1C)*RNVHDF~)yHSQKz!ef|ty@BrjBF`8eeBi>b!M0lzy za@|DeoE?Kk*(thBseK%0ArC3_wi9Hze1_9yF3cD+E-7H|pV%Cl z%o?5sQq5301VLR>;15{C3V*l-W9NUP)u>B);!N9VV`@Z`?JBu0No2TBL5(bJ*W=GX zlF;G4IJJjdHUq$_=J2anlqH*Fs*j=K_DxCwn$K^pvm8P*ARXn_k>-757E`DnmxEWC zf%g7WU(=rP^C$}sG~EFZZi6Lk^&J4-@=B*J@ssi6H!NN>P`(#d3cF4eUg1S-w_2tQ3$hLX^m zCL;=c#`)o~7g1+37el=nF}9KB!|fW*<l|(*}{k9hk(M@Qi7L+&aUTh8>PRnQo&7k!B94+A` z(gGRVXWS6k;VQw<+5q>EmfPBXlf6#a^$94zkNtj7LFQ6=tdfb)ZNQXc0R3eHeSHbV zP%GX|4w!r6Dk0IjA>8ca?8GdRzy$-sWzcTUc7pe7WRCeXbOaW^(5A6_K}^Yk$W&cdxt6qESI85Y32(Cx6-5Svm?T+s z7k+jVz}$WDelyc?WE!9IQry_d6c>!gy(p(^xI5xhInc=)IxHFm;5!rFS5Y^DXwnQ` zuruYAKAJ@jn;-1&rZ)239+0l|m9r+dra^815}P#AzB~=N`M2;VA4pF*kLF}@_f$H{ zLbR$T*x6X9hh=zN3rhxa*}f3E4cBaVb{JDY=`b|8pw{DieyfH2Shv#O@UAHlEt%6P zQ*C6g8MG0;?rmQR&5kpa2lu}}kDPZ0K-^OeFP4E_|N_J2xWLopkc*?*dK#3}2-on!@iQK57*+~^?I$B6?>26BS zIkh4eVWYQcfn29-^e?1B*>N8_Y9BoNeRcQ z2q1qC>X(b45EW%eOwizLq6MiCnrmgXH1hc2XsFKR(jWnkmxq#3H^6`7M^5}Ey$$;6 z2)~1Nn=_C#s4pNQGtqS3lMgpnWXFt$mj>@pXLV&o&!_wu;O> z9&u+Y{7g+fA$byWLcS6YIze-7LS50IpR2=>`xM4-%cAm}+9B7=s}bD1K^z4Q>OKJtUVMekBFyXcnaF5 zw@^(a!o!Z1k&=?X(P@a0OZS~QpEQ)RmiO{r9{ z{X>4gdzbfMEJInYCM9_b<9^sgCas!@hku{t zN7-JuS8r%-MAvMnX?G!WX{6g^8wjyucoBr66C|mjxf+eETa*(+R!`AA+JPozJ>-7GjqyWK>ge2sQ*oIWt`!Bd}=TAG0j8m~*ub&#WfwDoL5-b~Hl?N7>j^Bg$OAe`BC zbCJ(mNQUV@I*umU2za-Oe!E{qangnM1qqT_rV?lnk`m`}LNZ8BZml^vk@jOez>oeJ zEVncW9wm5_iP2*GM22!2J`cHGO6|wlrLX_Pk4LNjJ1P!a`AU*j7;KSd+Rb0LpCMD( z2#VBmUkCX_T0IN8UnXSbe@Y27+uoMx>hQB)msr2Zr^J04@4pGJW0dhzEV&sYpW}12 zBNfmX_-lyx^3o^bmN1MKva6>9%97maJ1-V_(}9N zo@61-!dM&xWa6rflNT%tY|GLQ>AnX{P`QG zfXd;OmdOgVqvI(Bs-I$9lNtjD*=mbwIV~pN!9%=+odENOST$sf=HaP9vzJpev-2)3O)iwQGRxR1xDTX3+qiDmj2CrSm^P za=+0eQ5C+zaE%HE$cQ;g*|{Yu{HgRuFivLU9v}3bXq~){0cO2X-R-0Mc9>+)oghg- zI>3Qu@&yp{`^lPwG_coC`Gu~NYur+Wc1j=LN+O`2Vgv!|iVx9NkF&Gw9XU)tN-o&v zQRJvtKTB6FmUuv<)>qPsrHrV{;*ei7_s#ezt)rU!CT>nA?FtgZMmqzf$G-f^ervMm zTUgLH4RS-^eq0y62&1xOv;K&?mRTBTUGB%VH7!3zjoU>^BC}dW3*kRr0YA#buj_Q= zV})gv7N+7_U9;*vpe=p8_Y+_hzd#~(ss5Y%H`eJc;flbS9-|I@=rP6}@`oD0BU(Xr zkWK=whI@p#DRq(2W`kXv#yEhhoQ$W)yRhSuT$(c@>#C;Ta)ZcVS*xq0fn6{cj?368=b06X##5cFS#(M=MVHtj4`|lsmm}_ zS*|edTTkKDGf-Z}(0H1GpZqajh0i!<1EA1FQ2+c6 z8rmDMo#GNvkfQMfx6l&xGR;>2-iAtrK^CEx@-GeNIM*7_;G&sK9|5hnD+TyBt}iF3 zQY0@T%rnq%76ZF!0sq~TUW*vKlj&MUN6-yf=Fzi5#*$mp;gbZMBwM*)CMWzV6}6!%oQJ^gZN}YQgPi0kD&Hu4X%BEe zpD`!0>91)h?BF-*q5Y@`@=>gA_xgD9V;9?nIv*9pO-hSwr8>^-mCcE<{4X(X;!RyoDfoT5 z!C4g)M@_+9^?PGYJ^X}$`Zlt32qkDDA{a=brifqS66rK7eTw`A^gRyt*^^@s<1*Xg z{3m?VBp@`UkZCQz+0VfcigQ49e=}cUMR3Mo4+KiDLu}GQ=j$R`t{aGSFD->&_qdeM zD_Ad)oqE~9{y9*Ss>nI_3j?d$P3PoGNuyJ7cT>;^MfzOUdR5&TyWsPm!YzWhiy#2z3Pjn`cMkq3SK*5089uE|K(}{AK?mFXlL8?R|BzpUYcu`||5d*xN!>3Ei~?&hRH7q{Db5 zpQJXxHaci2O^*6)z09DsY7p0kK#CEiKg017$ItNl`L-k%a*gE@>fNo}k(1kB;h$EZ za&84HUhChmlenJFMnJ5|1443#qm_duT_f(R1URkLr%$yXb8V;7x8g)--gm}z;0(_q1-fE$u!ZP zoJrr;0?0TM{0vk)3Gkj@`W?7cBWxl*StoAp4}+c86t@jxBCUlQv>7@H6*YUzBq|EL zW-PqjZrquX_78|Te~_x6(r(wQ@}UleNVqruO0ks9ji>RpoOunsqU@3h_5LJYOsVuV zL@SH!6=0Ty;QvY|&f-`p0h(NC#Q5uG4c|u$8$^G}>p-kJ0&S`1i|Z&vuwkfJlf`_Y zRWzqf8X~use&N?R2WLn;C)r}&#PY&L@*EQH+wujX?>Z)UkblBL$k3k282VV>({wRs zG-=4oeVOOm;Yk%{p%KW?dIF(bp?UE7A(#4}T0ev9#@j&toy?aoo;C@m|A=2mJLGbY zP{Wqg-td6~xT-GUp1M(6!s}tt6uk5(&V~^rTlpls`za8Um!UqHDL1*fO$!A1J1wd! zKyCgVPoo6JIb79cG!QvJenjUJk`}`(>Pg#ZM?M4DYZLmHrubRNAV&gGddihG#-{Vz zv@cDeBr2ZLN!o`hbATMQpJ;8=1nu~lErqzdKqb~5x$JAWul0dJT$1uUkz465WE41ac>clYjlQN0@mj!F z;a?(h~RL^&a7y+8j1lgp%t->51js75r@A64&Jktn#FvYM=OId=VX^ zDX5&sszXi`@NVRSU37$G=Fx6D?qe%_1sNcCG$Z&@8Wl61RfMdYYff|(`Y`plHKm5%d@1ipVML=(v<}1!`MIM`2#Nw#>ccS_isio~*4Cs} zG*g@N2I)v|bALp={B{p|8QZA}-$o`d9>cL_z}t_Y@_bPam}9aEmB`2Fe{BMym4Opw zvF3(tW}+LOxF1c|Sm^^#&>AOm#}3e0Akl9{-Zg-0qgV9kdfM;0o-Z9Wu3Unx5xT0jv`lFAroU z;&yT!kE*()J1viaF^r+Fqz48}l|U8n5f=g(KBvARnUL@OO*!!0X<%ntG3F{Qa`-_4 zkvUMGd(sJ5aAjn<2WS~GjP3ruG}TzWhA!$fDNhd(?*}5QO>v+a1IDREkH$PUVY?mR-L3xxc*yQA?_S8-Eq%_|YR zrb70~s6}@tbqzTu?o?(z0HMuZ#yNyp6Z-;7OvNpM@Ym2!QAu9s$y62f&R-Ztn+Fy& z2ff!H?WM3W;>=Izw@pG!&8JuVV!cPnG>t8SY`&I`!+?V0cn=c@A|7$#RWFW(lf5zbRuc9p!QbC@9UuWtainGb=dR?wVxtk`91$xV6(~or*Uhyr&$=fy# zJ{SY9fUNY;8Cr)6YfWj$Z=#zp)%V4Up5fYxJL>`}N4a@64TD$dhkERyv_jo{omOZu z)JwS&vtq31Q+Z4FQBK_8Rd^kT@jxEd*b!*XyXd-qkGQo0^22p93HbcKxEoD)r%w+& z@vN<^7iku!!rA4OBRU2=hw5Q^F3f2Ye~{^vEpe-kl+t(?@8gCoKrWU+7wbs6jfyrO z?7tHKX8ZbHoQg+iSHY?ej&O2L@Hcp_e^)IxLTt+{E9nG{aEZF#_SHlFL;hNZ<5m>l z){u<-L5<*b*K$67TU(gEQabzveVRBuu;g9Ec>GHA6P>Z z5L@@4yEfB4#QpC{jd6FE(@Pu2sr56OFXObhCcUM0L(KWWJeDJ7 zEC~T0ur1&(ZsXr13}mamt#fD%ym$(%H5?~PkU3}Ls}zxs;iV>0L%u07SVw!&BO0OS z)d4tt4&a)@!MK?LPj-}A!>gU7S-=u6@+~*Ur$&YN%umPYnLNnqUs5q$EV+>hrqHxf zSeB!vEU$BU6(W3pK4(|cRK$w^fNSkGkf8hdv=ieF|CT)bXAt#8crZWo8}uKUhSR`G z0pHIz)eibG2ety&;k;Y{?_iZrr0m)gIp zOz^w4w2Q5W8#NEPRnj`mg+P%$)mFgmN^t?s4N?6;>CI^{*rXgX($pC0iB-~i8Pe&M zvKUtSfTDDr$h<-6P3^PxT+(XBkZn@Bf(c!guYLSNbRIGeuFk zWabiF1bJ9ZWa%aFsqkEo^A6>&c|NVgxT?%J*_y0Uo%T=;$SK!BOfrN=VTA5($&8Gr zJ}}QjEvFb@DaGkqAoG(c2G2BN-;?#QqFCDqoxG1ZEzr7oQkSO%SM;TQ0{-J{{ef*uFd!!j)}Iw4bNn%$anr6iVh*H{RrS0r0R(yjp5A#oT6X#&_(Zuix9_E0fo`@1PiHece}D0Ks$b!W?v)qF zfELSmc$xb?mlOpCR}y}=4n`v_w^@)w*G7$#AVuJ}>QQ>{fkr=uEUzCm)tk07@|KPM zzH3XZ6>D(OmCOx{;$v9ReZeSk6R}BaP`4vziJGKE=^^F8xQjkMf{Y{?zoemZOB_VF zsq8h=UpC_2{Q{2~haSLSZom)luKLqx3@_X6e?d(&2burb@VwN)iisUQTckS8rUBZV zvY}$VgP}E_!9s^354;2aa0!E2CL@#DV0Xv|=$B2QX1XCVknYQMbSKuBUNj!oF#$cw zLwJS{$VnqPXtEXnishH71Ru4r8-}5<#c}}Gm!jRh-sNQ-~s_mI=>jOoUc?H0|Bi~(E){?B&foyha%;d9o2Aee!$@78&|9`CLSeCbRsqFuQ& z^7h>D%axFi^3;(xI$$O;=#c64v#}n*5__-6oG<^Pt z$nu`hbiDtZxDic}_l@B{WEt1AGo=>t@WEPN3fLIbbf3H%AL%<64QC0s2dP9QsQa;C?Q6ReMswE zUHMvy>06K(t^rT&HJV{>`puMue#dCoX|!7Y#Cp$lZn&1^+a?FU0YqslBEmORLbCW+ zxox{3%l?+c8R)_5ooi&u0aL`)y&(0^6=gYjGwiI4e&wZ*xm@ ztNx>-!3XGh9H2KPlQicpGy`?mRty@rLrW!_^u;*zOE#UW#(PmKF)mqSFXsI_@EsrYSsRK(o80;r~Kbv{eNjD%S3)n znCVJGd9)r{jEClHGtoW38nQj1gYM&E^fuH|zhRx+aV+4<;7*&(ky=4kSIzVe8k^4} zRfCz)a&`o?O-rEzEaq~$t7cEIKg{b=`|NJM>FS=EOOYDEGk4tl3%%s&;CMJXNQh)} z9iX~g6-+aWu>@>i&^|2XJ(Nq^p~RbPDq+DGlr3(y^N|8rA=VlT<=%@{cRvNW{k*V+ z=>+}OCQ}=VmXc81l!7v@i1pz~tXSL=%*LOoD`d);WbM<++y=-ki%tj^Py@P z0-f3ow=%#oy8s$RS17vF9ZA?_E(X5^P$k;eO>vtLjK)v&(2&hR{2u79H(2lLy6U#H z|1mgVCI-28Z^V+e7UmQcfcCPpDS|6Wkm9g~VKQb)Z!f*D?shit@U9$1Dk( z$o#OZVYd}}q@K2h{n9Nn+oEI4&t|TTnn%zajSY+YN2Xo0F!WRF!}0E$Xlb|4wRZ!6 z@^&=i%ue{H;&_TX!*-^R`O-nbYK++g1!7b8#H}-_#hJbC%jmn%w3P;@Yl-UyeQ0d( zQ&0@6MvgiI^=F!36rT6@(b2AN!q#9{P#A05c0%7(H2A_Ly1Dp?x5J7qg;^Fg{xAIc zI#hEr0~5Be)7-^`EjX=lcn>Cg5$3{^k3fl(0ng}4Fwe9JE{Z-*;x7PKeE+!UwxaO{+DHq;y8?gp245u|{ zg_Um-wsd{m)$n?xDQxiHAccM9x(C%GS%Q6TSnyvk%iRqpM6N@XSTXELSfvg{?yo){Mr7rr>9C>q zZG1w1W9?B_K;{Q`!X-G}#K2Js8WY|NTl-&wB6f>g<{~bSeB$bwlP0ZM>i)$|YUPjO z#EW>W9mh(~Hs-0Vfjd#aUGlknGps&r44a$h4(?9p9|jMwsD6^W>!-QrK{bpLK4zAN zp}o2smNQe_ukIuFe$c_?4sZGKW+W8Kvt1eYz&bjERj#ul^-Nvg-7xfTwcIQz z=QMcf280X4tU)?A&$NYwsEIXMO=x#P6CWv=ZElx6ITALmEsDvP9Rr0M;+z-DqYg&}N%%?iO^e zMg4hnbZ+_;>4=sY-^enc8!@1uawfKFnP=ptowWB+MDfe zkNGVyZUNSSo^`Q7Tu{(`WUfI=eIdF!xavyz&S5q@!FRD%^QXv?U_O+b@$Qfd-5Q+K zUuGhKz8?%SrOY|3buI38MGr=E`@v?i%LOl~LBTL$inzv+ z=|O$0Ks^~A!kXMH@N>|%V-0Cr_nCo49JRm$Qx1!7hr(BFHOr$@@jhSo;4GN^K?fRP zQUq~OXpRY^t{Jq{sonSHT{8|(p^q&Uw70$8DVNDNHwSRXkDy=wUAU@2Yb;VM2fp=# z@Mo6?dcEd$j5!g;hpSylo5R#F6DX&>AH87;x}oL?l#v(l^OKwTu5!31>}T7#M$t{t zz-6`}bOW;ybv|~ZT^_qMyzX|w4m&^{m=+6B`ne|!ibvPM>xQmCu+NOL1?^a<5ofu5 zyHWcGW&9ZU!JZ~9#;YB4SeFMK zDrT2HqAz$3dMgdl`^~Fcd~4p$bey*wLxZP*}(QkN*pRPk> zC2-f2+J+O5A&=xr=)irTEfPP~B2tN0@N#q&OL6){3^)YR830k6>0i-08fE)yab)8? zIK;XhiyCXMR0I?7a~{V9bPB&uLv#W3J&k2PDzA0;?xWzl&sQv=qdwdT7~(IIm!W2$ zm$bqq$4?!h&&&(iE}n1Tlg~E40{s{vbI^n9!5M+Vt)hR>37(|eq>_FMl)f8J0opqN zU4!8`)8%>*<7j{5`~IcG0+Sd4)<_cW9aT0pA+nVK&<`G#PypRI~I zeKNXa#lQ_{E%$Yu=1R=0=lo7B$kXH}U>z&aza52+_jG>E-9V>qh2{e$`m=7cQCx15~-~=(7D?TcU@(NowM?YN6_Hjh=ckJtM98H;Lo2Kxh`xd>W~x1(+eaSuN2Q zO{qCF07g~_HApYiyHygCX$j4sZGkFc$!B68bPh-9O74xt4*5_1 zE;z|wJ1WEEOWcC9zOc3g z>YB~|NHMerwQU=H1SIKQ+6Qh+ZXU>=+Wqz>>i;)^=@hrK!EFh^EO-uG#xdY(=Yadp z*7`gK{f_pq`<;@X{s0Dc+LzHI=%^i*f?A&H>Bo`=J=3owBaM^(+77Il3N{v_y)uK- z^NVk-%S}FBglE~1Zo*0?NFJQs9#oK@(M0@)v8HxZ+%B=rVM#e~K%@tD_=-^yR1joEM zPO2Z+W^eIuAY#?g%{c(vZVi~OKg&p1(N=d8ywWoA6?AY(9JpSG zzmf`g-Z$YX3UFy&06b&~G=MdMpGGAee8@6W0_Rs9_oB5HlhIm%pUQSu2gfQ;_EZ> zOFF^16UzYODhK7~0J)9u4*p}YUZC~*yEKgHr#CdW=7Jg_C-B6KU>>E^ zE&PT;t)AE<#`8K}qW5GV{yrYwTQTHnpf1HgtgKufh<`UA8hL>}Ke7{~j5gLKsM$Ml z3SMqbgDoENKlW!Cuj};*P^Eh44fTdsxdBb~SKvf^XdClmtiriKCt>3q^}MEy>C9`j zt*i%5SCvn21EAP9uqr&SU8au_(d6Bi2h?ookP>Gc&Iwm3d=Pu=SUolr=m2QKjcGvRGLT$c>n1#1LODR z;zVl#fq2N(;Flk9A*ge`45n=uu9b{W@=u!2VgVR#bYp%7mck_5fLF}GzGvXOVljMj zrC#9DKuKq5J)Bv2EeTsF&%<>Pr_}n1t$~;=;*M^J=8IYB-nRF3wN}8pp3A4@H+031 z$~oY$pXxAlN+-(*EfkY4COvHIGS}o?zAoiT?1^sp2tCV3coyPJA^!?EeTl?lKs-nA zLTStE!Kg}>I92<_R7~8?c{OC>iZSPXCB%_Ez$N1~4R{p;=^p<5S(3@ux{>m8dM&{P zOb?v#=URzBqPy-oP|=a##if@9#!?wzu}!HM{b5(jUf_36rK+q5G63CK0FPD#ekwhe z!Yl6ccd+sgd#U z3abeY*+oL03zwB{e69cfoj5 zTN-`O-m-)50h5~rEK}uR*nl$gG5D+%$R*YRyN_UEL;>9l&D005(KS#vJfZgxFQ4gj z-9#06r|$I1+v!($;}qz^WYh2EnvB74z%jT*1^5;HtrL9a#I@+4B##-6$W;RIzf)p9 z?g8ZbKA!jrjQGv1oe_nSp)ZylKjn^&fu^hpVpd|LCl=-AN0gmJd8sgdO^4{Y2bsaA zyhuCy5&DaNh<-;FC6sm5s5bP)OTcVOk54ri9o4yX-zS52G8`k#fWF6TCQ1vd zylL-X^#4eF*Lk`gq95rn>p*{^;$RE4MIP7-cWNO#Z%3U$?}NXQRerVQk$-$DcjXqX z|9>55WCcX-6x@LV`Uw4tdFWK*WWXML zLLW;P{f?^wgS-QDd;#_48Tu`S(j58H+x#C8)noLr7UiF4eK-QcZ5wD+ZJ=xXXzh$l zr>~rF|4>$a3AM#RWV@-gGMB;MS5b5q0; z;698;7iEr=ld2f?mql0m>}+L{Bm!aG>9f!iuwxGUQBaYj^H*dj1|v7NgjcGBNQ%CX zoh7kSfaB0HVM-2u^(OgFFJn;PP#%F(I3*diEWGYqc*n9FNK2iHeq=HI7tH6v=#=cl z!pPi|frrATHwWp#>zNG&UBIL57P3IZ-$cbZMlvD3q>|f|T@O(Q1<%qhrwj%|=h5An zMG3mjhZvtx449k=Ja?Hp#J=Tw`%2RraGY`lQv z(;Il*zPy0iA?xakv%f8mqz%77ueGR-lhPQ%zsRScx)=gq514c_OY53$Ae*m-Uf4Ct$3|1dSUSZ>r0hB-&A}z(r0~sf`r8v6h_oWrAJU?z$ zeSC&H;A2F130QJR@TZ+*A@~ucq!BX5F`NcS@>UE$Z>n20oqY~J(;i-AXmqfzhkP_v zt^j$*5MX{HMSW&1&9mu+{4es}E841Z>DnddoROp?l_VLJHOHu$2q=go6)}LKsGx|V zf`}q4a?Uw}lA{O`)*Pd1f`A~PNKgb3L{SkVX59YI`ftv;Jol&Vw!i%~Sj;uYJKn15 z)vH%kneZ0k<|XQ@wKcEQwHCU_X3BK*JFlW49H{?DSy0zuscq~0hxm0F0EQd@|9v!k z1)a_c?-jhwe49+vU!QV63&>4=3w5|U49jon!>Ek?X_=@WCdli0kN3y(7uISz$X_7i z$m12_cKWL3^5MRNicTAUmpW7%Jo{uFZbP)Il+w*~yZvAlVb1T2y7^N+&)c!??Ir8t zpTURM(A)ifY3-xs6Y_x3VL||Gis@t`XCn6!*A60sJ^bE^R_k-X@wk)TcVsf zAhq!5qjhwIh7RxcoqdOnuMRoS7sR_f_`#M|&~tfX8z|HLJ9#4h#)f(En5CA~8SA6| zs_1X(g0MXmjehu~x9G>Z%CKEVJ?e13-M49rUjHXs0io^bb}5^_8Xp5cOu+lK4j<+Q4AP>>b73v?jcuYDR#O`K zVCEO(KOgI1?wJ#FP@{As_iGnnFB^aPk{ zJeEI&ipf%KU|r;9ven7q2zgrW_py>w@75-u`3yY32QrVW;5Vw6U}%9@^dyJG()kX0hYeFQTcPd_LC4G{OuuD=!cYv4cSuP*N==itodg@sRxm~+aD|~Hl zvT~sgcw`zGd@_7b%is%2FdLw8I6CVNzR8H_z4$9866TXPd0VIDUaD~mqOIXUnGh|C z2gqoZJyCC0(Pe_EfY++3piu@Pquysw19)tnt2cpPDKc#lXt<&UPebcFI?-7;aykCvsAAc#w^dEochc9hefm?YL64v zKig zSYX3t6PRT$8E3ojq41iFWOdlgnW)sp(g#B2Pg3p;AOo za+`jSr$_Z=h`r?RqvRMNza*M^Rc+52wrw_yH(3(Q62@21%Z!S@Wa#ySpu&||e{!?l z#jCy~(`;_|MLYtv!h^(+p`Nx0;VfH=r@GZ2mVEqFLC-C1EQ37m05#a_^+;HXyUdz( zs;S#p=X+7c$#^34F*=aZq~h7>w~X(Q*ec29tb%xl;zrEJ8=eh^`*S)&s>*Ni1<7Ge z`A<*Fpy%KLaN-**u-?UOc}Oz{(P zZb*H+v423Genpz;kKrZWdoN$$bYaU#@+W3NfO;7e?B)D5+XbTg02>XxyN}~H7NOew zC-%4xt;1n2r9KF(nwJOf zp%yjPJ=?@!V^m5byvmJwkDaphs7Q8!M;|6;rmQ6O<3hgH2J@5`{J@9OWnHIX8?w-QYPEO$;)~5Xu7L^(D z9`Uxdvh0$3^_5IO&-;Wmmn`W64mcO>wcvKnq1zc@N-Q17B#M5vb9WwocO^yRt5vb{oL)fc2CSy?o3qigWr9ie`d7gK z`7x|6If9CK>|(mq%W&Rhr2%?}HX!r4Yq3Jv`f|unr2m*;3!PH(1Ja z!OG})n~SoctC!#eS>WacP)=-+5whOih-OA5h}UCLoIT0k_eHBW!83hrJS}J&o`k=9 zkXzG2J7WVEz=Zc|6?*Vb$wjdAEzIj`0m3Z=7U>VBD=M?%Us3Ac1JUa-Cna z2fVn?iw@$g#^G%j;uEWYU%vzKFo-)Wqov^#=#Ta)`jCx4hg8az>Nr@hV|er7+Qv#r z3n>YXOvBUMK@ZDjc-o7oOmC&DY#c-W3;8{;Sqq3UjZvZHAbNfkOtfFQfA{mO^MelD zg?V-w9FdLhmsoDC=dV~zuk2erKOILe+fw+v-JIWOyxv&Jp4s+>Ux@2-SE|CGeB6c1>fD|eRVsC!T8M= z6h(}U=Jr+h7j!y2SWT3wPg^$|=e=R;Ho-X8f>U3})T$iPmSx@ru&KQa)bERWYMFm) zZ`mVug9pACT>2c}`BlB!m!XH8AAim*Z^z9YAuYmYXvNlP0Th@ITPb+sD!v3d-|jDR8&|<;Z^2(I3(Ll(yrE?H0ecxmctsRV z3$#6|p7L&%5#^R&$bfc+tw6}1p`h9+&+AotB`m5B$oTj#l-Qq!tHRG=CT{hCvR$q) znQ27$UB)Wj`TZzFJAg%=#0L+B6F96N$jjD1+p?T_wqA?p=x7+BUqK9a=tlb_%%neh z9cs0TWTRkelz(qo0X<7jScuzI-iOHGXskWuyNPp)btiwai^$VP9+5d#LYitPKPT^i z$9kcO>5>>vY#(jEOZIAtGMwsFo5G3wDXfKozoF|=p7E#X6)%pyri>(|0XOAQe@pA> zYS7MXZ^|9oY8~}E$?ZyhwwN2aNXn;XlWz{?vzq%LV!?OhMCD?9osZT7QXBtp6A}6c zbl?NSbN~1Ev$!@aD4E=1R`tLaF2R<|_?g5ot4mf}Q*--|VQc%*E~+`fwp;DK)F6Ld z-jV}xQ8>j4dMF;MGqnUv&>_j?cjJrps*;(khEwk-j|t0+^kcgbpE_DLN>BgKDw)e4 z;h3ziY?(C(s_KZSIi7y3yvDjwlaj=yZkoONrI_ZzLV9W`Vsv3Gz<0=2f$y@7Jmp9t z;=TGw)&*HA_u7l{uq=|{uwHrP1smqW;MRtNZv(y8pR~h%F}v=ju{=aJH46Ty8Q5+M z6{hQWD>vvA7^vF86y&2k6GY`t8P z-L_tO+EPAoL~w`Ci*M(*Ju4IK{g{YM?p;4L)cpHFiGRh@?MwO*R@yE}Q?q%8C%a^3 zm+eDNDpPZEDrj<1HNGm#bsrkHquj`ji8t_}SD3{zRqoPq#N4x~R8$(AKPxV;`x5(^ zjZss#g5>_TX|gaLMQ(YAjnNmlgLpS>&h)1L>_htq#I|3SlYQhvF}4(s*p=H^h(5i` zo(mNIt>yDft1ji`UOaIJ7;we=j?&oj5XDcS{~K%vrAg4lH;Cx{y2V~3k4fugZe>e7 zR^ zhmyU%dYNTPX8bEBHrtEpgSrYl+|Zum1pbIGljF6q7GW;W4Zb)-uE!jLs4G0kB_jL? zDWe-weZ2;F^JOjNo$Vcb)>zL85_!m`kb_wGdt8JW0v)uI>}L(nJ;eQSpp}HDr4hGo zW;n-(X)Ek#BA)W>$*lucAE4(kv;p?_0SmvvB8ktBL zeq(lr-3DQHD*rui)p(1A$R5uTHSdseM3fcMk}mOoV2L;I*>CB7o_{S7@Ns=u+sjGs zr$h9qY|aff?-((54OaPIynx*O5`8Mq>1&=B)b#`%ba#7wu*Eo3#C_xu@8~(T6Bz_6 zV*EEMElPJFQ9RgbyYZ$athg@3pEkq4v2JGb@*xdqs z+)Ma{L`%PtIt&XiU3&1Ze$&6?D*mglJ%UZWFNN$?JeGPf?*vQInnknA)CXlB zPh7}b6D5T^&5~o{*Mt7MtPI|^8sJzaKG?r9I_o8WQ{LgNP4hP1FFO+;Q=UQYMYRo{ z<9Xs)hF>7Bs;GaGISkMx;BLC2Sx@u_mC&!GmJgRd5~>r(P%fw5*28cxL#anS20m;Z zR`W9a>jyOOBK$-jdBGcoBSP{{|1@soJL6+vH7yfelk);Uto_sVe4(wPm%N`u^0(Za z?kWAWsczAin1ylx&h4<~k)Ohs^dD&v{7Ce@Y{$Xx?V~v`WWU=CPPMYWC;!MsW>Q?o zY>-`g2yeZ(<^SRz!%h06vrv+#kq#ShD{qHWXb;r^XUx=*J|FBk1>`)!8~ZHSv(dqS)>6j!v-IN@fmb;%=fflRTAcLv;)C*muI0O)h4E%`jNNJ1$bxDL)p;3+uI3m1q=c2V zh4#JF(pk(7*h@u4^+E3D|EM`{jJL(CER27l8nICRWR_fMDwXs7Fs#8+`6FJe-%Ib{ zZE~twKF5BueR8|CC6^3f3NumV+z8WLn>Bm^o@TB$2tP`!4Gu~kc&h_M^49*ly-9b# zXj_fa{SdX->i)j`#!X=Ua=a2tJSRJChuo4{BumNSgvhXv8~KtY)ImV>%=7ur%g*>~ zogBBdhFaJIYelxV);h})qR}gMr-sC_I6i`P_N1oqTF_d~!d)*2bNWMqQi+<}XzPb2 zsT#G40-l@YXOM5I?i_ZNm~Y*C~Q5n zhJO^lq6dNxxY3hk6Zfj8#(qpMg-1~C{6K#93I6a6rpr(EchPdeU4wX!p?S&S2fBX~Nndn@ksOn;D57+{}RPHRO($$=l5OqXkM9i3zmAGu3Kc&lo@JSG~E^;Gf+ ze#N?`#an~hbEhY0ho}H=<6GJ86Kp3wzoVZe2RR>p5BCD6;f)*|-DktUZ8Evux4I}Cjd!1@%RxS^e7np9&#d(9g;J+s3W|oCi9MS&(<=K4yJ#i2 zHD$H5?1M9U*4`5FFPM6EiL7rMC%zj_jY-0witJh9o0GaWXF_-rn5=TtH}CRUdWSEv zC#(Vp2i3+6F%C}7}qT6392LIq!HEG>+rU}ka<^;PcR1R+xoGPD`z z^SssfZI+vk_c(qLPq-8gV}mg7Lq4;OE!W25Z7}hAxPBf^khW5r$Z$5w?$9g)$DYeJ zhqr4&k5MC=W6kvqR(`JyS6Uyi)_E4eF`+luWhrY&#_)^Ow@>UmK&R#}_PSOL%F3To zk0|+poU}=n)Mj`DSS-I;^U9N6Ft{S){bKNp*4A7;BV3Pfz9PB(N&ipg+U&TSJ}Upo zXMQZ+Oqcac`hEV8Ucn90#%|R~^t%s6gGu*0J(ZuzN~!1X@A@}-kIZ#HY~TjFP9ui(r3NfOlH;rs9btK-t3 z^hxpRc!&)ny6xvaOqJ*KE-6g>Oxr0Gj7-18zVe6Pf%liel|2mxe_YN;4qYQPsq<`- z2JukK8?TXd@)qZ?(>~*_7Sv*T#+n9jEJQU4TUl4R%$XboJ9G{waVIaJK57S_nJFnN z4+k=z>g9zvF9`mB^pihL)o-ztkue$fQD1IEX8dW8-$z+vP5P(It{NqYXdLJA9scJQ zdzeMynbFa>hJG1m#(DKVc^uorcVYEEg;~tV{XH(})wQBz?=&c2rL?Hj;%5(h3admj$nDN@M-TC4f5rcx8s!~@=mE}QYs_~>DK|t0 zSw#@#8k0QxL79vNoMIkYm#9*57V4l%nzSh_ zs4i~XY>E8{x;-BLhR42@`Gl>&I;+XlN@)fPz4E>-eiI}(D*l@YpOYMEy$yw*ZEatN zKhqbU3N!Ug+!Jfbih70J;kRG%cR(x$B}3-=tne%oB#+1uSry(Mor*sLHGRT2&!xA> zD*pE~*>CUKBHm#>a*vyAj4zW1G`Bt&!5I+;>R`76K%2*Jh^tbVBi>;R4>tiL$i!o>B zL#qaAH2)7S;(DE@Xe0eC-OicU_v4m_Ia&Y60qY-U30yNd)xAuqYGn)2nY9gPa-Ua{ z`S#amQxl12&x7^PP^bS%4uqYhntdFxv>N<&oA%&7-|9EX6`Ka4KSM^kI2s4@P%g+V z%l(n~j1IQ_{+Lb0Q+M**+^(N>I6c_s>1=%-&wd{@jTa?*7BhXpah{O%?vg(%n^hgC z6ToN}qwFbJwd3m6#FsNGC?|2~LCc%GgDQ9{ZsN<{Sf8`cqNcJ~I$Ay-!_JHCSVhU? zLcd9Wk9T3=`85ZY@p|xydRQ>?p~W@E6KdaEoV?_TR?sRmr-HXX8k z@u7IOUJT!6kIf6(#y=qXtfr&%qd14>N0-)v39PSMe(>xFFe?lcpU~6JNS6E%d`5l0 zuQk(;jQ$<&e?>crpBqbW>~p;9#fBCPHhGdX*LOe%e}>b;&Nd>rUk^sFhb*y`!`3ux ztRIHu@PW7L5xI+1qg2p+oGc0!<69?Eqw0yJ_XEjxwX1L(zj3e}1E4R&jC z87%y0`HHy3toTtgyUhIm)1JxfF33hLnl=9awrBGH`RV^x&!h)$rfSD4*gQAcM$?P8 zCbclAohlq3%UTqC6C{~Zv^5wSG>Z=~ZN4*I7pbU5TqK?tT}`znN|vHy=A%I3$%!03 zE>R);IB`6&o(>gew**nDO}vF2ZPQt~yeF8S`Y|dLEQrU4CD@U5ASgly(17@OM(bci z@NhuCM@F~k5B_v$FgM6dNc>mSG)xCM;tV=Xx@Q%SFGO!8`b5WrC*!tR^TN$R-uPH> zl8(1Z(X^;$B6svU%-+1{sc3Y@UEyPiucG-Ge}|vZS$H61D`DbDq8#&*Ka84$!&CQ! zwWH%1pGP|q-(-ClydHj=m>4vSPb7*&-vt(yrW@u^)I7dIzfR%A61L3M4(i0^vMQq) z`IdgNz{&5op4QXBA%3}n>ruWj(-m-hhuCcXRJyfXi_xo- z!9I)yVV>y4P}ve#B5oN@qCe?Qwn<*eDv+@_C=)!K@aVDN_tXdMBI_IH3J*tdbX({_ z-}v{`7i?6ltv$o1!UECUuuo}XV9jR?lk|2c*U zG>=B*qLNVuRBm_D-?lcjI2sl$k4`5(lETrsRCV4$FLn%;3Kj=t!%>Nc;_a!~8SDAE z%BiwZ`>bBU-QiQgH__6daMp%sYmnX7S~h+%qkC$5kRx?D@pWP)Z~SO5H_8>akH$w| zMHPelqWw{!_yWC16~n`9h`Tjtp6V4G&pOY$y+XHA6nq;kj0%NU5>Ew_Qe)^_+Rld4 zebLmQEIpi6!@pD2!!qIcsD2ovZV$G!d@y<=<9O60SRY*qM)3LP5V{Q$8`FX{bXolsTu-Oq_3ZF_DN!cXD3uHb(8D+|xGVTF*iSELPG*^(pa<}? z)YmOX1f#=#!PclRR<(hjI7!#sD|R}1pZ?=pqKBefQNGlyRAx{)in9vFztH1Xh%?B+ zXLpFUWHe&;<})q7%h-^0Id~|sB5P_?n|{Q@iKbZD+{B$xl_*!%Z_z)gt5LJ~U@$eK z7$^H{;?cNATm!2;oj9G^Lg#Qs)?bNx!aP}vql3H6+6R*o3lf#XSGgw-#+`$T@u=v| zU~jO44&6uMV%)U?yH=&1&ls3sS4G$^*q)V(sSk4!<+-b)qrp-AtQujZgoIOr0!$m} z8r>T|7k-h*7e1d=KAyq3C9U=DF{!=5+Qfxu06o(iqYqP6q8%CEB)Ud1-yHuP=AdKm zG<#+@CdOp#3zpztb_Wd;(re7>z)MaeKTmYLW^Q zw`H}W-vc^XZQEfQM#*#U@JwUa~ba?PDO7#{ZCV4v6&8u(owHyWKb!!I%rKF zaMid7e&XN6ZT5NA#He@hMf7}7JbpB_AZo#8$mNj+#iHi)@Yae}vf;O4^l&&TYRZj! zF}M)r3R}~SKAH~Jw!sWJm^u&)PV@=)L|xcSxhM4&z036z=b~G9`#<654kiB17_$3n zM!(?C)QPOwQMRvsE|Ew)6wOOjN$m)XPVo`J>EPzXpNZAc15ttawrEnScyKY8xO)q~ zX-zad`Zumf&*Xb_8Lx~is2hHmC>nQ6)e6=na^sh_M_Z|Mm0|;FMzk|<`eJ)V^RjLV z&IJ1sTQj~$8Sjr<>BblsDE@_>hqv=%Sl+(uEeH{CW(`D zM{iDL#COx#TRzy4x+9v9N=LT^&Eoy3PEi|r8(RnavsOi=r8NGfKzKYV73U5MaqIRZ zGTD)NSE@SQslCI#C`euoO7my;MYC*t)_OXavw~JxEfX1Z!zbxz+z>6#Djj#-{aKI) ze~}UYNzd^YsVk{r>~oz!XJ&(FcyPMqGr@$YcbF&G92`kKLN9dh-8sW2!|&+p?wQCH zj7oINXqZ@p*Bg}e1vmFkwkap$0m0H>TcSpsKYB0d72OoRk~$tNXXkM4pmFM2M$P!K zRBJYyX5usFXU)sFi|+f=Sy|DU#F~uzqJr`LsTYG)^p>Y#ls?y9@c_S!>S~0%CLh5& zI{f-qXeiS5c)*>IuVp;B)5owr3%wgm#zwfRA->DHgk|9n=4b<*n_d+5@flWFJIDq< zf@)^~9hi5)U5)hJOav_ttK0nl=2{K?4(c#tq$!(Pidt>{?4PietcAC|RnOVFV3XbE zg?)%z^FC;VGRPKQMN2s~98YG&G%9w$v6YQ%ptyW$kK0icOwXacSS)j>a<1?d`ndL% z=3#x^1GD~*EP%~u;rFJGz)cT_FAjBgSe%+|6Oeapuk8u#2-Yr5Rku9s*P$3rHvWa3 zLx-&;N}JF}%HLr#yUwPC&B>V3RuhIMvOV$%yy9ZGhcBsd_X=Osmez#qXSqM-$Ad{; zSm)?7D587Nk@C4MAQOjGv{Uk3Scab~Xgl;Na@-y|%>H8@?O;D7t>I_OlB;YAw##^_ zBWal9E>c}P+e{sVqGqC0^IOqkbhGKw5oV-{ZSs6%uD`Jn>=@a{55WX9kN0XjvdVGj zHrAlB_=itwn7%813aovTH}fo+ZM9`2Z1`Yf+8>+Fj!1W{=?me-u2QXijfug7q;&En zGUfSNCcT`k8zJo7RqLf=(!G+OhZo=jB-t%FgWJ%QtZgxM!Kc$-N|v6IHXhkEI=BAv z>yj>&VCwRwk9bS#oi3Bkqd%m6)#Wmpxn1>>-%C|rphtBX6_aPu)6&-`Z%y}17SmYg z!@$kfB>(ob{Q+Cm%qph`Nm=hNN4&qn*`jQ{LJ!Dv$(tTYZRYXtJasHh*YLaTaF~m1 zBrCa@EbR*S<}n=#`&Ta6n+$BCze?xOY5!QeX|CjxKFF7AZ+O1^IzKsD>m;w~oyp7I zCi$^1N9FR54PydR+H1iWoreK?!Yaado$+&2<#HsC`mahCR=Q}ip^r+>)daeMI@*}K z-^gnxSJ*PY!K>PO{gB$@jmZrj>t1s3yCmeM&G41<<8}2FeCmI4Te48Pu0Eved<5#z zd`b4Lg*DS_w1kvS-;})Ox9V6vOSQN^3|Ch;b~NqU37$A zv={6rdnT^z{}Yu$*u_jL0_*gB>2KfLW?NvzQ8<1PWWvPsppLURK4uC3HGWNtFt@t0 zJSi1)VRXAq)c$Z}!@|DtzOW;G6MxGtSgh&PvS(%0w^!o3s2t7;1^+{==OKc-N z*E8N+ns^0o6@5h9`Lq|Is`;r;*H-EwX`1)2?tj zH|lNq*FV&IwS4*xJx`~})7<#H=`7!<8@vE^P(IxnMrKJ=*H?1KJ5eS7#dG->DV!Xk zyLE~eq0aK5-YwImHv25c_&Oip&69bO-F2>~v~>FS-~q1)d$GaVlPmZ3t8@+2_A*oo zhEw@CVd=yqU#C6gdmrKBtY*4_zh(K-@9CiANhTc+)w=qv4}(b>stb9BLCkJ0?H|}l zJBu>oX{MFsPyeic>JM5(3nlx=40%W%gE?FV(_SK(H#yrX>Xh```jAyiw@aU9hG1Kp z=dIH1(>uM5yeqf*PJDV-S(e^q=llnMm;Rb9cEX#d^Q9-qhrZw6;dCn`v-EGg^bNX( z3f59v>~-y9KL(HdhnLp|=`Fe{ERnv;uS>6xg;Z_Qu=;6j?#28gX{sgC7w`nxdVtGR z8%yAIZn8$UG5ml!PiO1q!;)KMmKRR%iC@CY?UYGcPI76x^uu=A$5Vx-s^tYyeRWI@ zLkC)>)fwg~meDu0s%=Iqo*{?5SaL%4d*FQ?)9d_Czifk(W$~|5^`F!Oy4x2d{t8pc zwOW$f@G!NjR{pv+(#5t+Z%%L5O6he}92&*v@y=_~Idmhe>N&mUnO;GcC%d2rVD_Zv zOkdKuR!#opq%+Y9j7ewui)i4g$s?X$FXGRbSPZiX%Vj^`zR?HC=&N z(pNV|tF$U_R`;v$gWuU6UEr&HqkJkKQx7W++g}i^L_i(( zaqQ$zY7#RwkN=H_eVkg<8EqRsPnGNe^iNw+!=|ZhRE6VPA3rRkeK_;|)A8tViO$t? z?Bp4sSwz@N*i|KL=pkQ7O=q$fPQIu0(i7li`*|CB#!BMd*{6$YW0nkbrliYAZABHn ziQT6c;L=9Yv2V*#K$_U&ghujUjTGzkQy!cMJUG!?s&L#O~+VKwZI`Xrp`NZY>DINgo3d z?*{9ref=|OrTbw(3-eCL2Up|qR33if)0)HPw%{CV>-C9}UJk{`i#`EfbD_Lvw-Nh> z8S}>FN9*KMtxS?WVc!Hd+eO#goBB<5ZG)446@6wa`$)F%|Bv@qWi7Sro%9esHRqAnjpRya-*3-b|v5}{i_6xqXVe!6b61zXH^G}#; zJ=F^PM%#m?BB!sF4dnK4?$NulO|s`zR8q(Ce1)L)9_mj&^=7`QZB@@1@sOqm8Cj{&05>EPq& zT}IPMiB1e9OCxXV8)OENmfZrNyuWRnUSbdK^;$uHvkg&xJub}c10`OvT;Xo&hh?;v z#x{Vno`Lr-XOH+Fc8^x`?77|V`-iBi?xhNUxBVrL+i&(gRg!ISz^(gN?$<%+fExO0 zy*JFMOVI3G@4K7{96AVfOf#7zCuJ{a;eBhRtI^IejX3-jt=e{UjMu?mX6Vc8`zmEC zqS&6H8Wi};{M}LTV>h4b%TsmHbG@c`mi0}<@w2gjX_i>ib`!v~xN0@1Yv6@X--wrs`8=X0m%=Rs&ZG$JM zV4ji+zBQ=ol|5TCyP7llDwqSpUCdnG8AR;rdPxSyBk`W!$P%xo6OGM3L3ekiA)>pI9_Y@{A9JN8(Fs`bH zq=yvH&*kUfN4r~V#FK26oR_&&7BVx+^1F&_FH~D)iGOG9Bi~~mgxA{=E5^C3w{!6c z+ZE3I>96?O z@-|p!>jFGi8Mf%1lUu3L9iqO=jqH$u%oltc z&3ircBe|(+S4J&1HT;6=&Mmr?J#CM3Lza+N+@j;XiEZKUKadi73-!CH-UYSQ6_DsU z*=EJ`a+FVpcvG1x)j$RtqL;y0D^c}!(f@3Y7MDJD%4!JQcw8vmiHLibcheW_h~BBE zxMO!o5g#j4!WO>4DoF`E#jU!{>eJ2gg+IZ&5T9#%C1B7N{1%h-+eg|r46mte!!b^5urkX`<)97o5{EgWu4ptc=R2W#n*?P2er zb7dT}UD|Q88sLGeG0*HIzHCTv7pHTpclT=E%SvGDrz{gY$t4O78UoU4?fZ@XYMIZz zs|wyXY?=&YM>I_8+wZd1?*zx+PJBAWJzJaFiHht)8zgu5X#JV@{ILEYw`)^N^o5&;s$m?4`sJIOavK8#Q798*&!;F`=mMEEw7K3O;n6Ja_bv1 z`Qu6AP6u^jM}J~UCU2-Yx3(R%>ffUL=yR$`11W0#$)M9z5#Oc)^niB_r(ruU(66RsVTyDqYG0l_yMFYKv#r|v)KoEVwV~$QO-fi6k#uQTT1QGjva?&Gv#n`?+u zr6`D~5pnV`ofGwl86{EO{t_RxFXa=Vk_~39rvIkkHi));nPX7Hj=})UlwEO?pcOg$ z5F5$e%+#gmH8wdiN1m=;HmsysQCOQUH zZa&=w+G;EB;0K$5$7)$uHKIjnbGBr@&a)TA9w+&Drr>9V_sY%0+aKfIA+uWaMbDmt zJ{N3|%Wji>c9`$8Rp&@gB63e{=2gg@-%TtH+h_^DMKc^_hs;5x^N-hLW8>T87bQSm zxzY>#K^v_GcFOSD-c!2}xBi4{>K-SlV|N3&6ecq74Tl7YyJ2~jkSA?}ZP{QQY$tt(r|_@K zWLj7flv_X|e2E*{}gYjMyq>`Va+h(tH zvIS^>K4YFvSMMP+Wu%uRPZ{Um#5H^~h^et(&wcrxIUA)>!lpo{ov`aU)X=NRP>WMt zQO4)@6-0)5al`OGW*b+qDtcPx`TI7|vnL82lw$gY6;I_PUwA|h*(Ma7d-aL%6{ie}P6z;GZh`ar;ruq9^EvH#jNviG{{YcXlV~Zo6!ww6?w~W6-ZoN6pLr4h?K} zz%+ZEVeEgh$<`;>qcy;PO!BsiVKp5mo3Zz=<8SGnyNyhK6dvIdyzF*tJ+@}rT+5(B z`&$N}jJTEC`mL1GXFv?!QKK$q*T4r|>^ZOOHT4NB=Q%GUlf!QkwPb;m@;NXY^fZ%0 z-U9+$6h0E>wvX*+CLqP(Y9Ftk#O-Bgd<**=mZGuSYD;7ty-ge9esl(BTA-u7XRz6R zv4`RS<<@^p@V*N)(%y>WJEy^)EtDDhP}GJF(NDu+cEs|*M`dpaY;WcDzj(V9l@n4D zqjd?~$+LiS}-)qUJ_v^PCS8y7IvP z*ZB8!;k!D=H}jq+$ab4=hh!hvY8WcB6p>*`d<2EkOcI%qZ4`Xf`r9uNOxCU$3k9qhJEx`(suAhF?k{fJpctK?^UJ?v3pBXmBTt48FC)jxD<3*&6-tSHHQ7;ES)tl#QNk&)` zztC6)qBGlJV`Q|KBmXTY^U>e51V{Fkp?)Ul%)88ceaM!Tgpm@xUSasmDa$n$nJQt6$#rC^IFQtpeFJ4eSSkJeFUCkuKtfxs*euj zOaDm6$K}(P?F3$JBe5qFJ=`8!$jMCd_rQl8$?Pg?K^ZIEb+`=hf&P22g`DOl9l?#R zW=ZJ={=CFf?7<$-fDm?D1ug3{(6Zd76}?Nams>E$YU9y|`k(N;ZOHuIvjRk-vWXe8 zz?=CdDUj^sA0&=RAGwZ6Aywrb8Ltg>xOLMyo+pjn5DU6l_Kv02x&jrJX{f!ww}9>%TZfTz2GQX+QnH(S>es3obHDquEKw>$`pB3N-7G{;6I-% z`IGs*GiUyy7LDIRW!>DL&;t6H&+!L1>n%D#VtF>XO#6|?{i;*7rhkdI9_Qtf$ME22 zpwXbSw=DU*zC`v`UzWq?6!4ds%$Jvw!cT&BCn%kjveCxF80BRi!94A!^>lo=jVWK* z$on01PBpx-b_nyQ%cckN?>~V>8K*13m80|J+~t?>-IKgCoNx-2T+w6`udjDl zm1K$JU&NHZ?0rvxqqatOQ`<=UH0H;AE*0z~mVe29x2^P;->P%8V0x9zk~MmXF5|r* z{SwKagEO{`%0LrS`%=3|S8qwQ`wx5Di3a+j)%72vcWkgP)gEZ-wz&J(dWV-uS4jTJ z&;HFh6@>Sl5bnjRG`4EW_7!;({%)t$@HYN6H?IN+{ARsuQ>>AP*2(T-mU#DYj6R~p zwTtGZ`V*roVL{lJ%6;{+d%4>(e|}DbLO$Dr$-3 z++d8Kky2^1+Pay1vwJibJ9!6$wqCJ3?W*tUxzv8&>UVKNU%+3_*EhU2%=z!(E}un4 zwuSESQsCfT+>HtNs=d}!3o-}tNmQI8y{>oDQgLBFMU8KvFSlpBD9Euc8RlBE5cqXS%yE^?p<`XmLRjZ$ea5X?H)UF*)j2% z-lW&#!xLoJCD@7im3}C*y+N{o9Dscuja8S%7nbvjM8W`dURkP6cY%6e)eSz{Ciw|@ zJ)}a)-Mj&z`BFym{x-+c{JGSpQN3i~$H?yvhb83{9*SNZ?+<@j zP%9=Ig$49uxrfYUB-2^d7J?a{kd63^LqwQ@ytDP7wI_TU_S@e}*@wPEZuCj|E%Sq> zq1IdwHR2~S!CL+GDu`k=eFQ&J@&1H7yGrz)xO5FS$`zjthP{dVJAn8!jk9+-ue&Tk zRr$Tib$b_8 z=DS3@>Top`!;fW-4);amd$Y0Jot$0;{Y6^xxu4r3Ok6s}eJl)H)6pCHQ&La{67Nsx z2J3ds7WIJTv7efU2+0sC@D$I9(;)mux8m{r~P;S zRd#R2Xc&Rtg5jD0yR#L%@TZL+Bfc%}W$pa^csy^W8=OL>?2m6@&f@h_Q&ZWPQOesW zs{b?iezWl=Q|ZMBq1iNCY^ z_Lx@CAEcfC=0m9GSJo=%1FEAmsG~oEiO0kEw@$MqO~3Rq$rxODC)LH1)WXK=N_Gj( z3#Z66Nv0#6AHKq*jP>$^d`8}0(06^W~lopWa3L%RRmWYmMpK>}T`k19G+Jc(V06&-!>V zs#M>>?fhpg*c@CiJygkcbg|u>&P}x1A)EDzt|7L4PA^UsFzH5r!JdzQ(~I;l&LA45 zY#K_6NAzoQq*K-sOH=tRUIpICA!Fo<9tL|?q3+niC;M%B+%M{#ezTp@lIdwGI*C2F z3-v|$nh4d8+kc(s!1K@0dGvBU4MW1NX`<65{ZyXuNqD`Spw`@4k$*8)rt@qq$gErH zDy^Y|^rL7d7J4IU_eEZhw|s_p)}ASL=di;eUR8Gc|E!{B!b9$o{R%pht~$rkOspyG z3;C9>*+cMEhv6Mc`~CRAa@s`mF)?nPcZ9`Y4x26~f;WKG7~^G$0;9+?9wv&M!&mRo zj#`#jb-N9ZI{NccjsC?w(OzfgB^|0?!LBY$^bU^Lhw(5fixYjC?C`uOZ07i#Wc)+* zLH4xwB5Pxow>Fjo))|fQTOnKJ^63Vdo7lv2`6W;L5}oRksG0um4_R|i+jQ8W z%=lya4u=r&=Q8ObwvT0qzV3&$f{e8fC13h9=yo)iychBKg6|gQpUFn;N)6;3?A$c( z?Td7?h(Pn6gFyk$?S zuB2JMNkdr%qG*}^lqbI~{WB{4ddUOQhuc>~cHxP-Q;pi>AFvZ{m}Gf5aOO@OymBRvh1ZxqKP5g)-n>Ix+hTk5xmz!h&#t!So*PSTsJumQ z#GK#2M%p6jr@3r}Wp6ki;^R4&GuBaiaXSOB%{cuxo`$bQLm_*#sGkbZ{t%f9`wun` z|5lgxRt_K1Q?hMpB$5A5Yws1(%Vny;S?HJKL`C#v8_l;U?wz>p?-04B^Ph86uk$6D zXBfX@pYaS+y$byP0$pnl*id6afqZ9wg*#;?`OV`#F#b@7$TyN(m+6n$(O15-+Iq%E z3MvWRNQ9c=uVFnoZK#wXHvdcpdOfjyx#mf>kkMpZ{qQb1lh4BQjRMV0(G~t!YNkAo z_nWOJqGs@&`(>P6@z?!r7*=LVOCjv#v9L5-cc*Jz-Ky1?4e$!Q`s;Em9zq^T1ud>m ztgRq>Z3kUV32b$7IF2{j$al#QE2Eoy1ngidy!Hey;SYmjhT#up!j?RsjkFYs^=k3f zIAQ`^9^VZPtV8_iA2sF{OxI=EGs93(9JFqJ%|4PZ>{-y$HK`6d80j9hBJS4I7V?xu ziO2Y~&C%|75mB=^Rxm!r_C$RgKQbJQxP%Nl5A~C^pv&7rwq|<|rcvHWEoT#dGBW%R zhF~LB(aVcPO?`sA=)gshCp9lvg zY7)(B`)zSa%jYA)W@L)74hp`JEL|**dpmBzP|fAf*nc)1%yWY)-t6DRa!%q^;$s7O z&(Gq!>)BXX-K(}kp9}s+$MS0XQ-2Je){fyZ7^@mV74GJJWEgYt-4B8DkIVO<`)gR> z7^%(Pi6imjJl|@2g>KO{*vwde4z_$jYR~+bjeEe)B7=g7uS9jRGm1AlV$QCHq{$`{5v_x@9ZS=>}x4RZqqC-<40|}EoTnO zQ|OhdGYjxZSnB+G&87t1L3#P5fAmbakvS+=!t$`{%z*I%;IKhN_vsQzfLE@Fnk_;3G1irLDvmo1XhQ+eTp>l$GivUz_!eAL)aN+aSNYR z4vh3Re(boaSHeOX$_%ST$HuGV+1Wg71KSZ4i~sf_n!Uq5(+Z`_=p1Hjos*xy!QHK@ zU8jp|9-Xa=nAk8@vS(zL^szx(nPwi&j_BQ$nihelu6Z6Sg%|87i(vnL2LOg}dB z!RV}|PAmfO177tHYcR&K(gAMkO^rk-h^f*d=0LAghZYCa!lcj#8~ zsFalkY2=2hIx6`sC6lcTHe1gBjTi7Y*HfKZE?3z-MzIgW|181t7O>m=8?3je z)sx2LaaHNPE8xE;5;`xatQCBDj8;`P{vYzbGt9=bYnx&8-rMLU%IMwf>ssqZ5ClO) z4Uwn`2~i@VO)>iDy&FXDb@qL&brU^GkSIwIH3%Z4D&INZpYQ$o{{N2W@EkJs?0xU6 zta7gNTnlk%2D$-%@Rz;qx^OOS0zSpkkOIw)0EgruaGNL8jkg0cA8#L{+E*Ma@&>Px z_kja7!3s=5&YM@RQ%}0!f5i_46Ig)8)a4o!3xAk~m+B$;hK^$`BiQOMk{O@ZQKESo zn3SbV3NXwDy2B;FVl{FfN*hhU=hZ|uIaaD7F3pU}|6gVqyxRz1+IMYLyU5MA#}P{v zqjwRVtaB?(FWCOqTpQKmH&a@|2KLh-(hXJAg#)sTOF|$;9Vn3VfHEG86I3r?} z570$7fzL>3stCVyM2^~D(S`f6yp;3S5SVm+Z+#oyJBu!WUn|EG-7V?|-7zYSct<4*f>q=N>XOsgnh^Xbo8n_CYeyp$gkVzU&#x;*Fjs?{Z0Ad z`A*SvI)~W46M9ATCM)Ii55YVg_knhiXrR&wSlQogLEMbAv=%Y>H&g*gMK0Xm8$i*! zYHzK`&tl%^oP3Y+a1WV{leJZHp!(8}X31haQ)O7cqI6oWOLtiBx}jhH|C=*euYQd> z4eHgbTl;@CXY&8O`hRF9)3|J|pu1|uqK9}-Xqc?4>ZXUb`rW`sFNeNz`}}(TFHrks z3oWn*pmzHY>ZOCWqDc!S$xmjV|66FK%V|ra$9^UAFZ4M%{H~ZpR@prYZIo92!<1+{ z&0R2cLIdoha5dM-Uu#ClPJc4`91f!~{^C%i&F3#OEBx(}l7b01{!=Jd4%o+jW7yQa ze!R)+riHh}ydN%TD%pj8r*OxV<0hj`?_PwPyV=mM*S<7PHRIGCA!T zv(fGh&#>Qwo?7R7rm)@Z?+@<^KlO9kQdol`Hp;CqgTh(CF1+q9_ILXY++Cn2ZCwM` z)K&BIXp(DfOU6v{o4FdUz3XBJV47bEOpg5A6tI!u2CgggXe;4+PnhoEPFT4L;W(4k z?X|n42707s_xt&qp!2L4I_1a9Up}w}H^yJ+|B|xSo`dFbl%E67x5q$N=a)hsv(MdE z&|_tGMM87TTDQ_>v6-RjNrrA~waM+$*x#VzN;Z%D=b=whYMDc!+2ZIWXHc5XhjQ=FaHM0oOdZ^m z@F@G-u$$)3fUc~VjZKM!3MvT`oa=}CnZep>JQ&G*DjH#eoLNm<>yiYN=JX92YU5u^hANG^Y9jM!D6{+5?21Y2 zK6ks!W4|}1WMsnH@9~eCXzW6i9T<88O2L=rWut-aihn3H*MEIrgzaSq`5)Ttp&L-% zl`tRqyBqFziSGAMV#-CF?zu5HOp)+vsAg|sGF?^M+4|wx{sw3O~GEQ z!?&*PE{F2DfuRaGHLWpau&If*&w-144lUPoGXR|(6a52zeiQ3w3?0O2>V}zt8^bMN z8)`#&*C%|}w6ulIHvfj%9h247M(@9_n6S9lzZuSDy7;~9&6Ja{JQeMElMmAnQHV4h2{RcJRJ&6??7zbsVO4uKtLj;W{< zO&fd0-(@0QK|3WT&g}88`Ze7&J0tu(wAtlN6aPD?9*c#)#ck_n8re4Xnm-it9&6(^ z{$LvW3!yk(75c_h!lcJ_=6FhDzl3WS>Siv6d-`#Hr%)5K61RQ0zcjSQw2p~z7bq#z zBIao5y#Kdf->(8qWGUpKfB0{iaiJLy23# zosD^6x`*yJYG6v>X4kT)E&A1Pwr*j5q{H0Z%x<8`ZSVPu%qz1NisVv$`cTbqKCDK^ z@L4Dg??Yqv6J{>-A-5LFl}> zZd#jKDG_!C^n&xvZ)QnKBR4oa1?MlxT=U0-^Scs$E6lu3<2Hozxa@A8t!=Y9^vFLr z-5-Z_u4KkxohR6Hc+M9oRl{9PWq6Yz{(pXHs&9TV7cjS14_@{6;gx<-GXz@Crjd{C$-P)9%_E&TSIFDJ3RqdOIhu4^Nwwx>JBB29qZ99kZ z`}h4`;i_1h&gLjol&he3eivss3U{u(zbQwX$MRZmu6;~#ciiZTf50^NYuZ??13Na>YPg772GzEj zEa+Yn58dvjP=d*h&u{HcLfc)~wy-zM*wAc$E2guSx2ycO%}z5As|mF-rfu#r6h3IK zhdvHH4KMNEGgJK%CIu?wedw@!Km5oa=)b~FUQO8(er9UYd*P{==^Pmzk8X+$Y$em! z-VSflc$p65W(gNT){!?T$8P}v{|o48BCVkq-~@xY0>6(c%MgkOuVy_WwK!mUC4qpi z1p>Pk+_fdBs>LHt90FWtDbToTnx1Frc2tiO+&tiQ4Y{N2L=F3uG?XfO)e3zhNx+R} z@j7T?UI3f^L&^nZfQWbC(fTK1{I9%YG7Ya?hba4dXYEOsTCu2wT76GMqhr92StJwu4T!M|X?yP^ zUE}nK-Ma#%8pr5I#4YF|;_=PASodpdbDjPSXYjW2TXEn6sKW5w@6R=PM4dL$noO%jUc-$p=sa{ zbeA3W2YJh027l!;&*i;RU32PTMAnOGBdXK=G>I4CJ9-)qXzwXLqTfqc-f>%~xEADXHba0s9QfsNd5=p|7p~`B!gRO=YVEID z65U3}@lZa;Uj$32wAVFAuiNn*is;vNiCS-N(9#EXxHV86$d9WVB|44SPwH6Cj0;BKld5GB81*?L`x(C(T+Fm;#o%Q9kHrDap_}~_l z7cB#Z%F)-fK!VG7gLHzo4rqT_EfX{k#^GCZ#Y*N4S_HYg@j5SfEf2Y4(3|4DiFm?> z(21SnhF)E-t$rY-Wj^q;YToA@?^V^J{H52+`+}Eg(O|fjiJJ!b<($-$*P0kyb$VYXQyo+VkMa{8Lk+#{nwEd1(?F6YdewmRmhtv*g!d9?^HQDcUD2;#!`A@SZkm|ij%H(5B9T?B*_i(WQ7y}k9QtVM?Lv# z{FzK+h=2=y0)BE5^qLdgM&OTITvk*!a`QDYyoDA>1>GdMIHUBC_vvd1ae6-Ka%vA6 z3(R(p_%0()(K5i!h(Ex)WkW4{f)oKy<)&Mv`{Y}}R6j7x|1?jL<7M`swsBohwI7ch zaK1YvrTKdqjGD&<+6f&29g~sy%y{`?tgFMbVfZfUNmGp?C0osQ(v(8BfcrsMe|yeSm$3@-<-)7I1* ze6znOD#*=ExlWK4%&N^eFB3JR*Mg1!?W@5f!8w8QAy}aM=!^_ShsERQw%Zlo`MOMn zo$2FEL668;_?&dXA#Q+MJ)TqGH=vJ!ou9=UwQ6usOL%|q?|cWAY@Z~+(yrkotj8i) zs-|9jnG8MiBmDlis9xOX0y+qY^?zI|NatuGga8L-{}^c;&n>K6w%D3cHd#Lox)9c!I(vaV@VJ_N&!kO%#jH%-R{Uz?|3p?Ron9g$7wYn?jl zbR^}}Z93h~=;|2e_2oDbCZXTKsi&=ujS;}J7Gwh>^=l#uUG z_5F~ShgzY2XTdqegfN`&7vRw@Cva(i{CNbO`4cJ@+hh;0#L7IA)=4Xxfo{F0z$03$k=_sRK>K+XQ13)~VP{HuJxaGwLENE7 zbe`ttwPqx|R7Og}J1DhF!7_qB5P=>RBqyt7tP$cQze~Jw;!4*s`#EOiftvv!1j{{*Vd0 zh^A=e@KnmEPBVBc579TZranZKsyRi<3!6cIm!hapUy@hgp~UM+DU9lEEwEQ|@hw_~ z|NfCC@-$6W4{XVCT1EQd=l8?4Q8BEbH(b$R8NcJ&;MA`NDuRAIluQNmU7X-Az-6n8 z8qs_=0jbN%@y>_R+rP%n{%NG+{R&=olFAXts=bv=2Koo<_VMz==6U|x&-k- zMmK{GAZ{WPw-z zNbbr_xrH-##FfTet__GHvvP}2n1*r&FgN1e&eXVCj)<{2uxcZ@x039(zv5lm;a;qk z3|bBB{jc0>F>ZrfMhT(0_5kHjYiyd+`xz zugR!uOkp2?=IMU>DJ;Qpij`h|F{s>s5$L3JDV5+>ssFR+o8Z;s%yu)paYfWh%b~{g zITZ~?$VNo{IdzT9LY-u$Vjdt*^`FuroV#qC23}_mm^5#3328_p*~eKeNE3LUe8OX; zu|(-5DX*FIpz~xBl=YZMAI`2{ND;)=7o{ezMx1a#v+6tAk~Z-+$_S3_T>cahbQXRO z?1N2uo30~+SV}uIpC*YwmwXEAx1Z{26GUC9ePrS^1W(bIFYuePm#gc1ipQNzoe;&G zRlD<8?xQKCn|mRj zcw}H5WEN~&4$QuIi^F`99je9O@Oi4Ln^Gsv`x$UgQg!1=$a)*eD%|Mrq%n08s~IIN zx&c+x0sJ)|liy_!eilm~a*|z%h^7s0bxY(1MJP_Q!mlK0c`!%9+|)&KRXvKz*%X=# zd)f^9lOioNoiu~3^ik1eEfLJrBt%gekdIWyIS;!CvyYCT%ins=46pUET#~2yHP!bL z>7sGuOK~0P4V3O$NK5Ot@QSM#btPGi*x*g%=NJ9Y=mIjEEZkg1+L^Q-{w4{E<%`(; z?`Rrr#XZYl`+Rzqgfdf#4!nF5PWzG z>8BHAD%IlFu^8^Iqc3R{~1lxCOjFP(SMY}=;jj5(eycW z)&_(bhnycOsUMIV#c*jr(_I1*WEN1Y|0eci@Uhijiy5I8NLqJi`)(> z^F#27@3WE4;9=C0&QwY!z~iJ&7@Gi=Av*eNBXrR#g8f|Je~F!3iJEv*tq-oz3O9{% z^GCSLlPEp-8S7C2ZHP|~Xo60~tho<>4mH$B#9udXx*#k5z8xw{z!trmeuoWg8gK3{LDv`kVbp ziz(*P>pp)kZf>VgJk^#moZi+0m#hx5$`Ec*Pd!c9{f>z0iUH$|f+n@AU1xS_V^bC< zW;&xUgVvzg+Fh1uDII7NO|;&p2h`eDa2G;#X}c`oX4;O1$rmz$O6XpK>d9QSWu+-T z^L-v5=WI7ws`n%d5Q{?YHNVD5Eew0K38%jVR;7sM1pkaV18&i58l#`{4oTz^U~E_eT)*c10Xn zNE4xVyG$7|Pw<@VC#aXDls?8e-foIg0kBwBA-XFFUr^UNGX?t}jqV6l!Bw;H0A+P3 z_z!0()=kwNT8{5hZk*@W;7@LIjk&bc=ge{j%%~1RKmwM?UYlZT;Kb~p|L7-725HFY zwU5-Ln(klQn*zTqZ15mzjB5K-SnU-SyGU7ZyQ)(JO_F!Hs~i^QJlYxDh>{XUC9RjB zvkj$1R5+PLqQU2#3h&$#T*?h%%uvTj?S4^e2=LQ52>fYi8_kKE(`b{4H>uHD1QSm!@zr zFsF9H#vKP|b|}?kEBSebZLQ;_Hh1Nj!29k~PVC)6iUx=B9m<7lV$Y<5al$@{hnER(+rQvHz`ejE zOr0k`Q3a^6R#O)sUOl+H6jGxOXk|uC0~BI8kLGt}8m#0e1Qk6O^vdf4O4cyqfRdVp z|3((EP1m@*(hBk26+&k%KI#U!lKLh1L8Y`97ludsT%P#pHJ9e0x1@^pb*uDa_=Xm; zPWtQ5k~(*58sfoPoC3C8W89WAk{f?7!3oGJ`sr1g?7xQ&9)D9`H$mQ^>~ab@1@l}o zE)6e6PCEh_R6qR!T+BRnBf3aG6tKNSC{ZGHHS)Wxh^pGjG-^bBaMB~~37gF|*4xM} zf5fbSGQ8JbM9%KStX^%-n!PUNB!1>G_vif+q#Sn*P@e);fi>)8Zv zm}W!=f|)W4JqC9(6ksNYJm)St4v11DqKBjKJezQGCV@wb*bUrr5BUBWO$1+Ls&s+g z=mxE010 zSB>W(Z0%G;@4$KnCIfjpj7)1HE!9Rq87F8_?8Q|0fOm1~ z;^jQf0df?eG^g>Z!$4b;Xfw`qc66T@!}};2@!Mqn8sEN+JPv2YSsP3vxr&~|--b{< zM6{ThrZ4b}0}&-m(Bk@p(jwCT8n-$g-x~d4sJxdJckh(mMDLGedDm?gANw_qe}U4s zKfXmvoyGZrXo<78WG<#$Or^tGA-D*vqFNBkW9@u&e!K}{{PWr*D5p~qnWxT_T7@&R9ZIL$_{q1>PAuSByj8R5YA%5r{F!WYJ-tR61E zgmoGYUlpS*v_6wLxnZ0c)^cha? zXkM*tw7ovz2k=y1yPvR{>vcBN9(DN{ufV>?15>~3I&3r?Gx)52$T*gAy&#iU0rq~B zqQ4uj=O`dFze*V|pO-#(L^HwTdPm042rceT$wvHblYO4*OEKMRHSFIM(}RAdFmm|W zm`PAcrc0dE(o9;BTW~>c!^Pk~XTp0nMzmW>N=Q8@1~R}BFR~5g8~EK8l3OeBH38NS z|5}Yda#1wVu14(j8qxP-s*L+ol{Zrs?Vw<|Q+6%LqcQ6fb6ijj%fn~f46Taz^E9kH zYVeYl(s3YZ+&CbKPY~PX#I9KyMeox~L=@4~k9wxY6|j7LUhKeDf%Tv z(h)|dLw-S*$cM*I;1#ID{ln)ZzZWa>a2MVUve-B|#2-@^N&xcQ5k6=U`1un!fAF=8 z)9hRd@#%+J3!k(N%7tNwkWcGr*v`MWynU+YQFF`&%xaHd>Iv>wSRczG-0c-So8O@u zG*sDLqQhF69K2?!TCFH|5UKBn-3bM2 z$plk?ntjcG>7ig5tR?)qF4uX$qdnN$ldf>^6L|0!>|H&JXFuU$q=VM*est*f%F}of zveFlN6nJLNpbpbTfPew#7^#x8?+mCBn>=ZOU~$Bq#FDYPW{3l4{gwcTvQtZHEYRDXq+t8 z6H*6$W;)K_27Q3L)XaNdKLB%cp&#uf=nCX^H|d1St`}V*Y{BP5>LE1sEnc z=+|6TPV%!*Bk203;087IXYhH>3%sR{9MaK10Z+hhMtOJ4BYPIH*d;p04aJ!vw0lqdJBOD{*1XbN3^t#u!FUfS6Ry7 zBxeUcd0ie;EbPd5{=aRQsT=F$_t{WGP9MZ85l5Ft-PY*j&*!7hFcjAxr{MI`s9?&TwHqpQwK z;jIq26M6``vp$IUYjHz;Ch@e%U*ne!l6WeIk&C0Un3{*WayYBm5pfIvy7Z=21zR_t z-UqLKygiRvWmm*MyAgH8*@?6pG0a3=!RK(N#a-a86pQGi6z6~^p03rwzi$ptevg*O z8p#GVI0;?@KTHQ5wF0^ zIuoQKaXnDg|41DdhwdIVZQPFQs`#dby;{L3u8W)hBMsy9{39PWdyr9d(IeRTM6A+` zU_NhG3Oh6ir$aFwr6uGnZjpLM|&pkBJbFvc`1jt9VhoW_URSs z;XP3IjMwi%h4DEPD9Ssd2QqS^_^!(9A#rFz;L+BO^V7x@kv5$zNgD z(N8ESjM~LK-3hBy0X8wK49B|_#f@(dyYNub@qF}|+~z0Rtk7BCr5nJalYu;arRDhp z{gfud6F)>xuE6z`T~g0p04fQ58JwGpb_!1EbDF0fls#qS2W0oh<&0E9_TjtBz$o@0 zzAcQ|)9)Y`{MF7!6=A(=BReEJ8A?W+`3XfJ7Fa7I(1)s>E$rW?{WeMpNjIQnTj6~R za4ap95A55pRFzPnnnOvhroWudQ)R>@1vx9_Mn*kbKGs#}_tu!p<6Ea{sY1xDR`6i^ z5mm%JStN&0+geO*v_4OOCmw@Xw2xE=&u5dy>P~LOeWeYu(r2;;mEu3N3Qv^GS|GTB z`1}=hLcC>>dF0>fXu(PRHcLtfQ^Ju&l^tMPn9uBM#r$kp! zE)JpN>SL;=5s0|Yay~DBkFCiH_L<0^2zPBy|V%2OiT`H1vWhNS5F_f6LLpAn(D${;To40>4G@ zxlhoMvOBP&S->ZzLmeIwtf#~DJ0)oipIP$Yw_Dd zWq_{5^S8hme+>50aoF0=ff)P^o3ljMz-DLRNyyFuw_i{4J;c8Gz*;z_SAczlxk!-6 zD|mq(wU`U4UFkXS`;4>$Y@GiPn^yEDYjZF^PBHq#a}-_V3aB_Olz9FMd+`CRdmUP) zU`J_2KC5$(%M|1>*oT%Ja1O1Z&#<4<@YGq6wS8&NA(Hu2xAHP=095UsrUjmI8eaEz zZi0JWM(=7DwZU7w9{K8BoU+WE7uA7fu$K4iaV6Z#R%0}K zn@mNJGlmg0J%lA6hx{he+u|ll)u4oT1$+KluSlXs>m)o+39jaKLY1f;B}fjo)Sb8B z#2w{2d>wgcA>K$kVYTP!FThn+0FfLJ#KT?}!2XnyU0fh|6Mku%j?yAJhR>QtK`XvM zU6FMyrYhPTcX_`21$*>}9%^&;^#E7l9$F6-r)X4wsvv5fV=KT*Cu2XCOKBd8-#boc zcs#7jhYUN1sP;VAe=TrRw&C|`NDOZB3fw*@2Qg{faUV(!S5R0dStjdY=hESvhd70w z@@LeTD#|Z3KSIRu~^Fk$oSG~ zDSnO4cPY@|Wz_}rBHT@$(N$zyo84B5(`yoeIKI1dR801zB)X4iY^Ov5q2Fp6*aeau zGZ?3$^W!CS97(n_(EH?!RK`6_8>Dt)!R!UsOW%-a?Thof59+(z8b(j)9kK>pruuU? zU@m{lXQ=n=acRt0KCczf7bb<4g6Y%%cw!@Tx0ykeFefFC2Gj}Y-D0<0(&8jSA&o9i z3FxkyO=?nE+URajF4}_Ls#SS5?%5e>EwTDH<)9=U2<#;TBC=F%`9$cCrqd<6O;Wj8 zpV?~2VM`-A?nQ+WS?-r;-13@KOg%(j!=*6JHR1poLq`dmAK5Fv`^B--RbZ<;9l_&~ z88|Qjj$vPC&>VDx=!2VIkI~5x*i&aJXUAv)bWlCvgFmKQz~}1f54ar#@FyNwUpg+s z8Td`zViw43NtV-4`-Ne@e}Ts>gi676s6IO&$E&3V5kMSbsgT{yFY$`e)LxbmrV}HQ zP797|e=a1z_K_K2qeNv$NyjY-X2l~PssjYCr8I%9jMUtWDI`!G zb+z}TsFdW~rk1uv{@xjV1~UT>Dj*Zk`Rty=B64^EpTCw)(p>wLwt{`o2{GC%YN~f+ zxh+TY|5wG+Rc~W~f2?$sL+QEwwQ3@YC~A>C21ULK-N!bhR!4|KLY^ zT7H*6=7LGuOJ}2lswas&L-)~j^mKTD)AzGQ-v-3n7w9WwcjFMZ&Eonh_D{blx?(J# zNFanC@)|8c`;dK~wY@nNCoU#uQK87;$j!w>!{hc{sFG@;mUjVubU!fjPxz&5q@K9@ z-GMcC!M&?S3ACLW=^9UO_6 z6x4NqhTfKe8p);jsU&G*x=cr8Jyl0UQJ==^0QpqcOEY{%I=yRJ;Pc8OcNt9|0PCNE zcrg#v(wbU8N}`H6fa2w)jHj>BKV%YRfDP^AW>E*N1`TsN{R=Bl8$NFb*rMBQdaa1~ zD3;b!0;lH&h#|&HLmuQ`K@4-s#qfIUwP(=z$wq0a&TxoyQgqOiS9U-6!j-h44%MBs z%KiYh)gD=6S|Son<~Px;e1o)rub+=69)TF$hnRDkFhxfrXeZ6Tt0=(xtH3MRb&0Ik=wsSPxS(Z=`0E z$OEpqw~;4&rqy&TJ(J1E>eFH3ZVE+91*kMHk}p@N1rU|Gu!~0!;Y{;8(|mA?Vt6j< zBZ-KGV-#Jb^eGL~ZFEY`OL5sRE8UxXhpKTFAnv7jgFTGMJGCoWI{26Nzzm9WHO&cZ zsH;E29HdKf*w&|#u!R$(jU7(afH-y3FdYm1O~th~4}`^x;u&rY?)Y?3*rh12$CM^W zFKP<=8UoX$14F%x%%rD3h6)7eVkdj?U;TlvBpvOd@rd#!li@?!4AJ`k zZ*wN=)~QvyR*mYlYt;SUXeR&1tN({)@-8$j^FtTS09(qx8>;PZGmS9`IiEi?6bFS! zIhP+wwRo3kH~D4VF~2h=J!E!W4d&_E-%Z<48oStxkJ;+Ju*dxKp%Qkf`!2LF)YqlX zR?FkUX0F|iX@phGRkPo34t>}RQ^BS8KY`xqbtt3X&`k_SnC2$R<#UzX;zr}byG&bC z5Nfhv&4T3?{?D9;^tx=+eEv< zt?)}jF}c#*44sV0WnP3%mSM&v$7L-u0tH zL!lBX;zIVI|A(z$Uz*_uqwPnwqnYO3ck{!M(1dk1O+s&lyW6yw!grqa<3qhL zade+wlE1(X475-ET3Cfe;RPvYF?sZ#MuqJ>|GD2WjLCjj-P7iG)5W#$%ZHNvcg)_< z6*JGjg7pmC^N_`^G>G{e8o7ljQBY&PdL`TN3^>~cfqEN;|dQz|slUl>|tdLphXjq^Su^i$|B=vtqdwk=ylWm;IfbYHw^Q))YW#MPg z)UR=qT~Alruj002r_S1Bm(^tmzhMiwZvGYQ@En}fBCfuh9`?=0u8RH5wDo(s{Fuj_ zXk#&vu&x>A|A}*$6}rPB(4nOPKG?^!u*dx=_Jx^kviccis2lHIm}2f7JIK9sKZLs2 zymq`l!ey`>>?M;^mY6wiiT%`Nvo-8@P^Y%AtssTKueIM|D(8Oavz=edy=6w5ulzagc}xu#;odd{M9h!iH=Xj2_(d=!HUew? zq5Iqa1Ly7!lLJ-))5XKtYz8QON8?=9cbCk8n0hqz$H8kC9vZZVneb3)# z4urSj9SXV5rl;TB4TC1Pgc}zA*A&9E$fB;WDd{Apjla~N=l8-BWr51Lk(=t4x|z^d z=5~iu9{bnnTUduDun`~m&Fnz?iT{zEV7`D&IuO4xf|BKN-$#Gd23wjG;2<8x(6Ugd)vzOyI2HO1bpVJC5~>n4IBi(B^&- z?qaq>_uA9uPo4RSd59hT7p5Uj$54|tT-MIB15>ia6!g1-L0ieRv2jqrmGGDO2g4)n z&!Iuab2ZRU@-(!@IUE=;@F?*nDJ89&75>e?8u}9RC+FHxp@S~L|1Wel)RbqNUaqO# zW=DtDg^mG-e=EGg5Bt5t_x)C(0G2De|F%17(mM?ghf+1C{nUPJ``gO)r*K1fyQ8?9 zaVf{l3$xXH=3bgVL;r@-xwLkO>)rLO;@sb^w@><8czYy9uEeeno>$ zlwh2XqnTVPcq1sTyMf}(K*q2}D?>fh##6q74jMU8OIjR!!#j`}{a{`*W_o!asIOJL zP4bt`#&7dW;NTsD1E|QQLB-`4bhpbHe20qGYkniB1ik1y@RT3$G(@Cj(I4qM)OpDj z@gC_~aBP?GO(2`S^)vL@%Ny)QWv>di2qJ>2!6E+$t(3CfP5DKC1zvRruWTvDz)qgb z2Xu~&lH7b+BOT#_~e_AwoQKaFWwhk=ex;<`XATheTxE8T;I(9*1t1wlRVanB+*FYLuD z=D!Cm&^bOs&Q7Vjc;NEiXIvCKQ~K zJYHY>AD^U*UbHUdj6o7L3*v#>-jxzwTYZSCL^YsL`GR!8KUx-gss0=tR6<2|lUoTS zwUhS}7(s+L-0MQoL3VF!@BlT4>!^p6(G{8!Jm*+w7;<>$(4B7pDod&hfiHTz)B7yA z&EIGtKIK+GTa?y2uh3`)nFTe9AcP$oR-YC7HQzZ}Tig{5#&f^_~ zPPPw}RYSeq-rArAbYoXh3F+=Oav4-U(*<3<+TPoCf%m7B35Er8wU}T+3wCiV_eFLV z>&?~4z}cg`1@7Y@k>Az`FF$4RYROcofeu_y`QU64u)11cE?}O54CY5tGWf%8M@?k} zF#I*B1e6Wx%T4JGq~wmt%aiqOu-WI+7aR&!au{{*|4^YAk|=8D6ro&fCUJJez$aI&IMpX?1(v4nR3^^unPp*90@7Yj6Y z%Kxo|bwhpb1{-e)erqD`+%=$`)4^4IBCWj7xrUjK9CyFw4hjT!-7cPjz4!zA&Gow6 zrPh~ffiKj;=I0!|U2=OZpe)S>rQ1K)!F$??mT*2)?_cVBn8=vIVKAgDsx;}*kMeu{ zo`2wsUP&zyr05at@BM@xmv4H39z#}ro1Riju)6PPU$2Z88NBV44_cxIzF2pFA##Pg z1~;{aHVlq&ORtbO8<=NZ-Jp|fCD@vSsO&D}$CBa?;7dFcoT~=baAhhK~4NF~6`ya6wl}GgNSI%0W)+KL(0jz`H7MBj?Qu46B7? z@-AYh_Y&z+&5n~ePx}Hp+O7?daoz;N{~m{!QDuz4YyQQ1Zv)#*pjTOjb&uezUUyx` z8G=7}gj>R++{dt7YxzsC&bI)S-(b>v5Ai-8AEbxwA#ah5-ab@2*CXrBgD1l0%5v?E z+SV}p6W7+;n8dUm>lmkBhZnh*@^ZRnmP(oz1L z@5(G4qt9rsc}3{bh-yk4PTm^#RHt)!Sd}F>A#-VjC9aH9at~Gbs=N!>Zb!_XJt$3a z)-X|la_A;%fmyV1lG-&rBPuUx@GTbFEnrm))l;%bYw&O2RG~vHwUeE&-T4sNPeQGw z0kDKf?*=TkmD@nBL%~CPl2%9@tlR^9#}w%f>^>qe-gC|w+yL%%2+vpsHKO-)KWxn| zU|3%S`*<>Nv_f92*23z1t;PAxAj(Utb=l%Hd@pIeOi&)Y2OISzxO3m>t{@xK(U^XW zv#}VSwFb`pB%Iti+E!=cc{bCx+7xH{IKKm*^+3TJMKvOqYv$dh>)>#;@J4HC*~7Uh z5#MizOPx|#!CS=N%0Ijt-IHIMtD#n4voxgnnC+a}b^T{_xb1?9;9klUeByqU9+WqD zOec5){GX>4`7e&}s(26NG!WFR0kkl|aoeBMD5k4+z3d%nIhjPPEC|+-7qh30Rf0gGzveIel^u905 z7=@0R&T_1&z!_25+#t!QK~4h_)>f3Sp{I9oHhhoX(2ddq_-GnAhVN6$Idlp-pw!bX69Xv%U zpENgW0VTmx56dn+gZ!3Y=z@qac{TGTrjIan5`W`xsBgOJr znFb91k`%%nUn~u@ANSXXK(ZU^X)2D$stT&ZF*pO?&_GlUbE7u(T=U_3DeTX7dlz?O zkv`#{QO(`VQ91*tSROw`W}=2&T4(YrEl)Rv^e))t8#NU>p9fA^9cco^|79q6-`Ac% zKLc)yRiCT{_+$PZo@WWg<4&hXHKx9v1Gnr4@PoEt7yEN|ehWT)ytdRR-1c`dccG$A z^2_43?ByBw*+wlQ84!bfh39O-yEzFzIi>k!8*t57UJS0p4np3mtC4Hm1;+WF)Rd|^ z9%x?}x`NrX66}GOvJdn5z^u{?!4Y)FKV;t3a=@z%cZQw#o_m1la$HZ#Yn&=a6H%+n z$iIMlHx}BHZ4)Wu3eiIBUjs3^ zl524yY)?h-|C;M8nMy6BIL~DCd)B(TQ0nOh*slRNP1CeA>W_m_t0;<7+J>j`Y0OTZ zE+gCsSC0lFaxMloLoqEQYbA=OqFZTcR7DGNZLk3>PHbHsjagAUD3^`|F9b6kPP;kkJ>{Nc~FZAbP)H2cSCj8K=dta z{C={8*2y9sFXtqJ%i#6P_#=4%zxjk_OCj3M_a%*P^zXEvJ}C zAtSXYEYn~brIAue03>r8c;Ugii1+a;fo_C<$FBdOeY7IH_IF^hPSS3EL!N}y7=#*e zM398_F396>|5~%BTPa3!p{AHomNaUDIJpEoco(V)``Uu1V)g5~-a5e_!CQ0_e}{@j zGpHg?!5Ss(|-) zP==r5q>a$ddQtKq{wmJB+e^aZ3-S_U&{01E+^n(Srkt0;`doJC0KC^h z`b!4|@$?R7(R_A+?m&haiKwhHH|NYeNc-S5E9@P*6M9dFxE&f#2XG4w{8c(Fin#H8 zorrFatN24y`FkNAE+3Q+E?F>~5GzdAWbpXMvqy2X8}kwKN|GkhIXQ?N^f#~*vZLy` z!sW4lViy|AV}A+F#Z51$G1N=%P_m@ckFPTsM7{M-x(=&f*!D(;*9lZn z<1~<$R0%w-(~^mYVv_bI$rmWyh6-+qX~6?Dg=bK8?&qd!gs$f#Fz{J>fiKd?rqElw zol<9x-H|(Xlf=*=C`SLLW2m8w;ftDqYtda)`kwkDWfrIMFb44hc)}v6liWqL)sT0} zHu$2ooSvrYWO&jfWMNGa8)XI;=>*t?QK+q4rGiuhabjANx~2yyM0NQD35~#{sSl9d zw5Pq=5GQ?>{va7>DeQZC&drbID0PKB?krPKQ;vjp*@?>3224A72HW$WY>|HapG0eW z-J&COC8`ReWDOLRYpF!gh0E|vsOL7Kcl7UaOsXPED9az2bo`KB;QQtUuVAVE1M4^u zY?jed0iHP;)~q(?p~2ip=kr9rmhN+(;N)zQ1~Dh-SDEGx!}1kI?F;r8T4|r!>S~Tg zefl-!;zQ^)yc3qqzz*J*74Wio`3zk{g>5etk+d=dck>syjNbXZ^&jeM+v-GJ%W1Ta z{0HCG2rD{_lM&U`q3qbD^b&z6b}jDS2V9>^!*bN+hLYZ`LRZMFydO1`HL#1%B!L@% zpH)wPbD6MGbKsF{$roH+>ta7bnnxR$!Tc$|Mg5?o{y{?Wh{~#=@8xO;?00%gllcPb zx6KhpWJ4|fAl=~3^fQg82{<21;F+)CcQYV{=`M@uE9_ka*pA(x3HgAYNF7aL#O8=x zp!wDLh=DfRoV-BK`ipHA#GSu}_Q1cLmrr1$7t#Uf=C44kF^22-d_bP33cD)7i2VYQJiz^_E8@wH(n^POvHx^{%{@N3J|S zk=fJ?>z;+b1jcb3z05OFK|aeD>6u$ai!ecZ0961NAs=6Wnynpn{zFcKm})5EmMq$y zSL$`>y1>9eck=zxQxkZMq%q&ZAHEGAk|c@x4%Clt!&fe*)aeTc^p*pDg35d?UcsMB zoJ^E?sN9EWC%s2yX{}bl*@zQHh1SP}*={;lugWqo{;p6Yd~sPWEMLR_kD`yIf@b0Y z<{=%GYMdZXC8uVRVmeTY%PsIGI^*7^k$C%$cH^mLyX03RQQSqhp{sRQM99~qROk(^ z$jxDO8fseH;y2wODo$PHBRUS1;Aqt9uhV|%!4W`M7EmV z?(R+j>GND`<`6*vkroj}1OxG%umdDizyu5I_kUi``{DWc z+}H2EE`>AJvG&<#w%KO3nIG(coRDwNeWR}?hv0c$=Vn&+#gd^5X(`H$$mGT8f&E>clUC$j8Qaok zSRwBs3+*=F&2;fT)+PBYb?Ccoh0ln-kQ%yG^Rac05RKeGr^Gf(+s~ z5pKRU3p-)oOr^66K0tp%H$0c0cEk#R5cByMdJcYp&-lm->UBFK@5m?QkV4+>7xERW+9%B$F=g1$-JTY+2umH@afq+FbaDO7wbv zPIo{d{29|iB!^8(7Ss0jnU6`e@(SF&BIssjFh%AqTbp8oiM7F>HpDM~M21-2E9rn} zf!=DJ z_?LCiZa!Tz4Gj1>IOP2=d(fY*@^Rm>~X9U28+JHX1vWx zi8~X2aZaPOyO$?6)^<9-f^sR|Xk5h7tX=8~y(AZ5&G(|6&5@X9Pjd&~lxBVeByqQH z<1Nnh&%*o2(4OQZvnPJ0hqid?rU;g^z|Q#|y-nxP$(%;+x17KK(E^y1Vme7b@jCiB z7EwbR$G>?4`wLdAyIsKtFhk7#gnfL2H(Mw%IIJEG#eUE&>O~vRyo5G7)z8PD6A2IV zwo6gBxJR$bDYDTvsXQr3OtBB-Z7rI*?Dvu#=a3?a%!z09Qgl_zrTTcaL?=2=AGLMi zYjO|9Nk8XinyoC$)$f94Ws0HDBeM z@cSL*4ckqOxB%PI-SgvV*Kq5P!l@KZZMB=^!H4{azK(V{d*VCK;lIHv4e)JX;M?e= zZH=GJNz_L{1-_k->OeFsB`fp{KmC3FrWd`mYdu?H1pohtr)xgxsP(-aaZ(cp{V6Z! zMf_WzC7tz4dJh}%&KAYR5`+C`s}Gm_0o9JHVJ13|vV}+BY9{-goZ4A3pPf2h&&o9{ z{JI>`kFkd3@OG>HjD1eLZY__{B~>)_kS@_yi9w*+6V?K&SZCjRt3=ksm(kDUZg(lW zIKXDtbTfQHGaKu3b+iw``{qfMN13#oxAGrbtIxBadAX+Rji9gwdP2VP`Fg;+>K)We zmcUD_;Egp(Jg&cMK}DC&GivH%oldSY(O(74J)tA1PJC(i=}h>Oi}Ydj^{IMGqJnE` zul*z?6kS8`pow(%?x}PeBd-yw)}T21&TrLCdXI{;Q7PC$M)STt$!z&Gbgzz4v>#F$ zbf1^`j?3bLSj}|wie188;V`lqmjh%zy->REx4iPD57loa7unGZym9P+ZPT~uMbLg1 zpGEe2M!+N3@#XkuYr;)A2`_a^c&}}8*d-aj+@Yn^Xn=E+L4Z%jO z$H~UbJ~W(%-?yy)Ga5LZ5zg zF9>CZJtn8&qXueIaKsNbCe@Cc|0wU~#_7gCb&M5}T^?t*jvrWXZ@4bTN ziZ*gzdurCiNVIYyf536S1pB$$`=CNv4tH_Wj-VRL?alG+mtmZC+eTu4ZnFEwykR&V zZ`M&C(I@#?3-wPc1D?xjl@sl$PHeP1iHl&V&+VwK#$PWcMzxT6c%Z=Rhgam^xKyGg zw`j2sC&OQ=x9f*-P5o2Hd2!jAwwhX00Kzy1%ATqv6F>S4V&GKla7L8_?BlV*GF~e6l-(kit(~r=(|0)tKZCWKs>Ah;)ZamhiET{R zkSTtPM{pg*L*oSU%Sves8@>;$v%;A0mFi-*ll_kJgW5oE_g6KuUJGV|2f9mrJjq$M zm9F5Xti{{DZ=w^aDy-qnkAy$Fi)?goD#10()h{(Kyvz^M5+-9IzF=C|G_^{v$o<^X8|b_5 z)G5BioA_vdMDN6B-{*hO@0lLv;=M28PJCq5$!9~n>@lD0otQ6i(vN#zZH^~i2rs%s zI_bB*&pJ@QI>U5`h|MQe!b9BM*W(XDW>oncP~~4RqXO> z(AZV|!8hnSo#w;&G)ru>K8rn9OH|YT#P5u4(~CUTH{}tcea05E*xvB5_?16=k@et> zHS=roIiKin_=#1v#a9q_Go@C74)5|#UMN)(eAX~AAUHx54x7|wc<0-=Vaw?@&CNYp zCU@!Q!r79>~_e0vmU-B!uU&_<@zkx^tUh{Nt{vvFCryY%}SZ$tsdFr6_klwzW=v6eD zr~7=Kx7I>i8D_(ffpjQh6rMi zzUGS)-NIW^Q|Rq2t94SXnQ@RQ(T^>aKT9#GlkB8b6Zuk~dVWsirVLB&=X>}19yZH>Pn zCoT=DTm-k?$tOlz^^mlZ1@b03(I@q!m4yGud%Kgw@hsq80QWAcE(J%qdez6 ze#u&oUeXmVvpEZN6Tgm#3*8oF>=2TefLleBVdPEP)$8W@mfiM@7J-lCo}#6AwD=zno`e;SlF z-Y@%9`U>6#p?{&ZeOvscPT~7*(K>NHecq~YLQTNoa~vf$^`@b4uQB#zx*g@=1o=d= z>DRpV7I?UvsZzdPmPpS;S+5%vfCcNSZDH2uFf(Nt9xIPOZYvIVkjNDrS@1&+u^=6%h=nDp? zZBH<(@ob&>eFOPkO7);Pg{| zSL#;3OG+{eb{a_IE|{lJIJH8a#ot6Fc|1IAC3OKP;tBm5j=B+5=8LjSD)F2_;(|?- z_4=UB);ft=c)U!h8`P5)V$08yS!GULfD7!g+&vQe=1w}Je};A zO%k^CC4SURA#<|ey=VLVUMqFZ-%QU<7BEwP1K)gRY5t5Zqc*_yN;FJw5wWIw1!@t~ zysGY^Q=wYq};b#iy(rR@L95P1M&9$$Tq8v@D{pP^(Cj zOk{bJigcigcn3Hy2?Lp%T1ignCz&{{@2E&uCmZi?4}lB{`2r$SIr727V6O|< z+C+QNPJ1=orh~$hQe5ASrt;J?v<%8{)p7b1*lU+$V#DG9_@c}9r7c6*xZRS$Cvwv& za=uNN2XbHB2*mlF<)g3tRr^W{>t|H;W@2Xz$;*pNL%d%rpJ@5zpfFP~i0xI_jvMSF zY!qjrHt}Lu+xKx6RJ`ph{<|PEggS;dZMFRrPLU?zIT=Sra?rMMkLzm{t?BdZX${C! zitCGz!YTA0ua;O*BeXX2{VWky3D{nlEr`FK2^znv8KCFDfAWS)P{ zpR@uqo?)itfM}}!D7Pr=sCR^A&4NAUcBa`et8=~;00GS>5&^9* zFkRoHqFmQc3H%Qn{+MvB&h!n@O0A%6s03}5&Z!033JaOVj%Eqxf}oxbwgorCfwntd ztS#_NY)T;S8$?gcoA|uJUQ!+l?(kJncJjXVDCX(Ypx?8d&$8+^mQ9=&sEpl?eHPWc z@jGzvbBW!Z{6CrC&lsP?>&OQ(oyu$g*VDk3fR8gKetcya8!eLL9{IR4y+Ex6$h*3v zo{`FQj!q1_!$rQ0FYK?sQo%Ur|5$Ni(RzH)XkyV!t!$O?`%L-s*^&ber3R6!lm^}) zoI-D2FKa=s$OFEG%6L_8>W^}h25Ws!vq6zbn*GUcwWIno^@8l=(0i;BS>9r7t{Tdu z%H%z5KtJs@yUpNttIiR*4@VN6c^&_OoWc5I*eT*a-e16 z_LSa@Hg7&yTKsh;4NjENewV#%OfvRJ8pf?a-xXv>+ykWEG^{E=*z|B_*wVKK$K@TX z7~HCb;yhjoJhe;Sm-6vss$!oT6aa8(#Zvkapml`&Wd0}iDwu06! z{SvJ2ahqVdr6kyAB3iB`-pkq(Yu@6<-yXhUTjFw3K>7spdB>mFDC)qG6$y&z)~GPJ zWoIzZ^MY*O431H~U*azk$ySr$?Zui8fM4F1PvSm02Fu?snep8xsjVzx0>UG{ny5Mh zPgqWWm6z-We5%ERIHOA5PFm`B(nrX-><*hx^w}(}bf{bg+f?*!)|a^R6nL>jT!wgg zRF>OaUV`41dHx70ymZZLr{ogRbpjZ>7Z@&O>v_{%Y$;x#3f$SuU_sc#F2*}#ER#sD zhM&MxWs$ku`BL_>bkH@{)$_^&V6S|hJHbXrZKx@^8H|@{^eV2g_vEuU4^Q#2+~W`U zG~0=_J_YB;kgdzsHlV7CflfD-b_BIJEXMs4QIn6u~FIH4LgSSQBmy5Pi_sfa8fGU z2D=j*93R#O8=n`K$-Xiy8Wi?&$+K|*nT1EHY}e$=IH&Zao8tvF=^byh-z1A})YoJ) zoWWKyqo%N(hozmC)=094k9cWtY9_eAZhZe{^x&Ur*HlNnfL+zs&+t^;vA2)uJ-vk2 zj>4T(5~{&pE+EtDA&*K4{Jlt4JUyF_sg=Accfw}83YYUNcO_1HS-Q(8?5T=p^6bhq zX6XL)Dr9+~V_3-{SBy}=e7Sz$jJ~bHN<-z|eQ`yi9XC)7L6->U)iuo>?~w+?PQyW8dhs+&vb;#La!q_FX?#fiI!-TssW$Tc6?2?&-tJLngWbBfz zO9q#$HMmS7bIVMbCS;kFXV~9s+Wt}Lk?oyJH<*y+uB%!3?`KA3s@1CyKX2sd5o1U6 zA2F=&V*^Kz88Tw{sLXspul)SYupwi|4jb5a;P3%M`VAkIWk#<&{NdOqM-J>eX2??m z$BfGQ%&2U&dS&Mi#|$1ZdhDp|9kTSw%D)X6K6X@&4%vET%lH{1h7TH*vqQFVdnd`OX=3u$o)uSJJ~r{gnGfn=$8 zWO#2B#I=K3;jh7VL|8uuY0*^VGxg%%gF%*t$fRUg1gYQ$t?v)pL>~w9!Y%yCAf#Y% zvU1ps)o7!Vvsf`$F|8%#t^bk-qRp&}dm}kK{4Z)Ae2ws=S}-uI6pu{r6Xgq^NZ*MN zaB{L$cz+nBtqx8HS6Cz0BtYgA&qSKCHBF*j4A|Zlmk(wKFS5RJRQQ2q4o3##!Y9I9 z!Hx7QK~n^I+YugK4Q7Uofe zWS6yJal~w!5C@it>&LGjFB9#Js)x6;Ol(^4C}NnNVTq_~JS4aftc|}xV3Qv8h;{@| zAa9%>KM|e@3&iR1yJ-^diMB>L5M~XHPX%H4OHe*e1g}JWqXSW<^pSC$XluL=iCO<3 zbFeXZi^Y>qAvl~IZ3#EA#;!m#I=v6VuxFFklNG`mQJ6dtym0(snR;wj@Kki#+JuvW zYr(LfYFIf~mp&zI70r%|A}sqkx(hMUchT;orRNCx$K}FP$Cd^+gFR`}l9S?DX}Q9= z>DdqymJ7GW)xsRnnB>dB^U?TdL$EjaFlZCM9DK@iq=L4{7Pp57Skm@f)GQtr+`|I8 z+CjH?O)?L%snN;*(z_r-suRu*YQ`huMXf8OABiSMGm>FkmL;KwqiifXx`5cOUN9|w zJ{ldrA8bqRjQ$Ivux|W4=e`z^-d>h2{}yzOgK!Ru1@|Pgg!e@g<14{G@x3fvJ`&W4 zvmURG(5_R^CBu5+wD6<2cThdJoGcy=NPffnE0^q_z6Ig@Z)Ejf3GCzL zs5-0TUJJ^ye)qwkx!n`x3YLet!_&btVNNWt3AVd0J!hB}uS|b4xsV>m9MOrOA@<$l z_&j8NmyjpV3yLM{hI^uyqVJ-QqMXr@v}sYx=#%)Fa7Oyj!RQ!4JqhN8kF{%*X8_#7G=6ZW4-o}!|X+gE{W8|7kk*uzZnuag49wI`Dyba;i zzHlMme<~^wO0s^uD>#N7t`4$?U69p%9ytwPo8lJHgGj7P+wf?&d@jS{HzH(CVZr!$ zzAt+`Kgbo$Y86<|Xpc3BQZ&uIA0LQsk2|wOIeXYIUW>r1TQDrSn6nxf4vgPSD;d%Oy+r=H@SA(?VGr54TuSD4x zcXf~@elz0_f2;Ys4Ak;h;97>;xcSz$t9uIe>mqC)(BJ32tg@ty+ zE0qcl1UHU%L)be!dM9WQZ;pB#AD;GgvJjHk&e40(bnLr%)F6H?YMg%hc(*W5+JN{_ zvH`8O&%}3xy$~PH4|Yd8qJrtyqupUO{A;yj&M@Oddf-WFr*8^6g+-IIgU9f?UGNxn z!yB!O`hUp{$4g^lpB{ZKtQTeqe@;G)pYd@H<-#^%!T z_HZUoIWjmFRY2x>D|aGu{3vbum4ZuA4wi`SiymjO*t_Y!CEJAWbEh{WZa$xWBshgN z)s22mzk&#_RJfl-#Kpr!i1*$M53;UxO0XjNQ2NH?)}UWlg<*ReSwj4JTru7rmqo<< zZ9FoF@EU{DUx;5q;+zBV;YpUr&c=hK#s3BqgM;aRM4f}R!4Bfdhsis`-0_b=v-lfC z>i-70;#29rC%=yVj{2vsWHIW5WRrlk7z_yMj1;(a_)Bz4I5-+jG?8@`@iD5?<_ zM%ukI{mZCrJT|O~2(d`;62jEt@%z!;;fGN-PP=f_UK@murau{HK}cLMDueL1J!0>N z@x_N)PvuVw#UsM?(Q{ZqjbLH4JUkiA3&uuy($57&!n5gVERQT6orzK*ykL|yUKalo z^^R_GgU6;n7T%e>$W8q-y?6Kyo~TKbN+QUn!S=u8A5qTaxwIFt-_^(4N|o^2s2p+b z=jc*2Aij^G20upMr#C?S-h>6e|3#C-&B2oB-5_V&E6fvLN0R$=(3j=QRnsel)x&?& zHbirdeip1E-Ix%TjpwI59-K!cTRXlhs2vmz2BjU7EYUr9!vW!(I8XeYuJCV2oAw1m zNi>&}dJpvyHcWSsE^pTRNY7UKHhoe~X)6+hGX9_5LyJUbT4A&4X^QGU7)hsprF(3M zH?Ua{W6y=T{Y~hS-xz=SdYn0401do3>flo$Q!7#eoWo$3{JItrpp)K1JH|s;S|ZAf9vU zL766)B`2Iz*0K%go#miSnoi;?EG0TMn_%n!}7LOk|oMdw~|36iRFs7S4H@A%}#n}|Bj~m zWx;%!j{0c_dzrNZG`Y$O%T2)pi7teG9luw_huS@Sir+}3+Ub56@02~R^r3k57cX?J;*$bTKKz$wJsIhI6Mb;YIyaXv3>JpnT zKgcGCxbo2E)wK`A^kSRp3!!={P`Ef_vmxdO@hPVHPhnO)V!8B)Ob%B`BS%~i@6lY@9I?JSQr?Uo(5*HS`&dV_*F10R-TW-?JsDQge|e9`5SNzI zY7nk7e2d)-SXKgI_dI`gd)x^^tz>*DY$JctDEfo^9%TwYwV$NDHX{|jgH!v^XdjW~ z;c$}6eGozOeJ0daX6U_#bew!_7bLeA)CpQqqOhwB)otO^G?UG?Jo>8jCjsqYMZA`j z@eL%HC#(dN^90Ir*`W9)OD-*@8-2B1;uK#Fs@sO322Ven8(J~`KHQo7*dFK1hd@Ms z1WB~gj*=)N#L~I87s{@cmG*3$*xgVK+4T?BX;jh|{2a7SjFh*Q zH`W)yi52k7%k&S8eSqv|EK}yh20bCy{A~ECRK>eB()Q39EESX=<7-l%w%&)JidI5a z-V#oLFwX>KJj@TuME+@wUY9$pi*C2MSaNgeMU%qxpfo6cw!R}Qyt7UC(G9XB`aIrd zW8^*iQD~Kw9+Xe6N?xn&*&(p2**PmG1M!p}SVb?dtZ4Ea+{l0IqLlL7G85tJyS7a? z$ANZ4ZiVm_+G2>kgyrP)P1Xi~lEXX2TO>_8hfm5}8*j7X9NebgWRR4XhWys4kOpTd z!qoE*`0r!(gRG9TAuoNz{|hU7D*RF|_^G%$l*JtVnuQXT__}S-R`=txcZJ({BfnET z%16ul0=vdCs+485NisyQLSJT#;Lcd;bV`Qv{xX&t{tC&v9fEKRWM!o=r~FGpPZ`bO z2jrr+^OtDvU#_p|e95VI`)gJjLUFB}WYF5NFx|dpyveNyuai7yPQR7*hpkp87)bH( zG41R%DDLG8OZqlT^Zbw_hl7!n8tZYwx9V|d#717zXE5q8gnT^-jlEvBY zS{i@1*jI-I^j>L6Tk1^6^RJ|?=ds%<=wINcWVi42JBke1_*CB`c&`Z!RVq zTAFflW;+|OY=VU`uM-2-`ba#?9SroG=+AjI{Zqe>=gWq$g0{2RP_T|K`UuW_JAUilusfX!3ddkUIIF>k=OI@Y+bO5r=92f^enBko8!AE z8_n}NdXIGU#XgZimA_ja-%2!^DZ43~(TEf#Wh3N#0qlC9Y=*$hX&0dz1O1S{E3CzQ zh1S5I?}suBeVJe5rWWv};X`@@Us+PKcz0=`3<#x}Fgxr2X6sS+pqh{44O!U7GyAu+ zB^T9iDd?ssL}e^kE#zO=VZYx7>p{yRvy?Vq&6?UFPx4u^BwpaY>{G_zLxFzETRJcO zp!;gcDG4C)di#0XOj&WEw(u1cf{M^)v{&!_IEto#}T>CV=-^A3UUvE&M%20 zuWKB?B9|y)Y_S>EIo_zObF=Dk7R^Kf^&@NJEy-9P2D|O%3=VVdtG#k6vwyB5h>nlb zYLUn1X)ZZq-{EO~LE7~tv|&EG+asgEZ!C&Ih_O{>#g`&vhoGTPY3+L(Vz~%(c0e}mQRpox)g!j@UWj`A&O))hxZ`TiN8ggbOHQD8OdxRah7Ia zYl3AWt)S~@p;e#Nn#yPP+1o*>W8t*8rC4J z$Gyzq_t-wG5TCZ^p`vGdcU?~Gd@1h6Xvw?rgzc=5=hTuqnfo_H^4M)*8Y^tdAY4Bt z%ehzWK&;P1y+GX^{a#A0e^^ufM;6ks)e+xQB5r3jysv*`9jqA9VUHB@D*Bbru)N^x z&^!5d=NyB6A z^SkVtt?{?C94PrEZ6sIa^KeU0+ltz(aC>-`H6TlEGd{7d_rTLN_o;EWxGm&;+wci# z#>lAIT0+ZuLGWvJ{}*3-KICReUEb$$%7eo-4Y|c9M40xI;Jm!E*ZJfq&s0QpjNh!A!pi{`r`q*e!hRJ_&RN+3X6wW0#-7!ZH>? zHjuzq`Xpl3Nj*ig+hu&|HKNC{xGKfgO8y%+byVU_T`V)LnA}ep=@@pDuG2Y%3%vQ9 zn%8@A`;JlGuFRV}Wa}-)YIoQX8AnSS*jvYQPa5bXUBMe2MocJ!cdfxP zl3c`^PH|@223~Az#pA!@NAyK$O2&1bHu$MQXDoXzIYcGicUch2f700E_*rknIc<|r zxB0L3sXR$BxQjdqPTd`*F|O<|H*d9l80P{5XQw!Qm*@4b?K5lYU9_)e)|}QD>GsR^ zr2hg^p8zIGcPF2j5!bZ8qPE28BJmL3LU}2T=j@nX6*<6P@>aBlg8Blf%WYU3o)EQ( zWUy1PiWlXf_;<-K*WyHcmX?K`R?bVye7T={mDD-J;Nm>r&G2IS_wXxIt+Wln!~7`N zw(h3!xQZY05pgG-%{$2l+TU&?Ksc4OUVPFTX=C4uFz|W%jC^mTyv$AS8ujNX&c$1k z`{Qh03Y#e{D?oe;y3JCx zFid)FJkn1HeTMl`$)iUt3um=QThp>LnNsE=GKlHc#kUCs9_=S7pC2ET#YCJYWckZ| zu&$y(`JkMZUWseqy`kQk*3F@|Nf=)PW?ZHHbgwVAucWru1D6i)+^n<7Xq$1e(6T-m z#Pz#8fc17GeypJdFxGzI5*uNM$pgmgbjv6J57dlyno2s$o6q z3kG-O^@54K{&$?x-@^?&!JM$W_Xm&W_YK-ccFW6TMF&Bp#jOPydXD5pt*i6>82BPL zvdn3`#YM=0mvE=kWdXwJ*<>GUb%-_$Z&RuIh{N z{xGxtkX!{yp2o==(J*sx(z1Z0wo*F$hVt}0FG7pXL8$_tkrQvWh~HGvY2hatd|`9E zo({%S9g458E;0|r&puubj4+X9!Jk#hzJA5B#I!uIq~RAvHhv?s>~8x9N!EH>B}4p3 z^f0X;e=s&=bG+34wO_&y7@-DER~w*d*P<0 z!Uc{buUgKn>|{%P8qK?hl04 zTlQ%#(BqrDt<5k(bBK?fwVXU9dtl%yNo6E2U932tuz}SkGoR((25*5?uKJS<`bf%P zoo`PPN0<6nR)y$zMXs>m{w*7Ty!#W~D1U1NKRHXE0Yy#njk;J5XmKm=mnr1W1f_4M zJuENy??3FjjU=q8JR=*(XO_bb{EQ$o@?846{HM?Aj_@UUk%sEEY8;gS;U4$x*_7k?-X3W7Wgs`mi7Hiir|h9V9nS zOVjL7&#Ta0HbEskGEE5qemuJF@6rv?1kJk2<;OfHM z^C@vzD^Iqx&L)Px!BkA5LF^Nnhxe0D751;w>w67u+0QmZrg^crs~(Ws$bzfLIh)V@ zSY;2&T)4A-uCmRxgYVG_jXoHYZc#F34!o+DK3lRTs|1q z>ZYvYEmcjOv%lo9<@Q$sM%q|+GUuLpHhP$^sOb0Thj`tQ{HHiML=7^XDKI5v@rWPA zDWdiU|CCSLUYh%D#Mlw>DI1{~!{;}L`E9P>;yrZ~tNldtAcHJKdtihAMW?rEwYti? zn{NZ;ZQ9pXMW<||&6Mp7mMnoR)%jMlz#FKvH?WfM5<3h4Ek%=ZfRJtKNQie}h6tK$Qe z_IMw|r+-7r>O6Tc{!R9BFBh2T32iL-seG)3i^!(sh_W5XU%Klf9t3nD$c6Y#GMAiw zhwg!i%;vj<;Z1z!P-0Mdu*@xDqr7#7bfU#P*ZQ| z;X9V2ixzyX+($B$Kbe?iTU4N0EGH_4P2u zjNstpB1zgwTIV0LOTrmRfn!B}>b=$DoH?AlcmbN~J#cn}q&{4Wk+`Hasm=@Xjgl!YZxq>*8LL#d~ES z8{SBL;zHKcMxw`KdQ5VM%j_egw&WjLC#p=Py{NJt-uhVu{S<7lOiJie!Br^=Dp+8h zvC+v^nK*y1COEfqUPw0*eWzmWzxfruqOhJL7PR&^$*;?6M$X;d9C5(!dK4 zCkk0E?d}cytWSx?T26BA`EX93*n@CT8@!ZWOP|0PgA;OAkW}d$shP;9>xqCvb*~=r zX8IWX?R#+_U&7gE^9A7elq`{&>iDqx{Y!1Fj2ptTAD70oUZ%;vzAPTj*u0;04ELrv zOj4QfC^;jns>Pl)bp%$TxPQTkT#Gl`lsK!hat%+HL-Qt*dRQ0XDcgE$5aZ!+0GaqL zFwE(8r|;MK@;VW{pv;akCw56C@2Ig{mRyN7GKvg$p6nGC8-r7t>LfDH3?%unT(*ox z$?CSs@AK(!J)3oMm>2sjzKu5HVeVqU#q)ZrJfQE$VQRL2T5TA+p42TfmVW;WZrE(| zy>0xEmiOnv>YPJKnDb8Y<5X;DC;{Wvw-?h(f=brF8_vLfig|r<%_1`V_;Yd=zi~ei zDGoAhq6RsrN-GLuvP@v?;lWmn< zaBI7*D!05ZQk#adfsx)rG@U`e12vnbNe(jYN-mzwN_sn;Xs^Vt@{pM)izv)tC(KHz?gwBlf~fV$wkxHWZ_%o=-rodjMyD3f&tccOvZ?lqC2 ztb%{YNru`xImu>f6D{LqVwh`fY^8k*9)B4b^O5jA7_RpA3$bUEHl|zW*I)sd=xh5_ zPFho>KBaXjng3y$FKhT{T}Q>@8?Z)gf1L5I-^p?AQWJjqpO&55okNKOacmx*B zV7#|@=1X{tVLG0XantN&7{VUx)s6? zXY$A!`%Z9bT~8|gge+u` zO{Uhj-08KDRp79s_m)#~$nyCcHXjS^7UV#tk&=>}|D#ytFATOGA1<`#?H+t~7k`yI z_NY}=x|YZj9?0-VAhR@n<3wzshUV2tG zG0@arwjQb4@}!nk#(L^T`-k6`uAxVkk^R3TZQubbfJPqmwlF$*y%0Wfj?w%b%m=;x zg|KCV9FKc(Zrik|_wpC5y1xvL7-fe+tW;fM1GW5ML$!>+a!}Eqhd;~WyMl8JHJb*S zEP(GRD&@h}bF`FHmD=)(<@J}S5w8ialOwOet9)bYZ64gt27M%6MGr(N-6)5`$w(w> z>Z`=f>rw!Atr-=?59nW+mMrES<8EXDs?u7)nqwR&iA87y%BltC$`9Xf`qesM}HPS(8ROo6uA$-^RH|* zq_~KE9uuU{K9bYzt@Xq0HqxFab}|fAuYqHJjd$1?!oL@PoHCG%Aay4+2}Z{3BQuTc{L>;{ZPj0Vqegz zrPc=#-E(}SzCnb#g|Vo!ZGoigQG3K0v8oTsvtXti-onRuKHDy>c=K)OU}-78+D-eB zE|j(0!qP;D_4*oK<`aFBGi2SnZt)6adqia^of5LCI{vVI;kQa$>pyXq61c zLoJmwGJ*eWq-XcX?M1x#1_sN_W$5s@8 zSnFF+eXmReZ{>sZC3EWdUx!oa_UY-fq(=A=3`iMIal0Rq2|6g=6&}VedvV`##!u@( zFy{z%Junze1`|+YVSzub545Obefq)8NSI+K1=b2&cb^TU1cL4=)nsFNT}2n49rPJbisS zGL{B?WCNMWQ=ZkTX~t^TDKKbNtd!q~mvPoiZRcztC}fFbj0k&88cE<~iE9TLWbt^AM&&!FY_zxJ zH6hx8xql~vdx?Iwe6}~}>WK1mrW^%dJg!sJ;}_^BQnI9+dZ+aQi9h98o$)@>1z(Uc*6Lr&nz&zIMmChLx53-C@$X@E z{|^7q@N+qGHV&O;4iCk?=O=9=A*9mtdwWCLKfa^M;Py%VLNR_b#IyuCn6W7_BPMk zfNZMp%#*Alh@}nPtgY1=&lO0Y+&5K$bw2>V? zaH`)BdQMFF@E#48Up9u!9!<&qyzV5b7_H)os_ghi@Cqi}#FLpaj$LApn+WD&D zeBWjHGda|cN_BZ8cpG0jU5nrW@*#_yMXb#4Yve8liS*QkAa35K4$zDd`9Ht`)bvh# znlk*|B&0{}b*CL7rY;2S-yV0=CDNWT+iz$)*=rZ&Q`=8IvRxRZC&lrHFUf8xZl&k&Qkb2yp5v?W8QaKpMk5x@>mmJ2lQ{Tkfe)sWdF+ylWPQJ5mkYzJiRO5xMxGZ-n1^?1D~mbj597MY8$mnE zXKx_F?P)c2B{lAPoW|XH+=}=(%>qVkEVIc-^5N;0+y3xVYAU-q(aJ=}V_}LFk9oC6 zTp4_Ho1UbDrZthGp8kMWW^@!We4}RttKaYaVDEc^P#Za2i}C$bPHKC3(Cyctp{X*4 z3Q1mkM{fTr$ela`m$)u0sYC5PJ1)(Gj3Hcsu}W4RwWG2jy|#WK1I4Wt{ms?6F)!d* zrr1f@BD3*E7di7k(u@1O_G$WRZs%)6yW%j+b!DMu<;(|!i^D$hd%T(jzFWzP+jwss zDy4ml{VChLCOq;Wsps9n54jmGTEd&hGrc9Bs%(5Ju8GgN6y^Ylbnw~m;17XJXM$Kt z^3NyX2*1UvHqrTd&}+%RQ8my{6Kw2W-y-8QAGNDz6cg0&hm!6jd7;^^s-9p_Q*7O8XX&Cu_-!Nhr-O~6`l~g1L z$^16UX1b<3@g&vklzkUYuoRwlr0;@d+rild`04CkkjS3bPr;YJ8_bsqnvV50u!BZl zTq-~H&dL1yV!t7k@qzE@Lt*G=q@(rqHPi))5Kl8itdSJ-XS9Z=1-YfTt>d1Y;VF+u zSNzz+WJ0C&-{fAsD6f+-eHZV?>mI-xy(A~KDsQk^EMA$sbAUfet>%!n)e~M8mdtbu zk)<~`raL~SDKX|5f64m8y1$a%*$T;RWQm#dsVk7c%s8$Lt+ll<0Nx@r5kC1S?iQi`g3SsQMvvDQ4q ziyB%8w7p9nmW*Dl*Z+q&YI;?#sr6)S+#Y7Ox-JOGDQ&a0vv-3+AjPZX?0Y=MAI|2D zze&~VVPe=G=?f~JV#Db}SP0Kq$;<0~lGArkM{jTU$h&kO7W37%)J74jCrLG|r8&rE z1ox^UD>yQFVLa0H^h5TP?X-H5Nn|6o&hQU5MTrRWhU82@XzH8*Izm^9TK_~WPO5oUl5v4-JNyv^fu&m^dt zTmgeMgEgrH_ckG(V)Z3gSj8&K0C_~agMw{fk8=74o~3GA4*=4LF2-nOka z4F2g!JXCgY%~G(%ZW*o5$cNEiaeti?-bi0Z1~^%cSyTTBpI%GydlN1Af5emjFPh1L z;~tum>(PN@`wi$fw%?LxmeiV)cg%=!qx%o+J9gj`W0%Y+(|z#3O5?^199?P1m`eRB z-8Oj0@PT6nR(iDG@CHlftjq|=;||JR>BJY?Xo0b}}(890`| on!lvh;Czpq&zvdKf;q+huP+)oddOq_#tzK*=5Y^=8PnkZ1C0joK>z>% diff --git a/examples/data/mem_cube_2/config.json b/examples/data/mem_cube_2/config.json deleted file mode 100644 index 7eebea3a6..000000000 --- a/examples/data/mem_cube_2/config.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "model_schema": "memos.configs.mem_cube.GeneralMemCubeConfig", - "user_id": "Ki-Seki", - "cube_id": "Ki-Seki/mem_cube_2", - "config_filename": "config.json", - "text_mem": { - "backend": "general_text", - "config": { - "cube_id": "Ki-Seki/mem_cube_2", - "memory_filename": "textual_memory.json", - "extractor_llm": { - "backend": "huggingface", - "config": { - "model_name_or_path": "Qwen/Qwen3-1.7B", - "temperature": 0.8, - "max_tokens": 1024, - "top_p": 0.9, - "top_k": 50, - "add_generation_prompt": true, - "remove_think_prefix": false - } - }, - "vector_db": { - "backend": "qdrant", - "config": { - "collection_name": "Ki-Seki/mem_cube_2", - "vector_dimension": 768, - "distance_metric": "cosine" - } - }, - "embedder": { - "backend": "ollama", - "config": { - "model_name_or_path": "nomic-embed-text:latest", - "embedding_dims": null, - "api_base": "http://localhost:11434" - } - } - } - }, - "act_mem": { - "backend": "kv_cache", - "config": { - "memory_filename": "activation_memory.pickle", - "extractor_llm": { - "backend": "huggingface", - "config": { - "model_name_or_path": "Qwen/Qwen3-1.7B", - "temperature": 0.8, - "max_tokens": 1024, - "top_p": 0.9, - "top_k": 50, - "add_generation_prompt": true, - "remove_think_prefix": false - } - } - } - }, - "para_mem": { - "backend": "lora", - "config": { - "memory_filename": "parametric_memory.adapter", - "extractor_llm": { - "backend": "huggingface", - "config": { - "model_name_or_path": "Qwen/Qwen3-1.7B", - "temperature": 0.8, - "max_tokens": 1024, - "top_p": 0.9, - "top_k": 50, - "add_generation_prompt": true, - "remove_think_prefix": false - } - } - } - } -} diff --git a/examples/data/mem_cube_2/parametric_memory.adapter b/examples/data/mem_cube_2/parametric_memory.adapter deleted file mode 100644 index e069a4b09..000000000 --- a/examples/data/mem_cube_2/parametric_memory.adapter +++ /dev/null @@ -1,4 +0,0 @@ -Placeholder - -Once the parametric memory module is implemented, -this file should be replaced with maybe a LoRA adapter. diff --git a/examples/data/mem_cube_2/textual_memory.json b/examples/data/mem_cube_2/textual_memory.json deleted file mode 100644 index 7a4432413..000000000 --- a/examples/data/mem_cube_2/textual_memory.json +++ /dev/null @@ -1,1592 +0,0 @@ -[ - { - "id": "a18c2ce3-7824-41de-9f67-e6ef9d7c66e7", - "vector": [ - -0.00014818651834502816, - 0.08681453764438629, - -0.20681676268577576, - -0.013103991746902466, - 0.05085381120443344, - 0.043568022549152374, - -0.022663237527012825, - 0.02298419177532196, - 0.001899578026495874, - -0.01179163996130228, - -0.046989526599645615, - 0.00014617355191148818, - 0.07312055677175522, - 0.04532632231712341, - 0.007967920042574406, - 0.006418320816010237, - 0.019739458337426186, - -0.060413897037506104, - 0.008398447185754776, - 0.02717193216085434, - -0.038277287036180496, - -0.06996751576662064, - -0.027262073010206223, - 0.0319170318543911, - 0.053406864404678345, - 0.01855497434735298, - 0.048100560903549194, - -0.01161869429051876, - -0.0850091353058815, - 0.027527227997779846, - 0.0007747603231109679, - 0.01134356576949358, - -0.0555138885974884, - 0.0261530801653862, - 0.033080343157052994, - -0.03019297495484352, - 0.022144827991724014, - 0.050229962915182114, - 0.011134911328554153, - 0.006926852744072676, - 0.0679548978805542, - -0.02608887478709221, - 0.005319757387042046, - 0.0027378054801374674, - 0.07804228365421295, - -0.010697394609451294, - 0.004406045190989971, - 0.024699222296476364, - 0.03306689113378525, - 0.010330736637115479, - -0.059429340064525604, - 0.0549667552113533, - 0.002089115558192134, - -0.044180579483509064, - 0.0845041275024414, - 0.01005307026207447, - -0.0017150044441223145, - 0.03251068294048309, - 0.038654226809740067, - 0.017765911296010017, - 0.061431240290403366, - 0.0201454758644104, - 0.029097145423293114, - 0.07558012753725052, - 0.056120313704013824, - 0.018932050094008446, - -0.01603352092206478, - 0.055393561720848083, - 0.0032458535861223936, - -0.0796804428100586, - 0.03546201065182686, - 0.01574140228331089, - 0.06272733211517334, - 0.04941656067967415, - 0.0022506709210574627, - 0.0027206926606595516, - -0.02735859528183937, - -0.05224693566560745, - 0.025996549054980278, - 0.05513250082731247, - 0.03476572781801224, - -0.03194168955087662, - 0.01705862209200859, - -0.011845375411212444, - 0.0795501321554184, - 0.018780864775180817, - -0.010017038322985172, - 0.013638949953019619, - -0.047666411846876144, - 0.021519998088479042, - -0.00109274429269135, - 0.020754853263497353, - 0.06266647577285767, - 0.06675539910793304, - -0.05058827996253967, - -0.020563844591379166, - -0.02274453081190586, - -0.019921697676181793, - 0.00865398533642292, - -0.04477572813630104, - -0.01218259148299694, - -0.014905819669365883, - -0.049729809165000916, - 0.008558779954910278, - 0.04270182177424431, - 0.04889139160513878, - 0.0016067929100245237, - -0.04244951903820038, - -0.023060910403728485, - -0.05268606171011925, - -0.00012061429879395291, - -0.017494287341833115, - -0.015545113012194633, - -0.05467086657881737, - -0.0033326249103993177, - 0.01810845173895359, - 0.044591739773750305, - -0.05597468093037605, - -0.03234736621379852, - 0.037201106548309326, - -0.029020339250564575, - -0.02119547128677368, - 0.009818792343139648, - 0.013432457111775875, - -0.006349821109324694, - -0.011805719695985317, - -0.043579984456300735, - -0.007044253870844841, - -0.012137891724705696, - -0.018680734559893608, - -0.0034931646659970284, - -0.004471060819923878, - -0.019593223929405212, - -0.031462281942367554, - 0.00976460799574852, - 0.04755682125687599, - -0.021012960001826286, - -0.012017159722745419, - 0.007173294201493263, - 0.013452270068228245, - -0.008074294775724411, - 0.007978463545441628, - 0.03576074168086052, - -0.014899522997438908, - -0.021684955805540085, - -0.03905675932765007, - 0.06881406158208847, - -0.018583590164780617, - -0.01600123569369316, - -0.030609719455242157, - -0.02003449760377407, - 0.044688571244478226, - -0.01380191184580326, - 0.023758018389344215, - 0.0336030013859272, - -0.06680193543434143, - -0.006954998709261417, - 0.00254152063280344, - 0.03406456485390663, - 0.009776155464351177, - 0.02960142493247986, - 0.007331789471209049, - -0.02305479720234871, - 0.05021728575229645, - 0.018150033429265022, - -0.06408998370170593, - 0.01539584156125784, - 0.013482005335390568, - -0.0004569741722662002, - -0.02638716623187065, - -0.015325665473937988, - -0.012921432964503765, - -0.029986094683408737, - -0.024684034287929535, - 0.005059847142547369, - -0.0768992230296135, - 0.016934597864747047, - -0.022273538634181023, - 0.00020065580611117184, - -0.06399421393871307, - -0.00016717147082090378, - -0.0480651892721653, - 0.017821049317717552, - 0.038031160831451416, - -0.024721186608076096, - -0.005311005283147097, - -0.00560294184833765, - -0.0224751029163599, - -0.013713419437408447, - -0.03435273841023445, - -0.019131431356072426, - -0.022047780454158783, - -0.04225388169288635, - -0.007644690107554197, - -0.06921757757663727, - 0.0003072426770813763, - 0.01802380383014679, - -0.0023877096828073263, - 0.03132440149784088, - -0.016250327229499817, - -0.02099924348294735, - -0.031041791662573814, - 0.011189958080649376, - 0.0020591672509908676, - -0.06083563715219498, - 0.04059690609574318, - 0.020018747076392174, - 0.02554655447602272, - -0.0206780806183815, - -0.0027049260679632425, - 0.045213595032691956, - 0.011424008756875992, - -0.025692787021398544, - -4.859843829763122e-05, - 0.006532728206366301, - -0.032235607504844666, - 0.027260659262537956, - -0.06041350215673447, - -0.030185865238308907, - 0.011719160713255405, - 0.03585655242204666, - 0.038815852254629135, - -0.02353857085108757, - -0.05020734667778015, - 0.028778648003935814, - -0.03367644175887108, - -0.07198009639978409, - 0.0006536028231494129, - -0.048022590577602386, - -0.007659787777811289, - 0.02746856026351452, - -0.03435167670249939, - 0.0561370849609375, - 0.027270056307315826, - 0.02719561941921711, - 0.04663369432091713, - 0.024669848382472992, - 0.07791226357221603, - 0.02643936313688755, - 0.047239623963832855, - -0.011974561959505081, - 0.04813205450773239, - -0.021562155336141586, - -0.032725296914577484, - -0.02511098049581051, - 0.04053548723459244, - 0.003210059367120266, - -0.0011876978678628802, - -0.011528871953487396, - 0.029262011870741844, - -0.034294623881578445, - 0.00643745856359601, - 0.057951610535383224, - 0.010749870911240578, - 0.04583483561873436, - -0.0279113557189703, - -0.06871405988931656, - -0.0022074475418776274, - 0.005717596039175987, - -0.01105948630720377, - 0.02511807158589363, - -0.04636146128177643, - 0.007751643192023039, - -0.037966348230838776, - -0.0393434576690197, - 0.02194535918533802, - -0.05478854477405548, - -0.009226461872458458, - 0.044889580458402634, - -0.018443753942847252, - 0.0279464740306139, - 0.04543845355510712, - -0.03533068299293518, - 0.07344670593738556, - -0.011943274177610874, - -0.05503000691533089, - -0.015542245469987392, - -0.019130093976855278, - -0.001687999814748764, - -0.005880369339138269, - 0.01134209893643856, - -0.018506351858377457, - -0.03456299006938934, - 0.054454654455184937, - 0.046674590557813644, - 0.03889671713113785, - 0.006740291137248278, - 0.0367615669965744, - 0.0068789455108344555, - -0.03455902636051178, - 0.028371276333928108, - 0.015708129853010178, - -0.014551428146660328, - 0.0009174310835078359, - 0.0011670272797346115, - 0.008046625182032585, - 0.006462408229708672, - -0.038506172597408295, - 0.0018585101934149861, - 0.0022026710212230682, - 0.01307243388146162, - 0.009545743465423584, - 0.06306051462888718, - 0.04060979560017586, - -0.06535082310438156, - -0.014391492120921612, - 0.05275454372167587, - 0.016640475019812584, - 0.010650021955370903, - -0.018457798287272453, - -0.0501379556953907, - -0.007801951840519905, - -0.017589885741472244, - 0.02107970602810383, - -0.030515220016241074, - 0.051360685378313065, - 0.0037130943965166807, - 0.020426368340849876, - -0.015300370752811432, - -0.03826352581381798, - -0.049975089728832245, - 0.005903865210711956, - 0.015326551161706448, - -0.0583341009914875, - 0.00220089009962976, - 0.05439915880560875, - 0.00478106364607811, - 0.041649118065834045, - 0.013224261812865734, - -0.06253284215927124, - -0.012881606817245483, - 0.03379691764712334, - 0.02967710793018341, - -0.0455189011991024, - -0.03239823877811432, - 0.06887175887823105, - -0.022121479734778404, - 0.024268249049782753, - -0.03818367421627045, - 0.01956542767584324, - 0.040425918996334076, - -0.01346785482019186, - -0.02009832113981247, - -0.05978938937187195, - 0.010985367931425571, - 0.005119467154145241, - -0.025031113997101784, - -0.0025458361487835646, - 0.08207672834396362, - -0.01369630079716444, - -0.03892416134476662, - 0.02387291006743908, - -0.036386050283908844, - 0.02843250334262848, - 0.0004545582050923258, - -0.031518206000328064, - 0.014727075584232807, - 0.04806468263268471, - 0.0037828392814844847, - -0.002694198163226247, - -0.002702610334381461, - -0.0025003617629408836, - 0.03688205033540726, - -0.0816398411989212, - -0.03445456176996231, - 0.07072345912456512, - 0.018157314509153366, - -0.005657431669533253, - 0.009721250273287296, - 0.0205300971865654, - -0.029843825846910477, - -0.008495540358126163, - 0.006358548067510128, - 0.029927914962172508, - 0.07804637402296066, - 0.01825663447380066, - -0.03337133675813675, - -0.08855056017637253, - 0.03792961314320564, - 0.022532790899276733, - -0.03952158987522125, - -0.006163773126900196, - -0.04312257468700409, - 0.015068230219185352, - 0.06167789548635483, - -0.012890934012830257, - -0.030775586143136024, - -0.04313652589917183, - 0.03397197648882866, - -0.014787409454584122, - 0.019541068002581596, - -0.05246260017156601, - -0.04059214144945145, - 0.02183414436876774, - 0.019671374931931496, - -0.03757543861865997, - 0.006572334561496973, - -0.03494402393698692, - -0.004371888469904661, - 0.014755189418792725, - -0.009366157464683056, - -0.027891159057617188, - -0.013619402423501015, - -0.039329636842012405, - -0.020809782668948174, - 0.000880005769431591, - -0.03791540488600731, - -0.051147837191820145, - 0.007026517763733864, - 0.006667810957878828, - 0.0319993793964386, - 0.05714735388755798, - 0.03169240057468414, - -0.04957866668701172, - -0.015389721840620041, - 0.016869312152266502, - 0.04888288676738739, - -0.0037166839465498924, - -0.034403812140226364, - -0.005219649989157915, - 0.04526256024837494, - 0.04159468412399292, - -0.0008332810830324888, - 0.005173653829842806, - 0.011768482625484467, - -0.049005743116140366, - 0.06968513876199722, - 0.05458555743098259, - -0.055220481008291245, - -0.05364776775240898, - 0.0024763571564108133, - 0.022233042865991592, - -0.021059352904558182, - -0.01864655129611492, - -0.035375162959098816, - 0.01695484109222889, - 0.06736589223146439, - 0.012959055602550507, - 0.010221510194242, - 0.10735081881284714, - 0.04766736552119255, - -0.0365803986787796, - -0.03999323770403862, - 0.010769710876047611, - 0.02801015041768551, - 0.05390840768814087, - 0.03418072313070297, - -0.07398323714733124, - -0.018320662900805473, - 0.0846564769744873, - 0.02666644938290119, - -0.0009550070972181857, - 0.05819438397884369, - 0.02858666144311428, - 0.06222475692629814, - -0.023938406258821487, - 0.025920573621988297, - -0.022009162232279778, - 0.03581433370709419, - 0.07543337345123291, - -0.0032695685513317585, - -0.004978572484105825, - -0.05269002541899681, - 0.043094806373119354, - -0.05155868083238602, - -0.015526512637734413, - -0.015746403485536575, - 0.0006137419841252267, - 0.04922552779316902, - 0.0009195932070724666, - -0.006088243797421455, - 0.0014861380914226174, - 0.01610037125647068, - 0.008700335398316383, - -0.012137046083807945, - 0.005856509320437908, - 0.02242353744804859, - 0.025594908744096756, - -0.007925552316009998, - 0.05298546701669693, - -0.024195853620767593, - 0.008802386932075024, - 0.010466594249010086, - -0.060855839401483536, - 0.03557940199971199, - -0.004853322170674801, - 0.025001846253871918, - -0.022692294791340828, - -0.020594319328665733, - -0.02098729833960533, - 0.0010235797381028533, - 0.030980076640844345, - 0.0160788893699646, - -0.01729769818484783, - 0.007491909898817539, - -0.05265660583972931, - -0.030526068061590195, - 0.036921996623277664, - 0.10260698199272156, - -0.030593153089284897, - 0.037588465958833694, - 0.027437275275588036, - -0.07764819264411926, - 0.015199156478047371, - -0.04475780948996544, - -0.03761841729283333, - 0.03695080429315567, - -0.04358711838722229, - -0.005232027731835842, - 0.013051727786660194, - -0.0652221068739891, - -0.0014317958848550916, - -0.00587367033585906, - 0.021343933418393135, - 0.04319430887699127, - -0.024249069392681122, - -0.06723639369010925, - -0.0014082591515034437, - -0.0061257751658558846, - -0.019284026697278023, - 0.034678250551223755, - -0.04256472364068031, - -0.030710529536008835, - -0.034007374197244644, - -0.07459787279367447, - 0.041044365614652634, - 0.004341817460954189, - -0.05087435618042946, - 0.030532917007803917, - 0.018922828137874603, - 0.014825941994786263, - 0.02472018636763096, - -0.08218429237604141, - -0.06052808091044426, - 0.039883874356746674, - -0.025411948561668396, - -0.05177348479628563, - -0.010561279952526093, - 0.024961931630969048, - 0.04723433405160904, - 0.003539702855050564, - -0.0443887934088707, - -0.02979755960404873, - 0.011395673267543316, - 0.056371428072452545, - -0.032178156077861786, - -0.025409547612071037, - -0.0022701185662299395, - 0.011937304399907589, - -0.009308818727731705, - -0.012952035292983055, - -0.08703790605068207, - 0.036085594445466995, - -0.0024018820840865374, - 0.014459319412708282, - -0.006194776389747858, - 0.043290622532367706, - -0.003006343264132738, - -0.027496658265590668, - 0.004780853167176247, - 0.002064133994281292, - -0.009165661409497261, - 0.023968936875462532, - 0.024225402623414993, - -0.030831830576062202, - 0.004631332121789455, - -0.0017960182158276439, - 0.005098245106637478, - 0.0005267579108476639, - 0.0017670787638053298, - 0.00786869041621685, - -0.04154907166957855, - -0.020401636138558388, - -0.01962113007903099, - -0.0076467678882181644, - -0.0024093659594655037, - -0.002900741994380951, - -0.02746458910405636, - -0.04989836364984512, - -0.05812697112560272, - -0.036956410855054855, - -0.04313414543867111, - 0.06614590436220169, - -0.0008205302874557674, - 0.0033787169959396124, - -0.014204291626811028, - 0.022689547389745712, - -0.003622337244451046, - 0.0036216166336089373, - 0.004587291274219751, - 0.042750030755996704, - -0.019731158390641212, - -0.03819429874420166, - -0.026425018906593323, - -0.00635327585041523, - 0.04153010621666908, - -0.04053881764411926, - -0.09006260335445404, - -0.021347900852560997, - -0.04550878703594208, - 0.020714495331048965, - 0.033079419285058975, - 0.01745889149606228, - -0.005874883849173784, - -0.011586842127144337, - 0.07546954602003098, - 0.03987284004688263, - -0.007525898516178131, - 0.007618428207933903, - -0.00857081264257431, - 0.02572401985526085, - 0.011006488464772701, - -0.006910540163516998, - -0.014199952594935894, - -0.0028257560916244984, - 0.0037281266413629055, - 0.06351686269044876, - -0.01983472891151905, - -0.0033539009746164083, - -0.049309976398944855, - 0.011200725100934505, - -0.07213462889194489, - 0.04278615117073059, - -0.020247289910912514, - 0.010428857058286667, - -0.038669221103191376, - 0.0022889073006808758, - -0.025221435353159904, - -0.01803858019411564, - 0.03955966234207153, - -0.01732288859784603, - 0.04848795011639595, - -0.07759911566972733, - 0.002019045641645789, - -0.049481797963380814, - 0.05602417513728142, - -0.04716067016124725, - 0.002953908173367381, - 0.024899333715438843, - 0.03263049200177193, - 0.0296447966247797, - 0.015267964452505112, - -0.025723839178681374, - 0.05478408932685852, - -0.028974639251828194, - -0.0649733915925026, - 0.06312545388936996, - 0.007411508820950985, - 0.01919778808951378, - -0.03883281350135803, - 0.09011231362819672, - 0.03965418040752411, - 0.03333790972828865, - 0.02109946496784687, - -0.0023626128677278757, - -0.014948577620089054, - 0.02523057535290718, - -0.03181949630379677, - -0.06588133424520493, - -0.05265666916966438, - -0.013588576577603817, - 0.03540467098355293, - -0.030422504991292953, - 0.021018054336309433, - 0.020585540682077408, - -0.015814896672964096, - -0.02282184734940529, - -0.01020076684653759, - -0.056113094091415405, - 0.0005867911386303604, - 0.06247446686029434, - 0.005500571336597204, - -0.03913102298974991, - -0.016863256692886353, - -0.010538125410676003, - 0.048870839178562164, - -0.015462870709598064, - 0.023397698998451233, - 0.017680929973721504, - 0.00027658449835143983, - 0.0069356984458863735, - -0.006307277362793684, - -0.025418346747756004, - -0.015006005764007568, - 0.007782932836562395, - -0.013030318543314934, - 0.030956218019127846, - -0.021668175235390663, - -0.006449995096772909, - -0.05420451611280441, - -0.017535582184791565, - -0.032649360597133636, - -0.009477375075221062, - -0.030590355396270752, - -0.0010781059972941875, - 0.03560796007514, - 0.053241658955812454, - -0.07196953147649765, - 0.00455763703212142, - 0.02562628872692585, - -0.015127687714993954, - 0.01660744659602642, - 0.02271897904574871, - 0.03551866486668587, - -0.020594103261828423, - -0.04081762209534645, - 0.02154552936553955, - -0.00822274386882782, - -0.019525691866874695, - 0.07081827521324158, - 0.006117234472185373, - -0.02004842832684517, - -0.007872833870351315, - 0.016467135399580002, - 0.06971383839845657, - 0.026613090187311172, - 0.002687788102775812, - -0.0269155353307724, - -0.01771080307662487, - 0.03915317356586456, - 0.033255111426115036, - 0.00895513966679573, - -0.08697391301393509, - -0.05353735387325287, - 0.0004304666363168508, - 0.04601481184363365, - 0.009510449133813381, - -0.0742233619093895, - 0.058216411620378494, - 0.01582122966647148, - 0.02487439289689064, - 0.02145479805767536, - -0.0418604239821434, - 0.01750936359167099, - -0.05784616991877556, - 0.032586969435214996, - -0.056191910058259964, - -0.028854142874479294, - -0.01923101581633091, - -0.016280323266983032, - -0.027397997677326202, - 0.013844960369169712, - -0.004715242423117161, - 0.07280199229717255, - 0.006397685501724482, - -0.0024291411973536015, - -0.020058225840330124, - 0.011785682290792465, - 0.061579544097185135, - 0.050988536328077316, - 0.028395775705575943, - 0.03388901427388191, - -0.035112813115119934, - -0.03574654459953308, - 0.007751263678073883, - 0.0027961048763245344, - 0.0007332358509302139, - 0.07736506313085556, - 0.06501097232103348, - 0.03663212060928345, - 0.016258226707577705, - -0.06033748388290405, - 0.021899687126278877, - -0.022852793335914612, - -0.024243874475359917, - -0.01975938305258751, - 0.014063781127333641, - 0.06713256239891052 - ], - "payload": { - "id": "a18c2ce3-7824-41de-9f67-e6ef9d7c66e7", - "memory": "The user loves the Eiffel Tower.", - "metadata": { - "user_id": "user_123", - "session_id": "0c3d29d2-e078-4a03-960b-563bb33ec7ae", - "status": "activated", - "type": "opinion", - "memory_time": "2025-06-03", - "source": "conversation", - "confidence": 100.0, - "entities": [ - "Eiffel Tower" - ], - "tags": [ - "opinions", - "landmarks" - ], - "visibility": "session", - "updated_at": "2025-06-03T00:00:00" - } - } - }, - { - "id": "fb778a36-e589-4c9d-8eeb-d0a71fd8299d", - "vector": [ - 0.004480202216655016, - 0.05571252852678299, - -0.1459483802318573, - -0.01775178872048855, - 0.05214620754122734, - 0.009841394610702991, - 0.033716727048158646, - -0.002695057773962617, - -0.008261723443865776, - 0.02454909309744835, - 0.02451859414577484, - 0.04001497104763985, - 0.07523179799318314, - 0.010006717406213284, - 0.008002310991287231, - -0.025942908599972725, - 0.045965127646923065, - -0.06163357198238373, - -0.05744066834449768, - -0.020451143383979797, - -0.10136408358812332, - -0.045513816177845, - -0.03524553030729294, - 0.015569351613521576, - 0.14741337299346924, - 0.0026899969670921564, - -0.03814676031470299, - 0.014447811059653759, - -0.04427104443311691, - -0.00569369038566947, - 0.03969890996813774, - 0.024311667308211327, - -0.015806565061211586, - 0.04403159022331238, - -0.06477811187505722, - -0.05386286973953247, - 0.02212199755012989, - 0.014319430105388165, - -0.010068398900330067, - 0.05820478871464729, - -0.02492510713636875, - -0.03617352619767189, - 0.00906049832701683, - -0.04641478508710861, - -0.009656596928834915, - -0.002129563596099615, - -0.012029718607664108, - 0.00089615787146613, - 0.05096384882926941, - 0.02056526578962803, - -0.05927198752760887, - -0.023188160732388496, - -0.017466764897108078, - 0.002514324150979519, - 0.028819171711802483, - 0.01697026751935482, - -0.018162215128540993, - 0.039723969995975494, - 0.058078568428754807, - -0.012202226556837559, - 0.09724543988704681, - 0.061307549476623535, - -0.05212775245308876, - 0.09393694996833801, - 0.020214123651385307, - -0.003840324468910694, - -0.01208204310387373, - 0.06672979891300201, - -0.007472372613847256, - -0.011000927537679672, - 0.041308872401714325, - 0.014655595645308495, - 0.07213673740625381, - 0.04308178275823593, - -0.00614524818956852, - 0.0123892892152071, - -0.01641017012298107, - -0.06865064054727554, - 0.04476455599069595, - 0.009394984692335129, - 0.019144227728247643, - 0.005437098443508148, - 0.058442622423172, - 0.04430445283651352, - 0.07940586656332016, - -0.0405590757727623, - -0.04184352234005928, - 0.008864764124155045, - -0.013958681374788284, - 0.0414588525891304, - 0.04803543910384178, - 0.033590734004974365, - 0.051831718534231186, - 0.0591830313205719, - -0.018059952184557915, - -0.02529069595038891, - -0.025169679895043373, - -0.0005466965376399457, - -0.034224580973386765, - -0.035634174942970276, - -0.03912504017353058, - -0.020824557170271873, - 0.016422230750322342, - 0.03996151313185692, - 0.08429194986820221, - 0.06527533382177353, - 0.03186991438269615, - -0.01285950094461441, - -0.04701145365834236, - -0.04601465165615082, - 0.012680352665483952, - 0.01979796774685383, - -0.02825329266488552, - -0.009361901320517063, - 0.009883522056043148, - -0.004993535112589598, - 0.01610329933464527, - -0.052860453724861145, - 0.0249770600348711, - 0.07637391984462738, - -0.06048668175935745, - -0.023170890286564827, - -0.012832199223339558, - 0.06692349165678024, - -0.028366701677441597, - -0.011747770011425018, - -0.05726175010204315, - -0.004028651863336563, - 0.015147360041737556, - 0.02004243992269039, - -0.05446050688624382, - -0.03807949274778366, - -0.04859624430537224, - -0.018399789929389954, - 0.026167239993810654, - 0.05793995037674904, - -0.03327936306595802, - -0.008954503573477268, - 0.013190233148634434, - 0.021699093282222748, - -0.014454199932515621, - 0.010314606130123138, - -0.01948830671608448, - -0.02884243056178093, - -0.027254382148385048, - -0.04524196684360504, - 0.05255373567342758, - -0.037941835820674896, - 0.013128630816936493, - 0.012621775269508362, - 0.048559196293354034, - 0.017742181196808815, - -0.01683860830962658, - 0.045779917389154434, - 0.025596071034669876, - -0.023669734597206116, - 0.018296202644705772, - 0.015945376828312874, - 0.029013890773057938, - -0.021061334758996964, - 0.04327778518199921, - -0.0311514250934124, - -0.06920473277568817, - 0.053467489778995514, - -0.02684958651661873, - -0.05714907497167587, - 0.048476964235305786, - 0.010153546929359436, - 0.014876001514494419, - 0.05453280732035637, - -0.053649719804525375, - -0.02711251750588417, - -0.03460396081209183, - -0.03524193912744522, - 0.005000296514481306, - -0.01845044083893299, - 0.011157877743244171, - 0.008858248591423035, - 0.061597790569067, - -0.015346557833254337, - 0.018686113879084587, - -0.05643166974186897, - 0.05684800073504448, - 0.026907427236437798, - 0.03227028623223305, - -0.017019527032971382, - -0.0134808961302042, - 0.006753101479262114, - -0.018214574083685875, - -0.019773125648498535, - -0.033820055425167084, - -0.03487953543663025, - -0.008591784164309502, - -0.06821809709072113, - -0.06988085806369781, - -0.006116657517850399, - 0.03503403440117836, - 0.031203875318169594, - 0.010620868764817715, - 0.020701078698039055, - -0.06537684053182602, - -0.01452913973480463, - -0.04646958038210869, - -0.010924293659627438, - -0.033150698989629745, - -0.007836250588297844, - 0.030170338228344917, - 0.013314859941601753, - -0.0523173026740551, - 0.004235081374645233, - 0.059376463294029236, - -0.014406684786081314, - 0.004436089191585779, - 0.02938416786491871, - 0.008365356363356113, - -0.03925999626517296, - -0.038582541048526764, - -0.07152892649173737, - -0.007819518446922302, - 0.041678622364997864, - 0.05185263231396675, - 0.0009378077811561525, - -0.013609186746180058, - -0.04482169449329376, - 0.006932408548891544, - -0.05620540678501129, - -0.07607901841402054, - -0.02436140365898609, - -0.05644123628735542, - -0.028081344440579414, - -0.03277066349983215, - -0.061191804707050323, - 0.060769982635974884, - 0.023242836818099022, - 0.032777223736047745, - 0.05571052059531212, - 0.023940403014421463, - 0.04708835482597351, - -0.01696104370057583, - 0.025653915479779243, - -0.013000570237636566, - 0.04544433206319809, - -0.028088456019759178, - -0.028979092836380005, - -0.030716722831130028, - 0.015160785056650639, - 0.03278351202607155, - -0.03816504031419754, - 0.027631893754005432, - 0.05481836199760437, - 0.029161201789975166, - -0.00677994079887867, - 0.04995576664805412, - 0.07703159004449844, - 0.03407425433397293, - -0.022890983149409294, - -0.04837774485349655, - -0.026344548910856247, - 0.033901963382959366, - -0.04309634491801262, - 0.07401593774557114, - -0.062434595078229904, - 0.030218742787837982, - -0.01573188602924347, - -0.028376411646604538, - -0.027505140751600266, - -0.031186873093247414, - -0.008132589980959892, - 0.01546691358089447, - 0.01581835374236107, - 0.04287463799118996, - 0.024830883368849754, - -0.026967940852046013, - -0.0017126408638432622, - -0.006244476418942213, - -0.007650549523532391, - -0.0006553737912327051, - -0.0066547999158501625, - -0.017436951398849487, - -0.016260333359241486, - -0.019290585070848465, - 0.010773723013699055, - -0.06089746952056885, - 0.030710095539689064, - 0.027424491941928864, - -0.01026857178658247, - 0.02265476994216442, - 0.042738109827041626, - -0.0017582435393705964, - -0.01498791016638279, - 0.0156788881868124, - 0.014924847520887852, - 0.04711415618658066, - 0.036705132573843, - 0.029107119888067245, - 0.03778979554772377, - 0.056761909276247025, - 0.004328517243266106, - -0.006316020619124174, - -0.01792862080037594, - 0.03413846343755722, - 0.01576082408428192, - 0.039821263402700424, - 0.0011082907440140843, - -0.013256932608783245, - -0.022849716246128082, - 0.04406912252306938, - 0.02079588919878006, - 0.050579965114593506, - -0.008981001563370228, - -0.05814056843519211, - -0.035472188144922256, - 0.020304691046476364, - 0.014849986881017685, - 0.005165570415556431, - 0.051139455288648605, - -0.01779196597635746, - 0.017774363979697227, - 0.01385477278381586, - 0.002952008042484522, - 0.01444029901176691, - -0.06641402840614319, - 0.029019540175795555, - -0.03837987035512924, - -0.02394135668873787, - 0.055322688072919846, - -0.0320180207490921, - 0.0032695175614207983, - -0.03923075273633003, - -0.05329805612564087, - -0.0024713121820241213, - 0.014546829275786877, - -0.011846293695271015, - -0.054075855761766434, - 0.06325359642505646, - 0.039260994642972946, - 0.016352912411093712, - 0.024773936718702316, - -0.008650925941765308, - 0.0011733617866411805, - 0.04797343537211418, - -0.028803832828998566, - -0.023381192237138748, - -0.08008036017417908, - 0.0538228377699852, - 0.007198475766927004, - -0.017968647181987762, - -0.036695532500743866, - 0.025316208600997925, - 0.008021931163966656, - -0.01830284669995308, - 0.05752919986844063, - -0.020396556705236435, - 0.007289590779691935, - 0.018395546823740005, - -0.01978224329650402, - 0.03561916947364807, - 0.0450839139521122, - -0.026029156520962715, - -0.020008986815810204, - 0.017153680324554443, - -0.03261173889040947, - -0.018844475969672203, - -0.03567415475845337, - -0.036599673330783844, - 0.043303124606609344, - 0.04262951761484146, - 0.036832988262176514, - 0.026680372655391693, - 0.02630927786231041, - -0.029624836519360542, - -0.0422082394361496, - 0.04054514691233635, - 0.018434619531035423, - 0.0515998974442482, - -0.025256507098674774, - -0.060858938843011856, - -0.04124947637319565, - 0.015657106414437294, - 0.04904523119330406, - -0.008616337552666664, - -0.019969530403614044, - 0.021550659090280533, - -0.03262699395418167, - 0.008240937255322933, - 0.04148510843515396, - -0.00274369353428483, - -0.015579471364617348, - 0.040007587522268295, - -0.010586325079202652, - -0.014995903708040714, - -0.00754194799810648, - -0.045370861887931824, - 0.019147319719195366, - -0.02849636599421501, - -0.04036618396639824, - 0.01151171326637268, - 0.017831116914749146, - 0.037957411259412766, - 0.014604153111577034, - -0.02821839228272438, - -0.05185436084866524, - 0.005090485326945782, - -0.01728029176592827, - -0.024164408445358276, - 0.06671909987926483, - -0.02195684425532818, - -0.0400264598429203, - -0.0098758265376091, - 0.000737667316570878, - 0.012909354642033577, - -0.0037529419641941786, - 0.0026068072766065598, - -0.049797482788562775, - -0.011495345272123814, - 0.03971169888973236, - -0.006969680078327656, - 0.06216596066951752, - -0.04387683421373367, - -0.006838720757514238, - 0.049109041690826416, - 0.02067106030881405, - -0.008357982151210308, - 0.004072548355907202, - -0.04762018471956253, - 0.035335540771484375, - 0.031109552830457687, - 0.04302102327346802, - -0.00658362777903676, - -0.07162035256624222, - -0.008107749745249748, - 0.04603156819939613, - 0.008898700587451458, - 0.01395969744771719, - -0.0006011195364408195, - 0.009222028777003288, - 0.016310784965753555, - 0.014455843716859818, - 0.028253154829144478, - 0.05109156295657158, - 0.014864969998598099, - -0.026200179010629654, - -0.06340508162975311, - -0.02554444596171379, - -0.015158076770603657, - 0.0582333579659462, - 0.07723800837993622, - -0.033769700676202774, - -0.05513983964920044, - 0.0497354194521904, - 0.040261972695589066, - -0.006319129373878241, - -0.011349291540682316, - 0.028128592297434807, - 0.06409505754709244, - -0.03474124148488045, - 0.01089553628116846, - -0.031240062788128853, - -0.00028962339274585247, - 0.04702838510274887, - 0.03685152903199196, - 0.019205590710043907, - -0.008063651621341705, - 0.04891003668308258, - -0.006582725327461958, - -0.01485508680343628, - 0.006610417272895575, - -0.05010475963354111, - 0.036193691194057465, - 0.039510730654001236, - -0.026712743565440178, - 0.0018876376561820507, - 0.033829085528850555, - -0.011354278773069382, - 0.014450781047344208, - 0.02474832721054554, - 0.006457134615629911, - -0.01977895200252533, - -0.00722023518756032, - 0.08079168945550919, - 0.025269437581300735, - -0.01640414632856846, - -0.013398143462836742, - -0.07606197893619537, - 0.013131237588822842, - 0.019934212788939476, - 0.02528706006705761, - 0.030324392020702362, - -0.0050029330886900425, - 0.00997952464967966, - 0.047506798058748245, - 0.027899032458662987, - 0.039072491228580475, - -0.009376286529004574, - -0.04043779894709587, - -0.003790401853621006, - -0.011832754127681255, - 0.04313172027468681, - 0.06825552880764008, - -0.029348237439990044, - 0.009510253556072712, - 0.025013962760567665, - -0.017825687304139137, - 0.0076405503787100315, - -0.014338923618197441, - -0.032934702932834625, - 0.02722165919840336, - -0.048909686505794525, - -0.007810146547853947, - 8.834200707497075e-05, - 0.003432277822867036, - 0.03269403427839279, - 0.06340841948986053, - 0.06007852777838707, - 0.014712214469909668, - -0.03226682171225548, - -0.04666927456855774, - -0.0019343041349202394, - -0.06964866071939468, - 0.062257830053567886, - 0.043443463742733, - -0.05281869322061539, - -0.0105625931173563, - -0.01727733202278614, - -0.03481321409344673, - 0.04426395520567894, - 0.02281186915934086, - -0.05300859361886978, - 0.05310610681772232, - 0.02120661363005638, - 0.021924296393990517, - 0.01613384298980236, - -0.03464227542281151, - -0.02212393470108509, - -0.02065061591565609, - -0.053743477910757065, - -0.04996956139802933, - 0.016564760357141495, - 0.00043513518176041543, - 0.04539762809872627, - -0.007097937632352114, - 0.004486193414777517, - 0.02708885446190834, - -0.06541859358549118, - 0.03179788962006569, - 0.00792022980749607, - -0.03806352987885475, - -0.01703607849776745, - 0.029738223180174828, - -0.04594947397708893, - 0.0013365731574594975, - -0.07554368674755096, - 0.010613704100251198, - -0.020312849432229996, - 0.01680777408182621, - -0.04646461829543114, - -0.008750206790864468, - -0.031227540224790573, - -0.05086948722600937, - -0.040046293288469315, - 0.004581021144986153, - -0.030159205198287964, - 0.061230938881635666, - -0.010085627436637878, - -0.030067911371588707, - -0.07799109816551208, - 0.003792820032685995, - -0.03450485318899155, - 0.01321416161954403, - -0.041393477469682693, - 0.0037594372406601906, - -0.05729011446237564, - -0.029954511672258377, - -0.038134682923555374, - 0.03041197545826435, - 0.041851598769426346, - 0.013586344197392464, - 0.009517954662442207, - -0.0379149429500103, - -0.05303361639380455, - 0.052375487983226776, - -0.029709521681070328, - 0.03542878106236458, - 0.0013415856519713998, - 0.0270149614661932, - -0.04048033431172371, - -0.03457881882786751, - 0.018310148268938065, - 0.022899286821484566, - -0.014217817224562168, - 0.04014700651168823, - 0.0032339589670300484, - -0.02351330779492855, - 0.05006735026836395, - -0.02533848211169243, - 0.043345727026462555, - -0.020713146775960922, - -0.04497572407126427, - -0.05604824051260948, - -0.002972264541313052, - 0.0543651208281517, - -0.015297124162316322, - 0.0471140556037426, - -0.0277845598757267, - 0.005691290367394686, - 0.051957543939352036, - -0.010915357619524002, - 0.061658766120672226, - -0.026139510795474052, - -0.07580486685037613, - 0.012636140920221806, - 0.03940793126821518, - 0.004013937897980213, - 0.05224434658885002, - 0.03496624156832695, - -0.026177460327744484, - 0.037622395902872086, - -0.035366691648960114, - -0.02663540095090866, - -0.052202362567186356, - -0.0019038058817386627, - -0.06068830192089081, - 0.011160631664097309, - -0.03346390649676323, - 0.01161076221615076, - -0.03377499058842659, - -0.06862025707960129, - -0.017913026735186577, - 0.016776561737060547, - 0.024393398314714432, - 0.009737608022987843, - -0.0001341513270745054, - -0.02784162200987339, - -0.06293565779924393, - -0.014145000837743282, - 0.02930028736591339, - -0.030020181089639664, - -0.014133823104202747, - 0.01239168830215931, - 0.07054735720157623, - 0.010196701623499393, - -0.04868802800774574, - 0.0241183303296566, - -0.015641886740922928, - 0.0212082676589489, - -0.016528913751244545, - 0.012694619596004486, - 0.049077484756708145, - -0.01059405505657196, - -0.01571304351091385, - 0.07588662207126617, - 0.04270947352051735, - 0.011347380466759205, - 0.0020279171876609325, - 0.0056926836259663105, - 0.003676709020510316, - 0.02780984155833721, - -0.039659444242715836, - 0.01940532959997654, - -0.030400032177567482, - -0.023835940286517143, - 0.007260680198669434, - -0.03915594518184662, - -0.016143059358000755, - 0.027022335678339005, - 0.012695624493062496, - 0.00654649268835783, - 0.0028953570872545242, - -0.07500354945659637, - -0.01262845378369093, - 0.018621766939759254, - -0.03345731273293495, - 0.0009807853493839502, - -0.011328727938234806, - 0.032614815980196, - 0.02457674965262413, - 0.008987754583358765, - 0.0074556684121489525, - -0.016726940870285034, - -0.04372112452983856, - -0.026138275861740112, - 0.01460978202521801, - -0.0018687699921429157, - -0.01504184864461422, - 0.0291975736618042, - -0.08243843913078308, - 0.04372790455818176, - -0.03766077384352684, - 0.052301015704870224, - -0.00856063049286604, - -0.015745094045996666, - -0.037806496024131775, - -0.030004415661096573, - -0.04191785678267479, - 0.02835415117442608, - -0.008592316880822182, - 0.0006197852781042457, - -0.02833535522222519, - 0.011265256442129612, - 0.08267124742269516, - -0.02028210088610649, - 0.007515270728617907, - 0.017721697688102722, - 0.04881494492292404, - -0.026109762489795685, - -0.02003922127187252, - -0.007310193497687578, - 0.0104212099686265, - -0.04984555393457413, - -0.02612251788377762, - -0.009166986681520939, - -0.026135388761758804, - -0.03754410892724991, - 0.016528800129890442, - 0.07542476058006287, - -0.0010429902467876673, - -0.03211371228098869, - -0.005090772174298763, - -0.02590389922261238, - 0.010289972648024559, - 0.06073283776640892, - 0.020731467753648758, - -0.03629828244447708, - -0.048426397144794464, - -0.021554691717028618, - -0.013838764280080795, - 0.07362484186887741, - -0.05128122493624687, - -0.0017484466079622507, - -0.0227632075548172, - 0.0037273361813277006, - 0.0044632949866354465, - -0.013041398487985134, - 0.020383963361382484, - -0.05165550857782364, - -0.0024354243651032448, - -0.02342897653579712, - -0.037315431982278824, - -0.043784890323877335, - -0.018593236804008484, - -0.030044520273804665, - 0.0008633139659650624, - -0.004080752842128277, - 0.05212042108178139, - 0.02690725028514862, - -0.008782251738011837, - -0.0393797941505909, - -0.009584106504917145, - 0.06029988452792168, - -0.04454880207777023, - -0.009639243595302105, - 0.018929382786154747, - -0.026322180405259132, - -0.02482670359313488, - 0.0008284770301543176, - -0.024281343445181847, - 0.02122873067855835, - 0.019121350720524788, - 0.08850973099470139, - 0.07247374206781387, - 0.01175956055521965, - -0.01666785590350628, - 0.0492577850818634, - 0.0039045754820108414, - 0.000672859896440059, - -0.029885176569223404, - -0.04246489703655243, - -0.009598914533853531 - ], - "payload": { - "id": "fb778a36-e589-4c9d-8eeb-d0a71fd8299d", - "memory": "The user is a professor.", - "metadata": { - "user_id": "user_123", - "session_id": "0c3d29d2-e078-4a03-960b-563bb33ec7ae", - "status": "activated", - "type": "fact", - "memory_time": "2025-06-03", - "source": "conversation", - "confidence": 90.0, - "entities": [ - "professor" - ], - "tags": [ - "academic", - "professors" - ], - "visibility": "private", - "updated_at": "2025-06-03T17:14:18" - } - } - } -] diff --git a/examples/data/mem_scheduler/scene_data.json b/examples/data/mem_scheduler/scene_data.json deleted file mode 100644 index 94f95c9ba..000000000 --- a/examples/data/mem_scheduler/scene_data.json +++ /dev/null @@ -1,118 +0,0 @@ -[ - [ - { - "role": "user", - "content": "I'm feeling a bit down today." - }, - { - "role": "assistant", - "content": "I'm sorry to hear that. Do you want to talk about what's been going on?" - }, - { - "role": "user", - "content": "It's just been a tough couple of days, you know? Everything feels a bit overwhelming, and I just can't seem to shake it off." - }, - { - "role": "assistant", - "content": "It sounds like you're going through a lot right now. Sometimes it helps to talk things out. Is there something specific that's been weighing on you, or is it more of a general feeling?" - }, - { - "role": "user", - "content": "It's a mix, I guess. Work's been really stressful, and on top of that, I've been feeling kinda disconnected from the people around me." - }, - { - "role": "assistant", - "content": "That can be really draining, especially when you're feeling isolated on top of the stress. Do you think there's something from your past that's contributing to how you're feeling now? Sometimes our emotions are tied to older experiences." - }, - { - "role": "user", - "content": "Yeah, now that you mention it... I've been thinking a lot about my childhood lately. I didn't have the easiest upbringing. My parents were always busy, and I often felt like I had to figure things out on my own. I remember one winter, I got really sick with a high fever. My parents were both working, and I didn't want to bother them. I just lay in bed, crying by myself, not knowing what to do." - }, - { - "role": "assistant", - "content": "That must have been very lonely. Growing up without that support can really make you feel like you have to handle everything on your own. How do you think that experience has affected you now?" - }, - { - "role": "user", - "content": "Yeah, it was really lonely. I remember spending a lot of time doing things on my own, like drawing, because it was my only way to escape. I used to draw animals, and I created my own little world on paper. It was peaceful in a way, just me and my imagination, with no outside distractions." - }, - { - "role": "assistant", - "content": "Drawing sounds like a beautiful way to express yourself and find some peace in that solitude. It must have been a very quiet and private world for you. Do you think that sense of loneliness from back then has shaped how you connect with others today?" - }, - { - "role": "user", - "content": "I think it has. I've always found it hard to let others in. I feel like I have to handle everything on my own. If I rely on someone else, I feel vulnerable, and I start to feel that loneliness again." - }, - { - "role": "assistant", - "content": "It sounds like this was a protective mechanism that helped you cope with your feelings of loneliness back then. But as you've grown, it seems like this pattern might not be serving you as well anymore. Have you thought about trying to break this cycle, or finding new ways to connect with others?" - }, - { - "role": "user", - "content": "I've thought about it, though it's hard. But I also know I can't keep going like this forever. Maybe it's time to seek some help." - }, - { - "role": "assistant", - "content": "It's a big step, but a positive one. Exploring your emotions and past experiences could really help you understand how they've shaped your present. Therapy could be a great place to start, as it would help you connect with both yourself and others. Would you be open to trying it?" - }, - { - "role": "user", - "content": "I'm open to trying. Thank you for encouraging me. It feels like it might be a good starting point for me." - }, - { - "role": "assistant", - "content": "I'm really glad to hear that. Taking that first step is always difficult, but you've made an important decision. If you need help finding the right therapist, or just want to talk, I'm here for you." - } - ], - [ - { - "role": "user", - "content": "This week I've been feeling a bit off, especially when playing tennis. My body just doesn't feel right." - }, - { - "role": "assistant", - "content": "It sounds like you've been having some physical discomfort lately. Where specifically are you feeling unwell? Is there something particular about tennis that's been difficult?" - }, - { - "role": "user", - "content": "I just feel a bit fatigued, and every time I play tennis, my movements feel off. I used to play pretty well, but lately, I've been feeling weak and my movements aren't as coordinated as they used to be." - }, - { - "role": "assistant", - "content": "Physical discomfort can definitely affect performance, especially in a sport like tennis that requires quick reactions and coordination. Have you noticed anything specific that might be causing these changes? Could it be overtraining, or is there another physical issue making you feel off?" - }, - { - "role": "user", - "content": "I think it might be due to stress and lack of sleep recently. I just feel drained all the time. Plus, I've been frustrated with my tennis performance, which makes me feel even worse, like I'm stuck in a vicious cycle." - }, - { - "role": "assistant", - "content": "Stress and poor sleep quality can definitely affect your physical performance, especially in sports. When you're also feeling down about your performance, it's easy to fall into a negative cycle. Have you tried anything to relieve some of the stress, or to improve your sleep?" - }, - { - "role": "user", - "content": "I've tried some relaxation techniques, like deep breathing and simple meditation, but it doesn't seem to help much. I still can't focus during tennis, and I feel like my mind is distracted by other things." - }, - { - "role": "assistant", - "content": "Relaxation techniques like deep breathing and meditation can help reduce stress, but sometimes we need a more structured approach to improve both our physical and mental state. For example, you might want to focus on specific aspects of your tennis training, or adjust your rest and recovery time. Have you thought about setting smaller goals for yourself? Like focusing on a specific tennis move each day, rather than expecting perfection right away? That might help you gradually regain confidence." - }, - { - "role": "user", - "content": "That's a good idea. I think I've been expecting too much from myself, which just makes me more anxious. Maybe I can start with small practice sessions and gradually find my rhythm again." - }, - { - "role": "assistant", - "content": "Exactly! Setting small and clear goals will help reduce pressure and give you a sense of accomplishment. And don't forget that rest is just as important—taking time to recover will help you feel better physically and mentally. Both physical and mental recovery are key to improving your performance and health." - }, - { - "role": "user", - "content": "Thanks, I feel like I need to rethink a few things. Maybe I really need to be kinder to myself and take things step by step." - }, - { - "role": "assistant", - "content": "You're on the right track. Rethinking things and giving yourself space and patience is so important. You've already taken the first step, now just keep moving forward, one step at a time. If you need anything, I'm always here to help." - } - ] -] diff --git a/src/memos/api/handlers/config_builders.py b/src/memos/api/handlers/config_builders.py index fb3df80c2..fce789e2a 100644 --- a/src/memos/api/handlers/config_builders.py +++ b/src/memos/api/handlers/config_builders.py @@ -89,7 +89,7 @@ def build_chat_llm_config() -> list[dict[str, Any]]: Returns: Validated chat LLM configuration dictionary """ - configs = json.loads(os.getenv("CHAT_MODEL_LIST")) + configs = json.loads(os.getenv("CHAT_MODEL_LIST", "[]")) return [ { "config_class": LLMConfigFactory.model_validate( diff --git a/src/memos/mem_scheduler/general_modules/init_components_for_scheduler.py b/src/memos/mem_scheduler/general_modules/init_components_for_scheduler.py index 3a12a9c79..903088a4c 100644 --- a/src/memos/mem_scheduler/general_modules/init_components_for_scheduler.py +++ b/src/memos/mem_scheduler/general_modules/init_components_for_scheduler.py @@ -109,7 +109,7 @@ def build_chat_llm_config() -> list[dict[str, Any]]: Returns: Validated chat LLM configuration dictionary """ - configs = json.loads(os.getenv("CHAT_MODEL_LIST")) + configs = json.loads(os.getenv("CHAT_MODEL_LIST", "[]")) return [ { "config_class": LLMConfigFactory.model_validate( From 5294d62038486c1c2e86052d7d7b8f72aad1a5c7 Mon Sep 17 00:00:00 2001 From: CaralHsi Date: Mon, 19 Jan 2026 22:22:30 +0800 Subject: [PATCH 51/53] feat: delete useless test file (#908) * feat: delete useless example * fix: chat_model_list bug * feat: delete useless file * feat: delete useless test --- tests/test_openapi_sync.py | 79 -------------------------------------- 1 file changed, 79 deletions(-) delete mode 100644 tests/test_openapi_sync.py diff --git a/tests/test_openapi_sync.py b/tests/test_openapi_sync.py deleted file mode 100644 index 48e872d66..000000000 --- a/tests/test_openapi_sync.py +++ /dev/null @@ -1,79 +0,0 @@ -import json - -from pathlib import Path - -from memos.api.server_api import app - - -OPENAPI_JSON_PATH = Path(__file__).parent.parent / "docs" / "openapi.json" - - -def test_openapi_json_up_to_date(): - """ - Ensure docs/openapi.json is up to date. - If not, run: `make openapi` to regenerate it. - """ - - assert OPENAPI_JSON_PATH.exists(), ( - f"{OPENAPI_JSON_PATH} does not exist. Please run: `make openapi` to regenerate it." - ) - - # Get current OpenAPI schema and existing file - current_openapi = app.openapi() - with open(OPENAPI_JSON_PATH) as f: - existing_openapi = json.load(f) - - # Remove dynamic values like UUIDs in defaults to avoid false positives - def normalize(obj): - if isinstance(obj, dict): - return {k: normalize(v) for k, v in obj.items() if k != "default"} - elif isinstance(obj, list): - return [normalize(item) for item in obj] - return obj - - # Compare normalized structures - normalized_current = normalize(current_openapi) - normalized_existing = normalize(existing_openapi) - - if normalized_current == normalized_existing: - return # Test passes - - # Generate helpful error message with specific differences - def find_diffs(current, existing, path=""): - diffs = [] - if type(current) is not type(existing): - diffs.append( - f"Type mismatch at {path}: {type(current).__name__} vs {type(existing).__name__}" - ) - elif isinstance(current, dict): - all_keys = set(current.keys()) | set(existing.keys()) - for key in sorted(all_keys): - key_path = f"{path}.{key}" if path else key - if key not in current: - diffs.append(f"Missing: {key_path}") - elif key not in existing: - diffs.append(f"Added: {key_path}") - else: - diffs.extend(find_diffs(current[key], existing[key], key_path)) - elif isinstance(current, list): - if len(current) != len(existing): - diffs.append(f"Array length differs at {path}: {len(current)} vs {len(existing)}") - for i, (curr_item, exist_item) in enumerate(zip(current, existing, strict=False)): - diffs.extend(find_diffs(curr_item, exist_item, f"{path}[{i}]")) - elif current != existing: - diffs.append(f"Value differs at {path}") - return diffs - - differences = find_diffs(normalized_current, normalized_existing) - - # Format error message - max_diffs = 5 - diff_preview = "\n".join(f" - {diff}" for diff in differences[:max_diffs]) - if len(differences) > max_diffs: - diff_preview += f"\n ... and {len(differences) - max_diffs} more" - - raise AssertionError( - f"OpenAPI schema is out of date ({len(differences)} differences found):\n" - f"{diff_preview}\n\n" - f"To fix, run: `make openapi` to regenerate it." - ) From 0ebcb367ab721d7ce2af550c3d52f719da7891a9 Mon Sep 17 00:00:00 2001 From: CaralHsi Date: Mon, 19 Jan 2026 22:29:16 +0800 Subject: [PATCH 52/53] feat: add mem_cube_2 because tests need them (#909) * feat: delete useless example * fix: chat_model_list bug * feat: delete useless file * feat: delete useless test * feat: add mem_cube_2 because tests need them --- examples/data/mem_cube_2/README.md | 1 + .../data/mem_cube_2/activation_memory.pickle | Bin 0 -> 820726 bytes .../data/mem_cube_2/parametric_memory.adapter | 4 ++++ 3 files changed, 5 insertions(+) create mode 100644 examples/data/mem_cube_2/README.md create mode 100644 examples/data/mem_cube_2/activation_memory.pickle create mode 100644 examples/data/mem_cube_2/parametric_memory.adapter diff --git a/examples/data/mem_cube_2/README.md b/examples/data/mem_cube_2/README.md new file mode 100644 index 000000000..2737a3843 --- /dev/null +++ b/examples/data/mem_cube_2/README.md @@ -0,0 +1 @@ +This is a MemCube of type memos.configs.mem_cube.GeneralMemCubeConfig. diff --git a/examples/data/mem_cube_2/activation_memory.pickle b/examples/data/mem_cube_2/activation_memory.pickle new file mode 100644 index 0000000000000000000000000000000000000000..10aed7ef20e4d2b23602a892bb053d131cdca372 GIT binary patch literal 820726 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

    P6767vw798ia-jY%I>}_KfOT$ya2N` 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

    (@FqDqEn2tShcNj|1s21}sj$(*u*I2Is>SxL^LU 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 z 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

  • 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%0ArC3_wi9Hze1_9yF3cD+E-7H|pV%Cl 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 literal 0 HcmV?d00001 diff --git a/examples/data/mem_cube_2/parametric_memory.adapter b/examples/data/mem_cube_2/parametric_memory.adapter new file mode 100644 index 000000000..e069a4b09 --- /dev/null +++ b/examples/data/mem_cube_2/parametric_memory.adapter @@ -0,0 +1,4 @@ +Placeholder + +Once the parametric memory module is implemented, +this file should be replaced with maybe a LoRA adapter. From 781bcfe37efa956421d69d372903fe5526cf20a4 Mon Sep 17 00:00:00 2001 From: CaralHsi Date: Mon, 19 Jan 2026 22:37:31 +0800 Subject: [PATCH 53/53] feat: add back mem_cube because tests use them (#910) * feat: delete useless example * fix: chat_model_list bug * feat: delete useless file * feat: delete useless test * feat: add mem_cube_2 because tests need them * feat: add mem_cube_2 because tests need them --- examples/data/mem_cube_2/config.json | 77 + examples/data/mem_cube_2/textual_memory.json | 1592 ++++++++++++++++++ 2 files changed, 1669 insertions(+) create mode 100644 examples/data/mem_cube_2/config.json create mode 100644 examples/data/mem_cube_2/textual_memory.json diff --git a/examples/data/mem_cube_2/config.json b/examples/data/mem_cube_2/config.json new file mode 100644 index 000000000..7eebea3a6 --- /dev/null +++ b/examples/data/mem_cube_2/config.json @@ -0,0 +1,77 @@ +{ + "model_schema": "memos.configs.mem_cube.GeneralMemCubeConfig", + "user_id": "Ki-Seki", + "cube_id": "Ki-Seki/mem_cube_2", + "config_filename": "config.json", + "text_mem": { + "backend": "general_text", + "config": { + "cube_id": "Ki-Seki/mem_cube_2", + "memory_filename": "textual_memory.json", + "extractor_llm": { + "backend": "huggingface", + "config": { + "model_name_or_path": "Qwen/Qwen3-1.7B", + "temperature": 0.8, + "max_tokens": 1024, + "top_p": 0.9, + "top_k": 50, + "add_generation_prompt": true, + "remove_think_prefix": false + } + }, + "vector_db": { + "backend": "qdrant", + "config": { + "collection_name": "Ki-Seki/mem_cube_2", + "vector_dimension": 768, + "distance_metric": "cosine" + } + }, + "embedder": { + "backend": "ollama", + "config": { + "model_name_or_path": "nomic-embed-text:latest", + "embedding_dims": null, + "api_base": "http://localhost:11434" + } + } + } + }, + "act_mem": { + "backend": "kv_cache", + "config": { + "memory_filename": "activation_memory.pickle", + "extractor_llm": { + "backend": "huggingface", + "config": { + "model_name_or_path": "Qwen/Qwen3-1.7B", + "temperature": 0.8, + "max_tokens": 1024, + "top_p": 0.9, + "top_k": 50, + "add_generation_prompt": true, + "remove_think_prefix": false + } + } + } + }, + "para_mem": { + "backend": "lora", + "config": { + "memory_filename": "parametric_memory.adapter", + "extractor_llm": { + "backend": "huggingface", + "config": { + "model_name_or_path": "Qwen/Qwen3-1.7B", + "temperature": 0.8, + "max_tokens": 1024, + "top_p": 0.9, + "top_k": 50, + "add_generation_prompt": true, + "remove_think_prefix": false + } + } + } + } +} diff --git a/examples/data/mem_cube_2/textual_memory.json b/examples/data/mem_cube_2/textual_memory.json new file mode 100644 index 000000000..7a4432413 --- /dev/null +++ b/examples/data/mem_cube_2/textual_memory.json @@ -0,0 +1,1592 @@ +[ + { + "id": "a18c2ce3-7824-41de-9f67-e6ef9d7c66e7", + "vector": [ + -0.00014818651834502816, + 0.08681453764438629, + -0.20681676268577576, + -0.013103991746902466, + 0.05085381120443344, + 0.043568022549152374, + -0.022663237527012825, + 0.02298419177532196, + 0.001899578026495874, + -0.01179163996130228, + -0.046989526599645615, + 0.00014617355191148818, + 0.07312055677175522, + 0.04532632231712341, + 0.007967920042574406, + 0.006418320816010237, + 0.019739458337426186, + -0.060413897037506104, + 0.008398447185754776, + 0.02717193216085434, + -0.038277287036180496, + -0.06996751576662064, + -0.027262073010206223, + 0.0319170318543911, + 0.053406864404678345, + 0.01855497434735298, + 0.048100560903549194, + -0.01161869429051876, + -0.0850091353058815, + 0.027527227997779846, + 0.0007747603231109679, + 0.01134356576949358, + -0.0555138885974884, + 0.0261530801653862, + 0.033080343157052994, + -0.03019297495484352, + 0.022144827991724014, + 0.050229962915182114, + 0.011134911328554153, + 0.006926852744072676, + 0.0679548978805542, + -0.02608887478709221, + 0.005319757387042046, + 0.0027378054801374674, + 0.07804228365421295, + -0.010697394609451294, + 0.004406045190989971, + 0.024699222296476364, + 0.03306689113378525, + 0.010330736637115479, + -0.059429340064525604, + 0.0549667552113533, + 0.002089115558192134, + -0.044180579483509064, + 0.0845041275024414, + 0.01005307026207447, + -0.0017150044441223145, + 0.03251068294048309, + 0.038654226809740067, + 0.017765911296010017, + 0.061431240290403366, + 0.0201454758644104, + 0.029097145423293114, + 0.07558012753725052, + 0.056120313704013824, + 0.018932050094008446, + -0.01603352092206478, + 0.055393561720848083, + 0.0032458535861223936, + -0.0796804428100586, + 0.03546201065182686, + 0.01574140228331089, + 0.06272733211517334, + 0.04941656067967415, + 0.0022506709210574627, + 0.0027206926606595516, + -0.02735859528183937, + -0.05224693566560745, + 0.025996549054980278, + 0.05513250082731247, + 0.03476572781801224, + -0.03194168955087662, + 0.01705862209200859, + -0.011845375411212444, + 0.0795501321554184, + 0.018780864775180817, + -0.010017038322985172, + 0.013638949953019619, + -0.047666411846876144, + 0.021519998088479042, + -0.00109274429269135, + 0.020754853263497353, + 0.06266647577285767, + 0.06675539910793304, + -0.05058827996253967, + -0.020563844591379166, + -0.02274453081190586, + -0.019921697676181793, + 0.00865398533642292, + -0.04477572813630104, + -0.01218259148299694, + -0.014905819669365883, + -0.049729809165000916, + 0.008558779954910278, + 0.04270182177424431, + 0.04889139160513878, + 0.0016067929100245237, + -0.04244951903820038, + -0.023060910403728485, + -0.05268606171011925, + -0.00012061429879395291, + -0.017494287341833115, + -0.015545113012194633, + -0.05467086657881737, + -0.0033326249103993177, + 0.01810845173895359, + 0.044591739773750305, + -0.05597468093037605, + -0.03234736621379852, + 0.037201106548309326, + -0.029020339250564575, + -0.02119547128677368, + 0.009818792343139648, + 0.013432457111775875, + -0.006349821109324694, + -0.011805719695985317, + -0.043579984456300735, + -0.007044253870844841, + -0.012137891724705696, + -0.018680734559893608, + -0.0034931646659970284, + -0.004471060819923878, + -0.019593223929405212, + -0.031462281942367554, + 0.00976460799574852, + 0.04755682125687599, + -0.021012960001826286, + -0.012017159722745419, + 0.007173294201493263, + 0.013452270068228245, + -0.008074294775724411, + 0.007978463545441628, + 0.03576074168086052, + -0.014899522997438908, + -0.021684955805540085, + -0.03905675932765007, + 0.06881406158208847, + -0.018583590164780617, + -0.01600123569369316, + -0.030609719455242157, + -0.02003449760377407, + 0.044688571244478226, + -0.01380191184580326, + 0.023758018389344215, + 0.0336030013859272, + -0.06680193543434143, + -0.006954998709261417, + 0.00254152063280344, + 0.03406456485390663, + 0.009776155464351177, + 0.02960142493247986, + 0.007331789471209049, + -0.02305479720234871, + 0.05021728575229645, + 0.018150033429265022, + -0.06408998370170593, + 0.01539584156125784, + 0.013482005335390568, + -0.0004569741722662002, + -0.02638716623187065, + -0.015325665473937988, + -0.012921432964503765, + -0.029986094683408737, + -0.024684034287929535, + 0.005059847142547369, + -0.0768992230296135, + 0.016934597864747047, + -0.022273538634181023, + 0.00020065580611117184, + -0.06399421393871307, + -0.00016717147082090378, + -0.0480651892721653, + 0.017821049317717552, + 0.038031160831451416, + -0.024721186608076096, + -0.005311005283147097, + -0.00560294184833765, + -0.0224751029163599, + -0.013713419437408447, + -0.03435273841023445, + -0.019131431356072426, + -0.022047780454158783, + -0.04225388169288635, + -0.007644690107554197, + -0.06921757757663727, + 0.0003072426770813763, + 0.01802380383014679, + -0.0023877096828073263, + 0.03132440149784088, + -0.016250327229499817, + -0.02099924348294735, + -0.031041791662573814, + 0.011189958080649376, + 0.0020591672509908676, + -0.06083563715219498, + 0.04059690609574318, + 0.020018747076392174, + 0.02554655447602272, + -0.0206780806183815, + -0.0027049260679632425, + 0.045213595032691956, + 0.011424008756875992, + -0.025692787021398544, + -4.859843829763122e-05, + 0.006532728206366301, + -0.032235607504844666, + 0.027260659262537956, + -0.06041350215673447, + -0.030185865238308907, + 0.011719160713255405, + 0.03585655242204666, + 0.038815852254629135, + -0.02353857085108757, + -0.05020734667778015, + 0.028778648003935814, + -0.03367644175887108, + -0.07198009639978409, + 0.0006536028231494129, + -0.048022590577602386, + -0.007659787777811289, + 0.02746856026351452, + -0.03435167670249939, + 0.0561370849609375, + 0.027270056307315826, + 0.02719561941921711, + 0.04663369432091713, + 0.024669848382472992, + 0.07791226357221603, + 0.02643936313688755, + 0.047239623963832855, + -0.011974561959505081, + 0.04813205450773239, + -0.021562155336141586, + -0.032725296914577484, + -0.02511098049581051, + 0.04053548723459244, + 0.003210059367120266, + -0.0011876978678628802, + -0.011528871953487396, + 0.029262011870741844, + -0.034294623881578445, + 0.00643745856359601, + 0.057951610535383224, + 0.010749870911240578, + 0.04583483561873436, + -0.0279113557189703, + -0.06871405988931656, + -0.0022074475418776274, + 0.005717596039175987, + -0.01105948630720377, + 0.02511807158589363, + -0.04636146128177643, + 0.007751643192023039, + -0.037966348230838776, + -0.0393434576690197, + 0.02194535918533802, + -0.05478854477405548, + -0.009226461872458458, + 0.044889580458402634, + -0.018443753942847252, + 0.0279464740306139, + 0.04543845355510712, + -0.03533068299293518, + 0.07344670593738556, + -0.011943274177610874, + -0.05503000691533089, + -0.015542245469987392, + -0.019130093976855278, + -0.001687999814748764, + -0.005880369339138269, + 0.01134209893643856, + -0.018506351858377457, + -0.03456299006938934, + 0.054454654455184937, + 0.046674590557813644, + 0.03889671713113785, + 0.006740291137248278, + 0.0367615669965744, + 0.0068789455108344555, + -0.03455902636051178, + 0.028371276333928108, + 0.015708129853010178, + -0.014551428146660328, + 0.0009174310835078359, + 0.0011670272797346115, + 0.008046625182032585, + 0.006462408229708672, + -0.038506172597408295, + 0.0018585101934149861, + 0.0022026710212230682, + 0.01307243388146162, + 0.009545743465423584, + 0.06306051462888718, + 0.04060979560017586, + -0.06535082310438156, + -0.014391492120921612, + 0.05275454372167587, + 0.016640475019812584, + 0.010650021955370903, + -0.018457798287272453, + -0.0501379556953907, + -0.007801951840519905, + -0.017589885741472244, + 0.02107970602810383, + -0.030515220016241074, + 0.051360685378313065, + 0.0037130943965166807, + 0.020426368340849876, + -0.015300370752811432, + -0.03826352581381798, + -0.049975089728832245, + 0.005903865210711956, + 0.015326551161706448, + -0.0583341009914875, + 0.00220089009962976, + 0.05439915880560875, + 0.00478106364607811, + 0.041649118065834045, + 0.013224261812865734, + -0.06253284215927124, + -0.012881606817245483, + 0.03379691764712334, + 0.02967710793018341, + -0.0455189011991024, + -0.03239823877811432, + 0.06887175887823105, + -0.022121479734778404, + 0.024268249049782753, + -0.03818367421627045, + 0.01956542767584324, + 0.040425918996334076, + -0.01346785482019186, + -0.02009832113981247, + -0.05978938937187195, + 0.010985367931425571, + 0.005119467154145241, + -0.025031113997101784, + -0.0025458361487835646, + 0.08207672834396362, + -0.01369630079716444, + -0.03892416134476662, + 0.02387291006743908, + -0.036386050283908844, + 0.02843250334262848, + 0.0004545582050923258, + -0.031518206000328064, + 0.014727075584232807, + 0.04806468263268471, + 0.0037828392814844847, + -0.002694198163226247, + -0.002702610334381461, + -0.0025003617629408836, + 0.03688205033540726, + -0.0816398411989212, + -0.03445456176996231, + 0.07072345912456512, + 0.018157314509153366, + -0.005657431669533253, + 0.009721250273287296, + 0.0205300971865654, + -0.029843825846910477, + -0.008495540358126163, + 0.006358548067510128, + 0.029927914962172508, + 0.07804637402296066, + 0.01825663447380066, + -0.03337133675813675, + -0.08855056017637253, + 0.03792961314320564, + 0.022532790899276733, + -0.03952158987522125, + -0.006163773126900196, + -0.04312257468700409, + 0.015068230219185352, + 0.06167789548635483, + -0.012890934012830257, + -0.030775586143136024, + -0.04313652589917183, + 0.03397197648882866, + -0.014787409454584122, + 0.019541068002581596, + -0.05246260017156601, + -0.04059214144945145, + 0.02183414436876774, + 0.019671374931931496, + -0.03757543861865997, + 0.006572334561496973, + -0.03494402393698692, + -0.004371888469904661, + 0.014755189418792725, + -0.009366157464683056, + -0.027891159057617188, + -0.013619402423501015, + -0.039329636842012405, + -0.020809782668948174, + 0.000880005769431591, + -0.03791540488600731, + -0.051147837191820145, + 0.007026517763733864, + 0.006667810957878828, + 0.0319993793964386, + 0.05714735388755798, + 0.03169240057468414, + -0.04957866668701172, + -0.015389721840620041, + 0.016869312152266502, + 0.04888288676738739, + -0.0037166839465498924, + -0.034403812140226364, + -0.005219649989157915, + 0.04526256024837494, + 0.04159468412399292, + -0.0008332810830324888, + 0.005173653829842806, + 0.011768482625484467, + -0.049005743116140366, + 0.06968513876199722, + 0.05458555743098259, + -0.055220481008291245, + -0.05364776775240898, + 0.0024763571564108133, + 0.022233042865991592, + -0.021059352904558182, + -0.01864655129611492, + -0.035375162959098816, + 0.01695484109222889, + 0.06736589223146439, + 0.012959055602550507, + 0.010221510194242, + 0.10735081881284714, + 0.04766736552119255, + -0.0365803986787796, + -0.03999323770403862, + 0.010769710876047611, + 0.02801015041768551, + 0.05390840768814087, + 0.03418072313070297, + -0.07398323714733124, + -0.018320662900805473, + 0.0846564769744873, + 0.02666644938290119, + -0.0009550070972181857, + 0.05819438397884369, + 0.02858666144311428, + 0.06222475692629814, + -0.023938406258821487, + 0.025920573621988297, + -0.022009162232279778, + 0.03581433370709419, + 0.07543337345123291, + -0.0032695685513317585, + -0.004978572484105825, + -0.05269002541899681, + 0.043094806373119354, + -0.05155868083238602, + -0.015526512637734413, + -0.015746403485536575, + 0.0006137419841252267, + 0.04922552779316902, + 0.0009195932070724666, + -0.006088243797421455, + 0.0014861380914226174, + 0.01610037125647068, + 0.008700335398316383, + -0.012137046083807945, + 0.005856509320437908, + 0.02242353744804859, + 0.025594908744096756, + -0.007925552316009998, + 0.05298546701669693, + -0.024195853620767593, + 0.008802386932075024, + 0.010466594249010086, + -0.060855839401483536, + 0.03557940199971199, + -0.004853322170674801, + 0.025001846253871918, + -0.022692294791340828, + -0.020594319328665733, + -0.02098729833960533, + 0.0010235797381028533, + 0.030980076640844345, + 0.0160788893699646, + -0.01729769818484783, + 0.007491909898817539, + -0.05265660583972931, + -0.030526068061590195, + 0.036921996623277664, + 0.10260698199272156, + -0.030593153089284897, + 0.037588465958833694, + 0.027437275275588036, + -0.07764819264411926, + 0.015199156478047371, + -0.04475780948996544, + -0.03761841729283333, + 0.03695080429315567, + -0.04358711838722229, + -0.005232027731835842, + 0.013051727786660194, + -0.0652221068739891, + -0.0014317958848550916, + -0.00587367033585906, + 0.021343933418393135, + 0.04319430887699127, + -0.024249069392681122, + -0.06723639369010925, + -0.0014082591515034437, + -0.0061257751658558846, + -0.019284026697278023, + 0.034678250551223755, + -0.04256472364068031, + -0.030710529536008835, + -0.034007374197244644, + -0.07459787279367447, + 0.041044365614652634, + 0.004341817460954189, + -0.05087435618042946, + 0.030532917007803917, + 0.018922828137874603, + 0.014825941994786263, + 0.02472018636763096, + -0.08218429237604141, + -0.06052808091044426, + 0.039883874356746674, + -0.025411948561668396, + -0.05177348479628563, + -0.010561279952526093, + 0.024961931630969048, + 0.04723433405160904, + 0.003539702855050564, + -0.0443887934088707, + -0.02979755960404873, + 0.011395673267543316, + 0.056371428072452545, + -0.032178156077861786, + -0.025409547612071037, + -0.0022701185662299395, + 0.011937304399907589, + -0.009308818727731705, + -0.012952035292983055, + -0.08703790605068207, + 0.036085594445466995, + -0.0024018820840865374, + 0.014459319412708282, + -0.006194776389747858, + 0.043290622532367706, + -0.003006343264132738, + -0.027496658265590668, + 0.004780853167176247, + 0.002064133994281292, + -0.009165661409497261, + 0.023968936875462532, + 0.024225402623414993, + -0.030831830576062202, + 0.004631332121789455, + -0.0017960182158276439, + 0.005098245106637478, + 0.0005267579108476639, + 0.0017670787638053298, + 0.00786869041621685, + -0.04154907166957855, + -0.020401636138558388, + -0.01962113007903099, + -0.0076467678882181644, + -0.0024093659594655037, + -0.002900741994380951, + -0.02746458910405636, + -0.04989836364984512, + -0.05812697112560272, + -0.036956410855054855, + -0.04313414543867111, + 0.06614590436220169, + -0.0008205302874557674, + 0.0033787169959396124, + -0.014204291626811028, + 0.022689547389745712, + -0.003622337244451046, + 0.0036216166336089373, + 0.004587291274219751, + 0.042750030755996704, + -0.019731158390641212, + -0.03819429874420166, + -0.026425018906593323, + -0.00635327585041523, + 0.04153010621666908, + -0.04053881764411926, + -0.09006260335445404, + -0.021347900852560997, + -0.04550878703594208, + 0.020714495331048965, + 0.033079419285058975, + 0.01745889149606228, + -0.005874883849173784, + -0.011586842127144337, + 0.07546954602003098, + 0.03987284004688263, + -0.007525898516178131, + 0.007618428207933903, + -0.00857081264257431, + 0.02572401985526085, + 0.011006488464772701, + -0.006910540163516998, + -0.014199952594935894, + -0.0028257560916244984, + 0.0037281266413629055, + 0.06351686269044876, + -0.01983472891151905, + -0.0033539009746164083, + -0.049309976398944855, + 0.011200725100934505, + -0.07213462889194489, + 0.04278615117073059, + -0.020247289910912514, + 0.010428857058286667, + -0.038669221103191376, + 0.0022889073006808758, + -0.025221435353159904, + -0.01803858019411564, + 0.03955966234207153, + -0.01732288859784603, + 0.04848795011639595, + -0.07759911566972733, + 0.002019045641645789, + -0.049481797963380814, + 0.05602417513728142, + -0.04716067016124725, + 0.002953908173367381, + 0.024899333715438843, + 0.03263049200177193, + 0.0296447966247797, + 0.015267964452505112, + -0.025723839178681374, + 0.05478408932685852, + -0.028974639251828194, + -0.0649733915925026, + 0.06312545388936996, + 0.007411508820950985, + 0.01919778808951378, + -0.03883281350135803, + 0.09011231362819672, + 0.03965418040752411, + 0.03333790972828865, + 0.02109946496784687, + -0.0023626128677278757, + -0.014948577620089054, + 0.02523057535290718, + -0.03181949630379677, + -0.06588133424520493, + -0.05265666916966438, + -0.013588576577603817, + 0.03540467098355293, + -0.030422504991292953, + 0.021018054336309433, + 0.020585540682077408, + -0.015814896672964096, + -0.02282184734940529, + -0.01020076684653759, + -0.056113094091415405, + 0.0005867911386303604, + 0.06247446686029434, + 0.005500571336597204, + -0.03913102298974991, + -0.016863256692886353, + -0.010538125410676003, + 0.048870839178562164, + -0.015462870709598064, + 0.023397698998451233, + 0.017680929973721504, + 0.00027658449835143983, + 0.0069356984458863735, + -0.006307277362793684, + -0.025418346747756004, + -0.015006005764007568, + 0.007782932836562395, + -0.013030318543314934, + 0.030956218019127846, + -0.021668175235390663, + -0.006449995096772909, + -0.05420451611280441, + -0.017535582184791565, + -0.032649360597133636, + -0.009477375075221062, + -0.030590355396270752, + -0.0010781059972941875, + 0.03560796007514, + 0.053241658955812454, + -0.07196953147649765, + 0.00455763703212142, + 0.02562628872692585, + -0.015127687714993954, + 0.01660744659602642, + 0.02271897904574871, + 0.03551866486668587, + -0.020594103261828423, + -0.04081762209534645, + 0.02154552936553955, + -0.00822274386882782, + -0.019525691866874695, + 0.07081827521324158, + 0.006117234472185373, + -0.02004842832684517, + -0.007872833870351315, + 0.016467135399580002, + 0.06971383839845657, + 0.026613090187311172, + 0.002687788102775812, + -0.0269155353307724, + -0.01771080307662487, + 0.03915317356586456, + 0.033255111426115036, + 0.00895513966679573, + -0.08697391301393509, + -0.05353735387325287, + 0.0004304666363168508, + 0.04601481184363365, + 0.009510449133813381, + -0.0742233619093895, + 0.058216411620378494, + 0.01582122966647148, + 0.02487439289689064, + 0.02145479805767536, + -0.0418604239821434, + 0.01750936359167099, + -0.05784616991877556, + 0.032586969435214996, + -0.056191910058259964, + -0.028854142874479294, + -0.01923101581633091, + -0.016280323266983032, + -0.027397997677326202, + 0.013844960369169712, + -0.004715242423117161, + 0.07280199229717255, + 0.006397685501724482, + -0.0024291411973536015, + -0.020058225840330124, + 0.011785682290792465, + 0.061579544097185135, + 0.050988536328077316, + 0.028395775705575943, + 0.03388901427388191, + -0.035112813115119934, + -0.03574654459953308, + 0.007751263678073883, + 0.0027961048763245344, + 0.0007332358509302139, + 0.07736506313085556, + 0.06501097232103348, + 0.03663212060928345, + 0.016258226707577705, + -0.06033748388290405, + 0.021899687126278877, + -0.022852793335914612, + -0.024243874475359917, + -0.01975938305258751, + 0.014063781127333641, + 0.06713256239891052 + ], + "payload": { + "id": "a18c2ce3-7824-41de-9f67-e6ef9d7c66e7", + "memory": "The user loves the Eiffel Tower.", + "metadata": { + "user_id": "user_123", + "session_id": "0c3d29d2-e078-4a03-960b-563bb33ec7ae", + "status": "activated", + "type": "opinion", + "memory_time": "2025-06-03", + "source": "conversation", + "confidence": 100.0, + "entities": [ + "Eiffel Tower" + ], + "tags": [ + "opinions", + "landmarks" + ], + "visibility": "session", + "updated_at": "2025-06-03T00:00:00" + } + } + }, + { + "id": "fb778a36-e589-4c9d-8eeb-d0a71fd8299d", + "vector": [ + 0.004480202216655016, + 0.05571252852678299, + -0.1459483802318573, + -0.01775178872048855, + 0.05214620754122734, + 0.009841394610702991, + 0.033716727048158646, + -0.002695057773962617, + -0.008261723443865776, + 0.02454909309744835, + 0.02451859414577484, + 0.04001497104763985, + 0.07523179799318314, + 0.010006717406213284, + 0.008002310991287231, + -0.025942908599972725, + 0.045965127646923065, + -0.06163357198238373, + -0.05744066834449768, + -0.020451143383979797, + -0.10136408358812332, + -0.045513816177845, + -0.03524553030729294, + 0.015569351613521576, + 0.14741337299346924, + 0.0026899969670921564, + -0.03814676031470299, + 0.014447811059653759, + -0.04427104443311691, + -0.00569369038566947, + 0.03969890996813774, + 0.024311667308211327, + -0.015806565061211586, + 0.04403159022331238, + -0.06477811187505722, + -0.05386286973953247, + 0.02212199755012989, + 0.014319430105388165, + -0.010068398900330067, + 0.05820478871464729, + -0.02492510713636875, + -0.03617352619767189, + 0.00906049832701683, + -0.04641478508710861, + -0.009656596928834915, + -0.002129563596099615, + -0.012029718607664108, + 0.00089615787146613, + 0.05096384882926941, + 0.02056526578962803, + -0.05927198752760887, + -0.023188160732388496, + -0.017466764897108078, + 0.002514324150979519, + 0.028819171711802483, + 0.01697026751935482, + -0.018162215128540993, + 0.039723969995975494, + 0.058078568428754807, + -0.012202226556837559, + 0.09724543988704681, + 0.061307549476623535, + -0.05212775245308876, + 0.09393694996833801, + 0.020214123651385307, + -0.003840324468910694, + -0.01208204310387373, + 0.06672979891300201, + -0.007472372613847256, + -0.011000927537679672, + 0.041308872401714325, + 0.014655595645308495, + 0.07213673740625381, + 0.04308178275823593, + -0.00614524818956852, + 0.0123892892152071, + -0.01641017012298107, + -0.06865064054727554, + 0.04476455599069595, + 0.009394984692335129, + 0.019144227728247643, + 0.005437098443508148, + 0.058442622423172, + 0.04430445283651352, + 0.07940586656332016, + -0.0405590757727623, + -0.04184352234005928, + 0.008864764124155045, + -0.013958681374788284, + 0.0414588525891304, + 0.04803543910384178, + 0.033590734004974365, + 0.051831718534231186, + 0.0591830313205719, + -0.018059952184557915, + -0.02529069595038891, + -0.025169679895043373, + -0.0005466965376399457, + -0.034224580973386765, + -0.035634174942970276, + -0.03912504017353058, + -0.020824557170271873, + 0.016422230750322342, + 0.03996151313185692, + 0.08429194986820221, + 0.06527533382177353, + 0.03186991438269615, + -0.01285950094461441, + -0.04701145365834236, + -0.04601465165615082, + 0.012680352665483952, + 0.01979796774685383, + -0.02825329266488552, + -0.009361901320517063, + 0.009883522056043148, + -0.004993535112589598, + 0.01610329933464527, + -0.052860453724861145, + 0.0249770600348711, + 0.07637391984462738, + -0.06048668175935745, + -0.023170890286564827, + -0.012832199223339558, + 0.06692349165678024, + -0.028366701677441597, + -0.011747770011425018, + -0.05726175010204315, + -0.004028651863336563, + 0.015147360041737556, + 0.02004243992269039, + -0.05446050688624382, + -0.03807949274778366, + -0.04859624430537224, + -0.018399789929389954, + 0.026167239993810654, + 0.05793995037674904, + -0.03327936306595802, + -0.008954503573477268, + 0.013190233148634434, + 0.021699093282222748, + -0.014454199932515621, + 0.010314606130123138, + -0.01948830671608448, + -0.02884243056178093, + -0.027254382148385048, + -0.04524196684360504, + 0.05255373567342758, + -0.037941835820674896, + 0.013128630816936493, + 0.012621775269508362, + 0.048559196293354034, + 0.017742181196808815, + -0.01683860830962658, + 0.045779917389154434, + 0.025596071034669876, + -0.023669734597206116, + 0.018296202644705772, + 0.015945376828312874, + 0.029013890773057938, + -0.021061334758996964, + 0.04327778518199921, + -0.0311514250934124, + -0.06920473277568817, + 0.053467489778995514, + -0.02684958651661873, + -0.05714907497167587, + 0.048476964235305786, + 0.010153546929359436, + 0.014876001514494419, + 0.05453280732035637, + -0.053649719804525375, + -0.02711251750588417, + -0.03460396081209183, + -0.03524193912744522, + 0.005000296514481306, + -0.01845044083893299, + 0.011157877743244171, + 0.008858248591423035, + 0.061597790569067, + -0.015346557833254337, + 0.018686113879084587, + -0.05643166974186897, + 0.05684800073504448, + 0.026907427236437798, + 0.03227028623223305, + -0.017019527032971382, + -0.0134808961302042, + 0.006753101479262114, + -0.018214574083685875, + -0.019773125648498535, + -0.033820055425167084, + -0.03487953543663025, + -0.008591784164309502, + -0.06821809709072113, + -0.06988085806369781, + -0.006116657517850399, + 0.03503403440117836, + 0.031203875318169594, + 0.010620868764817715, + 0.020701078698039055, + -0.06537684053182602, + -0.01452913973480463, + -0.04646958038210869, + -0.010924293659627438, + -0.033150698989629745, + -0.007836250588297844, + 0.030170338228344917, + 0.013314859941601753, + -0.0523173026740551, + 0.004235081374645233, + 0.059376463294029236, + -0.014406684786081314, + 0.004436089191585779, + 0.02938416786491871, + 0.008365356363356113, + -0.03925999626517296, + -0.038582541048526764, + -0.07152892649173737, + -0.007819518446922302, + 0.041678622364997864, + 0.05185263231396675, + 0.0009378077811561525, + -0.013609186746180058, + -0.04482169449329376, + 0.006932408548891544, + -0.05620540678501129, + -0.07607901841402054, + -0.02436140365898609, + -0.05644123628735542, + -0.028081344440579414, + -0.03277066349983215, + -0.061191804707050323, + 0.060769982635974884, + 0.023242836818099022, + 0.032777223736047745, + 0.05571052059531212, + 0.023940403014421463, + 0.04708835482597351, + -0.01696104370057583, + 0.025653915479779243, + -0.013000570237636566, + 0.04544433206319809, + -0.028088456019759178, + -0.028979092836380005, + -0.030716722831130028, + 0.015160785056650639, + 0.03278351202607155, + -0.03816504031419754, + 0.027631893754005432, + 0.05481836199760437, + 0.029161201789975166, + -0.00677994079887867, + 0.04995576664805412, + 0.07703159004449844, + 0.03407425433397293, + -0.022890983149409294, + -0.04837774485349655, + -0.026344548910856247, + 0.033901963382959366, + -0.04309634491801262, + 0.07401593774557114, + -0.062434595078229904, + 0.030218742787837982, + -0.01573188602924347, + -0.028376411646604538, + -0.027505140751600266, + -0.031186873093247414, + -0.008132589980959892, + 0.01546691358089447, + 0.01581835374236107, + 0.04287463799118996, + 0.024830883368849754, + -0.026967940852046013, + -0.0017126408638432622, + -0.006244476418942213, + -0.007650549523532391, + -0.0006553737912327051, + -0.0066547999158501625, + -0.017436951398849487, + -0.016260333359241486, + -0.019290585070848465, + 0.010773723013699055, + -0.06089746952056885, + 0.030710095539689064, + 0.027424491941928864, + -0.01026857178658247, + 0.02265476994216442, + 0.042738109827041626, + -0.0017582435393705964, + -0.01498791016638279, + 0.0156788881868124, + 0.014924847520887852, + 0.04711415618658066, + 0.036705132573843, + 0.029107119888067245, + 0.03778979554772377, + 0.056761909276247025, + 0.004328517243266106, + -0.006316020619124174, + -0.01792862080037594, + 0.03413846343755722, + 0.01576082408428192, + 0.039821263402700424, + 0.0011082907440140843, + -0.013256932608783245, + -0.022849716246128082, + 0.04406912252306938, + 0.02079588919878006, + 0.050579965114593506, + -0.008981001563370228, + -0.05814056843519211, + -0.035472188144922256, + 0.020304691046476364, + 0.014849986881017685, + 0.005165570415556431, + 0.051139455288648605, + -0.01779196597635746, + 0.017774363979697227, + 0.01385477278381586, + 0.002952008042484522, + 0.01444029901176691, + -0.06641402840614319, + 0.029019540175795555, + -0.03837987035512924, + -0.02394135668873787, + 0.055322688072919846, + -0.0320180207490921, + 0.0032695175614207983, + -0.03923075273633003, + -0.05329805612564087, + -0.0024713121820241213, + 0.014546829275786877, + -0.011846293695271015, + -0.054075855761766434, + 0.06325359642505646, + 0.039260994642972946, + 0.016352912411093712, + 0.024773936718702316, + -0.008650925941765308, + 0.0011733617866411805, + 0.04797343537211418, + -0.028803832828998566, + -0.023381192237138748, + -0.08008036017417908, + 0.0538228377699852, + 0.007198475766927004, + -0.017968647181987762, + -0.036695532500743866, + 0.025316208600997925, + 0.008021931163966656, + -0.01830284669995308, + 0.05752919986844063, + -0.020396556705236435, + 0.007289590779691935, + 0.018395546823740005, + -0.01978224329650402, + 0.03561916947364807, + 0.0450839139521122, + -0.026029156520962715, + -0.020008986815810204, + 0.017153680324554443, + -0.03261173889040947, + -0.018844475969672203, + -0.03567415475845337, + -0.036599673330783844, + 0.043303124606609344, + 0.04262951761484146, + 0.036832988262176514, + 0.026680372655391693, + 0.02630927786231041, + -0.029624836519360542, + -0.0422082394361496, + 0.04054514691233635, + 0.018434619531035423, + 0.0515998974442482, + -0.025256507098674774, + -0.060858938843011856, + -0.04124947637319565, + 0.015657106414437294, + 0.04904523119330406, + -0.008616337552666664, + -0.019969530403614044, + 0.021550659090280533, + -0.03262699395418167, + 0.008240937255322933, + 0.04148510843515396, + -0.00274369353428483, + -0.015579471364617348, + 0.040007587522268295, + -0.010586325079202652, + -0.014995903708040714, + -0.00754194799810648, + -0.045370861887931824, + 0.019147319719195366, + -0.02849636599421501, + -0.04036618396639824, + 0.01151171326637268, + 0.017831116914749146, + 0.037957411259412766, + 0.014604153111577034, + -0.02821839228272438, + -0.05185436084866524, + 0.005090485326945782, + -0.01728029176592827, + -0.024164408445358276, + 0.06671909987926483, + -0.02195684425532818, + -0.0400264598429203, + -0.0098758265376091, + 0.000737667316570878, + 0.012909354642033577, + -0.0037529419641941786, + 0.0026068072766065598, + -0.049797482788562775, + -0.011495345272123814, + 0.03971169888973236, + -0.006969680078327656, + 0.06216596066951752, + -0.04387683421373367, + -0.006838720757514238, + 0.049109041690826416, + 0.02067106030881405, + -0.008357982151210308, + 0.004072548355907202, + -0.04762018471956253, + 0.035335540771484375, + 0.031109552830457687, + 0.04302102327346802, + -0.00658362777903676, + -0.07162035256624222, + -0.008107749745249748, + 0.04603156819939613, + 0.008898700587451458, + 0.01395969744771719, + -0.0006011195364408195, + 0.009222028777003288, + 0.016310784965753555, + 0.014455843716859818, + 0.028253154829144478, + 0.05109156295657158, + 0.014864969998598099, + -0.026200179010629654, + -0.06340508162975311, + -0.02554444596171379, + -0.015158076770603657, + 0.0582333579659462, + 0.07723800837993622, + -0.033769700676202774, + -0.05513983964920044, + 0.0497354194521904, + 0.040261972695589066, + -0.006319129373878241, + -0.011349291540682316, + 0.028128592297434807, + 0.06409505754709244, + -0.03474124148488045, + 0.01089553628116846, + -0.031240062788128853, + -0.00028962339274585247, + 0.04702838510274887, + 0.03685152903199196, + 0.019205590710043907, + -0.008063651621341705, + 0.04891003668308258, + -0.006582725327461958, + -0.01485508680343628, + 0.006610417272895575, + -0.05010475963354111, + 0.036193691194057465, + 0.039510730654001236, + -0.026712743565440178, + 0.0018876376561820507, + 0.033829085528850555, + -0.011354278773069382, + 0.014450781047344208, + 0.02474832721054554, + 0.006457134615629911, + -0.01977895200252533, + -0.00722023518756032, + 0.08079168945550919, + 0.025269437581300735, + -0.01640414632856846, + -0.013398143462836742, + -0.07606197893619537, + 0.013131237588822842, + 0.019934212788939476, + 0.02528706006705761, + 0.030324392020702362, + -0.0050029330886900425, + 0.00997952464967966, + 0.047506798058748245, + 0.027899032458662987, + 0.039072491228580475, + -0.009376286529004574, + -0.04043779894709587, + -0.003790401853621006, + -0.011832754127681255, + 0.04313172027468681, + 0.06825552880764008, + -0.029348237439990044, + 0.009510253556072712, + 0.025013962760567665, + -0.017825687304139137, + 0.0076405503787100315, + -0.014338923618197441, + -0.032934702932834625, + 0.02722165919840336, + -0.048909686505794525, + -0.007810146547853947, + 8.834200707497075e-05, + 0.003432277822867036, + 0.03269403427839279, + 0.06340841948986053, + 0.06007852777838707, + 0.014712214469909668, + -0.03226682171225548, + -0.04666927456855774, + -0.0019343041349202394, + -0.06964866071939468, + 0.062257830053567886, + 0.043443463742733, + -0.05281869322061539, + -0.0105625931173563, + -0.01727733202278614, + -0.03481321409344673, + 0.04426395520567894, + 0.02281186915934086, + -0.05300859361886978, + 0.05310610681772232, + 0.02120661363005638, + 0.021924296393990517, + 0.01613384298980236, + -0.03464227542281151, + -0.02212393470108509, + -0.02065061591565609, + -0.053743477910757065, + -0.04996956139802933, + 0.016564760357141495, + 0.00043513518176041543, + 0.04539762809872627, + -0.007097937632352114, + 0.004486193414777517, + 0.02708885446190834, + -0.06541859358549118, + 0.03179788962006569, + 0.00792022980749607, + -0.03806352987885475, + -0.01703607849776745, + 0.029738223180174828, + -0.04594947397708893, + 0.0013365731574594975, + -0.07554368674755096, + 0.010613704100251198, + -0.020312849432229996, + 0.01680777408182621, + -0.04646461829543114, + -0.008750206790864468, + -0.031227540224790573, + -0.05086948722600937, + -0.040046293288469315, + 0.004581021144986153, + -0.030159205198287964, + 0.061230938881635666, + -0.010085627436637878, + -0.030067911371588707, + -0.07799109816551208, + 0.003792820032685995, + -0.03450485318899155, + 0.01321416161954403, + -0.041393477469682693, + 0.0037594372406601906, + -0.05729011446237564, + -0.029954511672258377, + -0.038134682923555374, + 0.03041197545826435, + 0.041851598769426346, + 0.013586344197392464, + 0.009517954662442207, + -0.0379149429500103, + -0.05303361639380455, + 0.052375487983226776, + -0.029709521681070328, + 0.03542878106236458, + 0.0013415856519713998, + 0.0270149614661932, + -0.04048033431172371, + -0.03457881882786751, + 0.018310148268938065, + 0.022899286821484566, + -0.014217817224562168, + 0.04014700651168823, + 0.0032339589670300484, + -0.02351330779492855, + 0.05006735026836395, + -0.02533848211169243, + 0.043345727026462555, + -0.020713146775960922, + -0.04497572407126427, + -0.05604824051260948, + -0.002972264541313052, + 0.0543651208281517, + -0.015297124162316322, + 0.0471140556037426, + -0.0277845598757267, + 0.005691290367394686, + 0.051957543939352036, + -0.010915357619524002, + 0.061658766120672226, + -0.026139510795474052, + -0.07580486685037613, + 0.012636140920221806, + 0.03940793126821518, + 0.004013937897980213, + 0.05224434658885002, + 0.03496624156832695, + -0.026177460327744484, + 0.037622395902872086, + -0.035366691648960114, + -0.02663540095090866, + -0.052202362567186356, + -0.0019038058817386627, + -0.06068830192089081, + 0.011160631664097309, + -0.03346390649676323, + 0.01161076221615076, + -0.03377499058842659, + -0.06862025707960129, + -0.017913026735186577, + 0.016776561737060547, + 0.024393398314714432, + 0.009737608022987843, + -0.0001341513270745054, + -0.02784162200987339, + -0.06293565779924393, + -0.014145000837743282, + 0.02930028736591339, + -0.030020181089639664, + -0.014133823104202747, + 0.01239168830215931, + 0.07054735720157623, + 0.010196701623499393, + -0.04868802800774574, + 0.0241183303296566, + -0.015641886740922928, + 0.0212082676589489, + -0.016528913751244545, + 0.012694619596004486, + 0.049077484756708145, + -0.01059405505657196, + -0.01571304351091385, + 0.07588662207126617, + 0.04270947352051735, + 0.011347380466759205, + 0.0020279171876609325, + 0.0056926836259663105, + 0.003676709020510316, + 0.02780984155833721, + -0.039659444242715836, + 0.01940532959997654, + -0.030400032177567482, + -0.023835940286517143, + 0.007260680198669434, + -0.03915594518184662, + -0.016143059358000755, + 0.027022335678339005, + 0.012695624493062496, + 0.00654649268835783, + 0.0028953570872545242, + -0.07500354945659637, + -0.01262845378369093, + 0.018621766939759254, + -0.03345731273293495, + 0.0009807853493839502, + -0.011328727938234806, + 0.032614815980196, + 0.02457674965262413, + 0.008987754583358765, + 0.0074556684121489525, + -0.016726940870285034, + -0.04372112452983856, + -0.026138275861740112, + 0.01460978202521801, + -0.0018687699921429157, + -0.01504184864461422, + 0.0291975736618042, + -0.08243843913078308, + 0.04372790455818176, + -0.03766077384352684, + 0.052301015704870224, + -0.00856063049286604, + -0.015745094045996666, + -0.037806496024131775, + -0.030004415661096573, + -0.04191785678267479, + 0.02835415117442608, + -0.008592316880822182, + 0.0006197852781042457, + -0.02833535522222519, + 0.011265256442129612, + 0.08267124742269516, + -0.02028210088610649, + 0.007515270728617907, + 0.017721697688102722, + 0.04881494492292404, + -0.026109762489795685, + -0.02003922127187252, + -0.007310193497687578, + 0.0104212099686265, + -0.04984555393457413, + -0.02612251788377762, + -0.009166986681520939, + -0.026135388761758804, + -0.03754410892724991, + 0.016528800129890442, + 0.07542476058006287, + -0.0010429902467876673, + -0.03211371228098869, + -0.005090772174298763, + -0.02590389922261238, + 0.010289972648024559, + 0.06073283776640892, + 0.020731467753648758, + -0.03629828244447708, + -0.048426397144794464, + -0.021554691717028618, + -0.013838764280080795, + 0.07362484186887741, + -0.05128122493624687, + -0.0017484466079622507, + -0.0227632075548172, + 0.0037273361813277006, + 0.0044632949866354465, + -0.013041398487985134, + 0.020383963361382484, + -0.05165550857782364, + -0.0024354243651032448, + -0.02342897653579712, + -0.037315431982278824, + -0.043784890323877335, + -0.018593236804008484, + -0.030044520273804665, + 0.0008633139659650624, + -0.004080752842128277, + 0.05212042108178139, + 0.02690725028514862, + -0.008782251738011837, + -0.0393797941505909, + -0.009584106504917145, + 0.06029988452792168, + -0.04454880207777023, + -0.009639243595302105, + 0.018929382786154747, + -0.026322180405259132, + -0.02482670359313488, + 0.0008284770301543176, + -0.024281343445181847, + 0.02122873067855835, + 0.019121350720524788, + 0.08850973099470139, + 0.07247374206781387, + 0.01175956055521965, + -0.01666785590350628, + 0.0492577850818634, + 0.0039045754820108414, + 0.000672859896440059, + -0.029885176569223404, + -0.04246489703655243, + -0.009598914533853531 + ], + "payload": { + "id": "fb778a36-e589-4c9d-8eeb-d0a71fd8299d", + "memory": "The user is a professor.", + "metadata": { + "user_id": "user_123", + "session_id": "0c3d29d2-e078-4a03-960b-563bb33ec7ae", + "status": "activated", + "type": "fact", + "memory_time": "2025-06-03", + "source": "conversation", + "confidence": 90.0, + "entities": [ + "professor" + ], + "tags": [ + "academic", + "professors" + ], + "visibility": "private", + "updated_at": "2025-06-03T17:14:18" + } + } + } +]