Merge branch 'release/v0.2.2'

# Conflicts:
#	api/app/repositories/memory_config_repository.py
#	api/app/services/emotion_analytics_service.py
#	api/app/utils/config_utils.py
This commit is contained in:
Mark
2026-01-31 15:55:58 +08:00
3 changed files with 202 additions and 195 deletions

View File

@@ -32,6 +32,8 @@ db_logger = get_db_logger()
config_logger = get_config_logger() config_logger = get_config_logger()
TABLE_NAME = "memory_config" TABLE_NAME = "memory_config"
class MemoryConfigRepository: class MemoryConfigRepository:
"""记忆配置Repository """记忆配置Repository
@@ -189,7 +191,6 @@ class MemoryConfigRepository:
raise RuntimeError("reflection config not found") raise RuntimeError("reflection config not found")
return memory_config return memory_config
@staticmethod @staticmethod
def build_select_all(workspace_id: uuid.UUID) -> Tuple[str, Dict]: def build_select_all(workspace_id: uuid.UUID) -> Tuple[str, Dict]:
"""构建查询所有配置的语句SQLAlchemy text() 命名参数) """构建查询所有配置的语句SQLAlchemy text() 命名参数)
@@ -289,7 +290,6 @@ class MemoryConfigRepository:
db_logger.error(f"更新记忆配置失败: config_id={update.config_id} - {str(e)}") db_logger.error(f"更新记忆配置失败: config_id={update.config_id} - {str(e)}")
raise raise
@staticmethod @staticmethod
def update_extracted(db: Session, update: ConfigUpdateExtracted) -> Optional[MemoryConfig]: def update_extracted(db: Session, update: ConfigUpdateExtracted) -> Optional[MemoryConfig]:
"""更新记忆萃取引擎配置 """更新记忆萃取引擎配置
@@ -516,8 +516,9 @@ class MemoryConfigRepository:
except Exception as e: except Exception as e:
db_logger.error(f"根据ID查询记忆配置失败: config_id={config_id} - {str(e)}") db_logger.error(f"根据ID查询记忆配置失败: config_id={config_id} - {str(e)}")
raise raise
@staticmethod @staticmethod
def get_config_with_workspace(db: Session, config_id: uuid.UUID) -> Optional[tuple]: def get_config_with_workspace(db: Session, config_id: uuid.UUID | int | str) -> Optional[tuple]:
"""Get memory config and its associated workspace information """Get memory config and its associated workspace information
Args: Args:
@@ -526,7 +527,6 @@ class MemoryConfigRepository:
Returns: Returns:
Optional[tuple]: (MemoryConfig, Workspace) tuple, None if not found Optional[tuple]: (MemoryConfig, Workspace) tuple, None if not found
Raises: Raises:
ValueError: Raised when config exists but workspace doesn't ValueError: Raised when config exists but workspace doesn't
""" """
@@ -535,6 +535,7 @@ class MemoryConfigRepository:
from app.models.workspace_model import Workspace from app.models.workspace_model import Workspace
start_time = time.time() start_time = time.time()
config_id = resolve_config_id(config_id, db)
# Log configuration loading start # Log configuration loading start
config_logger.info( config_logger.info(
@@ -552,7 +553,6 @@ class MemoryConfigRepository:
result = db.query(MemoryConfig, Workspace).join( result = db.query(MemoryConfig, Workspace).join(
Workspace, MemoryConfig.workspace_id == Workspace.id Workspace, MemoryConfig.workspace_id == Workspace.id
).filter(MemoryConfig.config_id == config_id).first() ).filter(MemoryConfig.config_id == config_id).first()
elapsed_ms = (time.time() - start_time) * 1000 elapsed_ms = (time.time() - start_time) * 1000
if not result: if not result:
@@ -583,8 +583,10 @@ class MemoryConfigRepository:
"elapsed_ms": elapsed_ms "elapsed_ms": elapsed_ms
} }
) )
db_logger.error(f"Memory config {config_id} references non-existent workspace {config_only.workspace_id}") db_logger.error(
raise ValueError(f"Workspace {config_only.workspace_id} not found for configuration {config_id}") f"Memory config {config_id} references non-existent workspace {config_only.workspace_id}")
raise ValueError(
f"Workspace {config_only.workspace_id} not found for configuration {config_id}")
config_logger.debug( config_logger.debug(
"Configuration not found", "Configuration not found",
@@ -615,7 +617,8 @@ class MemoryConfigRepository:
} }
) )
db_logger.debug(f"Memory config and workspace query successful: config={config.config_name}, workspace={workspace.name}") db_logger.debug(
f"Memory config and workspace query successful: config={config.config_name}, workspace={workspace.name}")
return (config, workspace) return (config, workspace)
except ValueError: except ValueError:
@@ -636,9 +639,9 @@ class MemoryConfigRepository:
}, },
exc_info=True exc_info=True
) )
db_logger.error(f"Failed to query memory config and workspace: config_id={config_id} - {str(e)}") db_logger.error(f"Failed to query memory config and workspace: config_id={config_id} - {str(e)}")
raise raise
@staticmethod @staticmethod
def get_all(db: Session, workspace_id: Optional[uuid.UUID] = None) -> List[MemoryConfig]: def get_all(db: Session, workspace_id: Optional[uuid.UUID] = None) -> List[MemoryConfig]:
"""获取所有配置参数 """获取所有配置参数

View File

@@ -17,12 +17,15 @@ from app.repositories.neo4j.neo4j_connector import Neo4jConnector
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from app.utils.config_utils import resolve_config_id
logger = get_business_logger() logger = get_business_logger()
class EmotionSuggestion(BaseModel): class EmotionSuggestion(BaseModel):
"""情绪建议模型""" """情绪建议模型"""
type: str = Field(..., description="建议类型emotion_balance/activity_recommendation/social_connection/stress_management") type: str = Field(...,
description="建议类型emotion_balance/activity_recommendation/social_connection/stress_management")
title: str = Field(..., description="建议标题") title: str = Field(..., description="建议标题")
content: str = Field(..., description="建议内容") content: str = Field(..., description="建议内容")
priority: str = Field(..., description="优先级high/medium/low") priority: str = Field(..., description="优先级high/medium/low")
@@ -498,7 +501,7 @@ class EmotionAnalyticsService:
connected_config = get_end_user_connected_config(end_user_id, db) connected_config = get_end_user_connected_config(end_user_id, db)
config_id = connected_config.get("memory_config_id") config_id = connected_config.get("memory_config_id")
config_id = resolve_config_id(config_id, db)
if config_id is not None: if config_id is not None:
from app.services.memory_config_service import ( from app.services.memory_config_service import (
MemoryConfigService, MemoryConfigService,

View File

@@ -7,7 +7,7 @@ from uuid import UUID
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
def resolve_config_id(config_id: UUID | int, db: Session) -> UUID: def resolve_config_id(config_id: UUID | int|str, db: Session) -> UUID:
""" """
解析 config_id如果是整数则通过 config_id_old 查找对应的 UUID 解析 config_id如果是整数则通过 config_id_old 查找对应的 UUID
@@ -21,16 +21,17 @@ def resolve_config_id(config_id: UUID | int, db: Session) -> UUID:
Raises: Raises:
ValueError: 当找不到对应的配置时 ValueError: 当找不到对应的配置时
""" """
from app.models.memory_config_model import MemoryConfig from app.models.memory_config_model import MemoryConfig
if isinstance(config_id, UUID): if isinstance(config_id, UUID):
return config_id return config_id
if isinstance(config_id, str) and len(config_id)<=6: if isinstance(config_id, str) and len(config_id)<=6:
memory_config = db.query(MemoryConfig).filter( memory_config = db.query(MemoryConfig).filter(
MemoryConfig.config_id_old == config_id MemoryConfig.config_id_old == int(config_id)
).first() ).first()
print(memory_config)
if not memory_config: if not memory_config:
raise ValueError(f"未找到 config_id_old={config_id} 对应的配置") raise ValueError(f"STR 未找到 config_id_old={config_id} 对应的配置")
return memory_config.config_id return memory_config.config_id
if isinstance(config_id, int): if isinstance(config_id, int):
memory_config = db.query(MemoryConfig).filter( memory_config = db.query(MemoryConfig).filter(
@@ -38,7 +39,7 @@ def resolve_config_id(config_id: UUID | int, db: Session) -> UUID:
).first() ).first()
if not memory_config: if not memory_config:
raise ValueError(f"未找到 config_id_old={config_id} 对应的配置") raise ValueError(f"INT 未找到 config_id_old={config_id} 对应的配置")
return memory_config.config_id return memory_config.config_id