Merge pull request #734 from SuanmoSuanyangTechnology/fix/end-user-app-connection

fix(app): memory config initialization for end users
This commit is contained in:
Ke Sun
2026-03-30 16:51:33 +08:00
committed by GitHub
4 changed files with 139 additions and 9 deletions

View File

@@ -354,6 +354,16 @@ async def chat(
other_id=other_id,
original_user_id=user_id
)
# Only extract and set memory_config_id when the end user doesn't have one yet
if not new_end_user.memory_config_id:
from app.services.memory_config_service import MemoryConfigService
memory_config_service = MemoryConfigService(db)
memory_config_id, _ = memory_config_service.extract_memory_config_id(release.type, release.config or {})
if memory_config_id:
new_end_user.memory_config_id = memory_config_id
db.commit()
db.refresh(new_end_user)
end_user_id = str(new_end_user.id)
# appid = share.app_id

View File

@@ -329,7 +329,6 @@ class LangChainAgent:
db.close()
except Exception as e:
logger.warning(f"Failed to get db session: {e}")
actual_end_user_id = end_user_id if end_user_id is not None else "unknown"
logger.info(f'写入类型{storage_type, str(end_user_id), message, str(user_rag_memory_id)}')
print(f'写入类型{storage_type, str(end_user_id), message, str(user_rag_memory_id)}')
try:

View File

@@ -132,6 +132,82 @@ class EndUserRepository:
db_logger.error(f"获取或创建终端用户时出错: {str(e)}")
raise
def get_or_create_end_user_with_config(
self,
app_id: Optional[uuid.UUID],
workspace_id: uuid.UUID,
other_id: str,
memory_config_id: Optional[uuid.UUID] = None,
other_name: Optional[str] = None
) -> EndUser:
"""获取或创建终端用户,并在单次事务中关联记忆配置。
与 get_or_create_end_user 类似,但额外支持在创建/获取时
一并设置 memory_config_id避免多次提交。
Args:
app_id: 应用ID可为 None
workspace_id: 工作空间ID
other_id: 第三方ID
memory_config_id: 记忆配置ID可选仅在用户尚无配置时设置
other_name: 用户名称(用于创建 EndUserInfo
Returns:
EndUser: 终端用户对象(已关联记忆配置)
"""
try:
end_user = (
self.db.query(EndUser)
.filter(
EndUser.workspace_id == workspace_id,
EndUser.other_id == other_id
)
.order_by(EndUser.created_at.asc())
.first()
)
if end_user:
db_logger.debug(f"找到现有终端用户: workspace_id={workspace_id}, other_id={other_id}")
if app_id is not None:
end_user.app_id = app_id
if memory_config_id and not end_user.memory_config_id:
end_user.memory_config_id = memory_config_id
self.db.commit()
self.db.refresh(end_user)
return end_user
# 创建新用户
end_user = EndUser(
app_id=app_id,
workspace_id=workspace_id,
other_id=other_id,
memory_config_id=memory_config_id,
)
self.db.add(end_user)
self.db.flush()
end_user_info = EndUserInfo(
end_user_id=end_user.id,
other_name=other_name or "",
aliases=[],
meta_data={}
)
self.db.add(end_user_info)
self.db.commit()
self.db.refresh(end_user)
db_logger.info(
f"创建新终端用户及其信息: (other_id: {other_id}) for workspace {workspace_id}, "
f"memory_config_id={memory_config_id}"
)
return end_user
except Exception as e:
self.db.rollback()
db_logger.error(f"获取或创建终端用户(含配置)时出错: {str(e)}")
raise
def get_by_id(self, end_user_id: uuid.UUID) -> Optional[EndUser]:
"""根据ID获取终端用户用于缓存操作
@@ -515,6 +591,51 @@ class EndUserRepository:
)
raise
def batch_update_memory_config_id_by_app(
self,
app_id: uuid.UUID,
memory_config_id: uuid.UUID
) -> int:
"""批量更新应用下所有终端用户的 memory_config_id
Args:
app_id: 应用ID
memory_config_id: 新的记忆配置ID
Returns:
int: 更新的终端用户数量
Raises:
Exception: 数据库操作失败时抛出
"""
try:
from sqlalchemy import update
stmt = (
update(EndUser)
.where(EndUser.app_id == app_id)
.values(memory_config_id=memory_config_id)
)
result = self.db.execute(stmt)
self.db.commit()
updated_count = result.rowcount
db_logger.info(
f"批量更新终端用户记忆配置: app_id={app_id}, "
f"memory_config_id={memory_config_id}, updated_count={updated_count}"
)
return updated_count
except Exception as e:
self.db.rollback()
db_logger.error(
f"批量更新终端用户记忆配置时出错: app_id={app_id}, "
f"memory_config_id={memory_config_id}, error={str(e)}"
)
raise
def count_by_memory_config_id(
self,
memory_config_id: uuid.UUID

View File

@@ -1682,15 +1682,15 @@ class AppService:
return config.config_id
def _update_endusers_memory_config_by_workspace(
def _update_endusers_memory_config_by_app(
self,
workspace_id: uuid.UUID,
app_id: uuid.UUID,
memory_config_id: uuid.UUID
) -> int:
"""批量更新应用下所有终端用户的 memory_config_id
Args:
workspace_id: 工作空间ID
app_id: 应用ID
memory_config_id: 新的记忆配置ID
Returns:
@@ -1699,8 +1699,8 @@ class AppService:
from app.repositories.end_user_repository import EndUserRepository
repo = EndUserRepository(self.db)
updated_count = repo.batch_update_memory_config_id_by_workspace(
workspace_id=workspace_id,
updated_count = repo.batch_update_memory_config_id_by_app(
app_id=app_id,
memory_config_id=memory_config_id
)
@@ -1879,8 +1879,8 @@ class AppService:
if memory_config_id:
app = self.db.query(App).filter(App.id == app_id).first()
if app:
updated_count = self._update_endusers_memory_config_by_workspace(
app.workspace_id, memory_config_id
updated_count = self._update_endusers_memory_config_by_app(
app_id, memory_config_id
)
logger.info(
f"发布时更新终端用户记忆配置: app_id={app_id}, workspace_id={app.workspace_id}, "
@@ -2016,7 +2016,7 @@ class AppService:
if memory_config_id:
updated_count = self._update_endusers_memory_config_by_workspace(app.workspace_id, memory_config_id)
updated_count = self._update_endusers_memory_config_by_app(app_id, memory_config_id)
logger.info(
f"回滚时更新终端用户记忆配置: app_id={app_id}, version={version}, "
f"memory_config_id={memory_config_id}, updated_count={updated_count}"