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
This commit is contained in:
Ke Sun
2025-12-24 16:06:54 +08:00
parent b515e76efb
commit 0fff23d2a2
3 changed files with 35 additions and 10 deletions

View File

@@ -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} 请求获取个性化情绪建议",

View File

@@ -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 # 这是要更新的用户名

View File

@@ -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}")