From 0fff23d2a2afe2512062f02888b3cb73c63e24a9 Mon Sep 17 00:00:00 2001 From: Ke Sun Date: Wed, 24 Dec 2025 16:06:54 +0800 Subject: [PATCH] feat(memory): make config_id optional and improve configuration validation - Make config_id optional in UserInput and Write_UserInput schemas - Update write_memory and read_memory method signatures to accept Optional[str] for config_id - Implement automatic config retrieval from end_user connection when config_id is not provided - Add explicit error handling for missing memory configurations with descriptive error messages - Improve emotion_controller to validate config_id using MemoryConfigService when provided - Fallback to get_end_user_connected_config when config_id is None - Distinguish between specific "no configuration found" errors and other exceptions for better debugging - Ensures users can operate without explicitly providing config_id if they have a connected configuration --- api/app/controllers/emotion_controller.py | 23 +++++++++++++++++++---- api/app/schemas/memory_agent_schema.py | 4 ++-- api/app/services/memory_agent_service.py | 18 ++++++++++++++---- 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/api/app/controllers/emotion_controller.py b/api/app/controllers/emotion_controller.py index 144aa281..90465c95 100644 --- a/api/app/controllers/emotion_controller.py +++ b/api/app/controllers/emotion_controller.py @@ -210,13 +210,28 @@ async def get_emotion_suggestions( """ try: # 验证 config_id(如果提供) + # 获取终端用户关联的配置 config_id = request.config_id - if config_id is not None: - from app.controllers.memory_agent_controller import validate_config_id + if config_id is None: + # 如果没有提供 config_id,尝试获取用户关联的配置 try: - config_id = validate_config_id(config_id, db) + from app.services.memory_agent_service import ( + get_end_user_connected_config, + ) + connected_config = get_end_user_connected_config(request.group_id, db) + config_id = connected_config.get("memory_config_id") except ValueError as e: - return fail(BizCode.INVALID_PARAMETER, "配置ID无效", str(e)) + return fail(BizCode.INVALID_PARAMETER, "无法获取用户关联的配置", str(e)) + else: + # 如果提供了 config_id,验证其有效性 + from app.services.memory_config_service import MemoryConfigService + try: + config_service = MemoryConfigService(db) + config = config_service.get_config_by_id(config_id) + if not config: + return fail(BizCode.INVALID_PARAMETER, "配置ID无效", f"配置 {config_id} 不存在") + except Exception as e: + return fail(BizCode.INVALID_PARAMETER, "配置ID验证失败", str(e)) api_logger.info( f"用户 {current_user.username} 请求获取个性化情绪建议", diff --git a/api/app/schemas/memory_agent_schema.py b/api/app/schemas/memory_agent_schema.py index e6fed0e5..47dc6b2a 100644 --- a/api/app/schemas/memory_agent_schema.py +++ b/api/app/schemas/memory_agent_schema.py @@ -8,13 +8,13 @@ class UserInput(BaseModel): history: list[dict] search_switch: str group_id: str - config_id: str + config_id: Optional[str] = None class Write_UserInput(BaseModel): message: str group_id: str - config_id: str + config_id: Optional[str] = None class End_User_Information(BaseModel): end_user_name: str # 这是要更新的用户名 diff --git a/api/app/services/memory_agent_service.py b/api/app/services/memory_agent_service.py index e23f9471..8193da8a 100644 --- a/api/app/services/memory_agent_service.py +++ b/api/app/services/memory_agent_service.py @@ -255,7 +255,7 @@ class MemoryAgentService: logger.info("Log streaming completed, cleaning up resources") # LogStreamer uses context manager for file handling, so cleanup is automatic - async def write_memory(self, group_id: str, message: str, config_id: str, db: Session, storage_type: str, user_rag_memory_id: str) -> str: + async def write_memory(self, group_id: str, message: str, config_id: Optional[str], db: Session, storage_type: str, user_rag_memory_id: str) -> str: """ Process write operation with config_id @@ -278,8 +278,13 @@ class MemoryAgentService: try: connected_config = get_end_user_connected_config(group_id, db) config_id = connected_config.get("memory_config_id") + if config_id is None: + raise ValueError(f"No memory configuration found for end_user {group_id}. Please ensure the user has a connected memory configuration.") except Exception as e: - logger.warning(f"Failed to get connected config for end_user {group_id}: {e}") + if "No memory configuration found" in str(e): + raise # Re-raise our specific error + logger.error(f"Failed to get connected config for end_user {group_id}: {e}") + raise ValueError(f"Unable to determine memory configuration for end_user {group_id}: {e}") import time start_time = time.time() @@ -356,7 +361,7 @@ class MemoryAgentService: message: str, history: List[Dict], search_switch: str, - config_id: str, + config_id: Optional[str], db: Session, storage_type: str, user_rag_memory_id: str @@ -394,8 +399,13 @@ class MemoryAgentService: try: connected_config = get_end_user_connected_config(group_id, db) config_id = connected_config.get("memory_config_id") + if config_id is None: + raise ValueError(f"No memory configuration found for end_user {group_id}. Please ensure the user has a connected memory configuration.") except Exception as e: - logger.warning(f"Failed to get connected config for end_user {group_id}: {e}") + if "No memory configuration found" in str(e): + raise # Re-raise our specific error + logger.error(f"Failed to get connected config for end_user {group_id}: {e}") + raise ValueError(f"Unable to determine memory configuration for end_user {group_id}: {e}") logger.info(f"Read operation for group {group_id} with config_id {config_id}")