Merge pull request #310 from SuanmoSuanyangTechnology/fix/memoryConfig-ontology
Fix/memory config ontology
This commit is contained in:
@@ -195,6 +195,11 @@ def update_config(
|
|||||||
api_logger.warning(f"用户 {current_user.username} 尝试更新配置但未选择工作空间")
|
api_logger.warning(f"用户 {current_user.username} 尝试更新配置但未选择工作空间")
|
||||||
return fail(BizCode.INVALID_PARAMETER, "请先切换到一个工作空间", "current_workspace_id is None")
|
return fail(BizCode.INVALID_PARAMETER, "请先切换到一个工作空间", "current_workspace_id is None")
|
||||||
|
|
||||||
|
# 校验至少有一个字段需要更新
|
||||||
|
if payload.config_name is None and payload.config_desc is None and payload.scene_id is None:
|
||||||
|
api_logger.warning(f"用户 {current_user.username} 尝试更新配置但未提供任何更新字段")
|
||||||
|
return fail(BizCode.INVALID_PARAMETER, "请至少提供一个需要更新的字段", "config_name, config_desc, scene_id 均为空")
|
||||||
|
|
||||||
api_logger.info(f"用户 {current_user.username} 在工作空间 {workspace_id} 请求更新配置: {payload.config_id}")
|
api_logger.info(f"用户 {current_user.username} 在工作空间 {workspace_id} 请求更新配置: {payload.config_id}")
|
||||||
try:
|
try:
|
||||||
svc = DataConfigService(db)
|
svc = DataConfigService(db)
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ from app.services.ontology_service import OntologyService
|
|||||||
from app.core.memory.llm_tools.openai_client import OpenAIClient
|
from app.core.memory.llm_tools.openai_client import OpenAIClient
|
||||||
from app.core.memory.utils.validation.owl_validator import OWLValidator
|
from app.core.memory.utils.validation.owl_validator import OWLValidator
|
||||||
from app.services.model_service import ModelConfigService
|
from app.services.model_service import ModelConfigService
|
||||||
|
from app.repositories.ontology_scene_repository import OntologySceneRepository
|
||||||
|
|
||||||
|
|
||||||
api_logger = get_api_logger()
|
api_logger = get_api_logger()
|
||||||
@@ -766,6 +767,46 @@ async def delete_scene(
|
|||||||
return fail(BizCode.INTERNAL_ERROR, "场景删除失败", str(e))
|
return fail(BizCode.INTERNAL_ERROR, "场景删除失败", str(e))
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/scenes/simple", response_model=ApiResponse)
|
||||||
|
async def get_scenes_simple(
|
||||||
|
db: Session = Depends(get_db),
|
||||||
|
current_user: User = Depends(get_current_user)
|
||||||
|
):
|
||||||
|
"""获取场景简单列表(轻量级,用于下拉选择)
|
||||||
|
|
||||||
|
仅返回 scene_id 和 scene_name,不加载关联数据,响应速度快。
|
||||||
|
适用于前端下拉选择场景的场景。
|
||||||
|
|
||||||
|
Args:
|
||||||
|
db: 数据库会话
|
||||||
|
current_user: 当前用户
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
ApiResponse: 包含场景简单列表
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
GET /scenes/simple
|
||||||
|
返回: {"data": [{"scene_id": "xxx", "scene_name": "场景1"}, ...]}
|
||||||
|
"""
|
||||||
|
api_logger.info(f"Simple scene list requested by user {current_user.id}")
|
||||||
|
|
||||||
|
try:
|
||||||
|
workspace_id = current_user.current_workspace_id
|
||||||
|
if not workspace_id:
|
||||||
|
api_logger.warning(f"User {current_user.id} has no current workspace")
|
||||||
|
return fail(BizCode.BAD_REQUEST, "请求参数无效", "当前用户没有工作空间")
|
||||||
|
|
||||||
|
repo = OntologySceneRepository(db)
|
||||||
|
scenes = repo.get_simple_list(workspace_id)
|
||||||
|
|
||||||
|
api_logger.info(f"Simple scene list retrieved: {len(scenes)} scenes")
|
||||||
|
return success(data=scenes, msg="查询成功")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
api_logger.error(f"Failed to get simple scene list: {str(e)}", exc_info=True)
|
||||||
|
return fail(BizCode.INTERNAL_ERROR, "查询失败", str(e))
|
||||||
|
|
||||||
|
|
||||||
@router.get("/scenes", response_model=ApiResponse)
|
@router.get("/scenes", response_model=ApiResponse)
|
||||||
async def get_scenes(
|
async def get_scenes(
|
||||||
workspace_id: Optional[str] = None,
|
workspace_id: Optional[str] = None,
|
||||||
|
|||||||
@@ -279,6 +279,9 @@ class MemoryConfigRepository:
|
|||||||
if update.config_desc is not None:
|
if update.config_desc is not None:
|
||||||
db_config.config_desc = update.config_desc
|
db_config.config_desc = update.config_desc
|
||||||
has_update = True
|
has_update = True
|
||||||
|
if update.scene_id is not None:
|
||||||
|
db_config.scene_id = update.scene_id
|
||||||
|
has_update = True
|
||||||
|
|
||||||
if not has_update:
|
if not has_update:
|
||||||
raise ValueError("No fields to update")
|
raise ValueError("No fields to update")
|
||||||
@@ -650,28 +653,32 @@ class MemoryConfigRepository:
|
|||||||
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[Tuple[MemoryConfig, Optional[str]]]:
|
||||||
"""获取所有配置参数
|
"""获取所有配置参数,包含关联的场景名称
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
db: 数据库会话
|
db: 数据库会话
|
||||||
workspace_id: 工作空间ID,用于过滤查询结果
|
workspace_id: 工作空间ID,用于过滤查询结果
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
List[MemoryConfig]: 配置列表
|
List[Tuple[MemoryConfig, Optional[str]]]: 配置列表,每项为 (配置对象, 场景名称)
|
||||||
"""
|
"""
|
||||||
|
from app.models.ontology_scene import OntologyScene
|
||||||
|
|
||||||
db_logger.debug(f"查询所有配置: workspace_id={workspace_id}")
|
db_logger.debug(f"查询所有配置: workspace_id={workspace_id}")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
query = db.query(MemoryConfig)
|
query = db.query(MemoryConfig, OntologyScene.scene_name).outerjoin(
|
||||||
|
OntologyScene, MemoryConfig.scene_id == OntologyScene.scene_id
|
||||||
|
)
|
||||||
|
|
||||||
if workspace_id:
|
if workspace_id:
|
||||||
query = query.filter(MemoryConfig.workspace_id == workspace_id)
|
query = query.filter(MemoryConfig.workspace_id == workspace_id)
|
||||||
|
|
||||||
configs = query.order_by(desc(MemoryConfig.updated_at)).all()
|
results = query.order_by(desc(MemoryConfig.updated_at)).all()
|
||||||
|
|
||||||
db_logger.debug(f"配置列表查询成功: 数量={len(configs)}")
|
db_logger.debug(f"配置列表查询成功: 数量={len(results)}")
|
||||||
return configs
|
return results
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
db_logger.error(f"查询所有配置失败: workspace_id={workspace_id} - {str(e)}")
|
db_logger.error(f"查询所有配置失败: workspace_id={workspace_id} - {str(e)}")
|
||||||
|
|||||||
@@ -392,3 +392,48 @@ class OntologySceneRepository:
|
|||||||
exc_info=True
|
exc_info=True
|
||||||
)
|
)
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
def get_simple_list(self, workspace_id: UUID) -> List[dict]:
|
||||||
|
"""获取场景简单列表(仅包含scene_id和scene_name,用于下拉选择)
|
||||||
|
|
||||||
|
这是一个轻量级查询,不加载关联的classes,响应速度快。
|
||||||
|
|
||||||
|
Args:
|
||||||
|
workspace_id: 工作空间ID
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
List[dict]: 场景简单列表,每项包含scene_id和scene_name
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
>>> repo = OntologySceneRepository(db)
|
||||||
|
>>> scenes = repo.get_simple_list(workspace_id)
|
||||||
|
>>> # [{"scene_id": "xxx", "scene_name": "场景1"}, ...]
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
logger.debug(f"Getting simple scene list for workspace: {workspace_id}")
|
||||||
|
|
||||||
|
# 只查询需要的字段,不加载关联数据
|
||||||
|
results = self.db.query(
|
||||||
|
OntologyScene.scene_id,
|
||||||
|
OntologyScene.scene_name
|
||||||
|
).filter(
|
||||||
|
OntologyScene.workspace_id == workspace_id
|
||||||
|
).order_by(
|
||||||
|
OntologyScene.updated_at.desc()
|
||||||
|
).all()
|
||||||
|
|
||||||
|
scenes = [
|
||||||
|
{"scene_id": str(r.scene_id), "scene_name": r.scene_name}
|
||||||
|
for r in results
|
||||||
|
]
|
||||||
|
|
||||||
|
logger.info(f"Found {len(scenes)} scenes (simple list) in workspace {workspace_id}")
|
||||||
|
|
||||||
|
return scenes
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(
|
||||||
|
f"Failed to get simple scene list: {str(e)}",
|
||||||
|
exc_info=True
|
||||||
|
)
|
||||||
|
raise
|
||||||
|
|||||||
@@ -248,8 +248,9 @@ class ConfigParamsDelete(BaseModel): # 删除配置参数模型(请求体)
|
|||||||
|
|
||||||
class ConfigUpdate(BaseModel): # 更新记忆萃取引擎配置参数时使用的模型
|
class ConfigUpdate(BaseModel): # 更新记忆萃取引擎配置参数时使用的模型
|
||||||
config_id: Union[uuid.UUID, int, str] = None
|
config_id: Union[uuid.UUID, int, str] = None
|
||||||
config_name: str = Field("配置名称", description="配置名称(字符串)")
|
config_name: Optional[str] = Field(None, description="配置名称(字符串)")
|
||||||
config_desc: str = Field("配置描述", description="配置描述(字符串)")
|
config_desc: Optional[str] = Field(None, description="配置描述(字符串)")
|
||||||
|
scene_id: Optional[uuid.UUID] = Field(None, description="本体场景ID")
|
||||||
|
|
||||||
|
|
||||||
class ConfigUpdateExtracted(BaseModel): # 更新记忆萃取引擎配置参数时使用的模型
|
class ConfigUpdateExtracted(BaseModel): # 更新记忆萃取引擎配置参数时使用的模型
|
||||||
|
|||||||
@@ -183,11 +183,11 @@ class DataConfigService: # 数据配置服务类(PostgreSQL)
|
|||||||
|
|
||||||
# --- Read All ---
|
# --- Read All ---
|
||||||
def get_all(self, workspace_id = None) -> List[Dict[str, Any]]: # 获取所有配置参数
|
def get_all(self, workspace_id = None) -> List[Dict[str, Any]]: # 获取所有配置参数
|
||||||
configs = MemoryConfigRepository.get_all(self.db, workspace_id)
|
results = MemoryConfigRepository.get_all(self.db, workspace_id)
|
||||||
|
|
||||||
# 将 ORM 对象转换为字典列表
|
# 将 ORM 对象转换为字典列表
|
||||||
data_list = []
|
data_list = []
|
||||||
for config in configs:
|
for config, scene_name in results:
|
||||||
# 安全地转换 user_id 为 int
|
# 安全地转换 user_id 为 int
|
||||||
config_id_old = None
|
config_id_old = None
|
||||||
if config.config_id_old:
|
if config.config_id_old:
|
||||||
@@ -209,7 +209,8 @@ class DataConfigService: # 数据配置服务类(PostgreSQL)
|
|||||||
"end_user_id": config.end_user_id,
|
"end_user_id": config.end_user_id,
|
||||||
"config_id_old": config_id_old,
|
"config_id_old": config_id_old,
|
||||||
"apply_id": config.apply_id,
|
"apply_id": config.apply_id,
|
||||||
"scene_id": config.scene_id,
|
"scene_id": str(config.scene_id) if config.scene_id else None,
|
||||||
|
"scene_name": scene_name, # 新增:场景名称
|
||||||
"llm_id": config.llm_id,
|
"llm_id": config.llm_id,
|
||||||
"embedding_id": config.embedding_id,
|
"embedding_id": config.embedding_id,
|
||||||
"rerank_id": config.rerank_id,
|
"rerank_id": config.rerank_id,
|
||||||
@@ -635,10 +636,9 @@ async def analytics_recent_activity_stats() -> Dict[str, Any]:
|
|||||||
if m < 1:
|
if m < 1:
|
||||||
latest_relative = "刚刚"
|
latest_relative = "刚刚"
|
||||||
elif m < 60:
|
elif m < 60:
|
||||||
latest_relative = f"{m}分钟前"
|
latest_relative = "一会前"
|
||||||
else:
|
else:
|
||||||
h = int(m // 60)
|
latest_relative = "较早前"
|
||||||
latest_relative = f"{h}小时前" if h < 24 else f"{int(h // 24)}天前"
|
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user