diff --git a/Html/apps/_docs/ase_engine_data_sync.md b/Html/apps/_docs/ase_engine_data_sync.md index fe3d9e5..8af31cc 100644 --- a/Html/apps/_docs/ase_engine_data_sync.md +++ b/Html/apps/_docs/ase_engine_data_sync.md @@ -16,7 +16,7 @@ ### 2.2 扩展场景 - **离线数据同步**:支持在网络恢复后进行数据同步 -- **数据备份与恢复**:通过上传/下载机制实现数据备份和恢复 +- **数据备份与恢复**:通过上传/下载机制实现数据备份和恢复。 - **多租户数据隔离**:通过 namespace_token 实现不同租户数据隔离 ## 3. 实现原理 @@ -36,12 +36,13 @@ ### 3.2 数据流向 1. **数据下载流程**: + - 客户端调用 `get_multiagents_dialog_list()` 方法 - 发送 POST 请求到 ASEngine 的 `/api/sync/download` 接口 - 获取用户对话历史数据 - 数据用于本地处理或存储 - 2. **数据上传流程**: + - 客户端调用 `upload_learning_progress_to_cloud()` 方法 - 序列化待上传的数据(处理特殊类型如 datetime) - 发送 POST 请求到 ASEngine 的 `/api/sync/upload` 接口 @@ -55,10 +56,10 @@ def get_multiagents_dialog_list(user_id: str) -> List[Dict]: """ 从 MultiAgents 框架获取用户对话列表 - + 参数: - user_id: 用户ID - + 返回: - Dict[List]: 对话列表(key 为 History database) """ @@ -66,6 +67,7 @@ def get_multiagents_dialog_list(user_id: str) -> List[Dict]: ``` **功能特点**: + - 从配置中动态获取 ASEngine URL 和认证信息 - 支持超时控制(10秒) - 完善的错误处理和日志记录 @@ -77,10 +79,10 @@ def get_multiagents_dialog_list(user_id: str) -> List[Dict]: def upload_learning_progress_to_cloud(progress: Dict) -> Dict: """ 将学习进度上传到云服务 - + 参数: - progress: 学习进度数据字典 - + 返回: - Dict: 上传结果,包含success和message字段 """ @@ -88,6 +90,7 @@ def upload_learning_progress_to_cloud(progress: Dict) -> Dict: ``` **功能特点**: + - 自动处理数据序列化,支持复杂数据类型 - 完善的错误处理机制 - 详细的日志记录,便于问题排查 @@ -212,15 +215,16 @@ if progress["exists"]: ### 7.1 核心模块 -| 模块 | 功能描述 | 文件位置 | -|------|----------|----------| -| 数据同步服务 | 处理与 ASEngine 的数据交互 | `apps/services/course_services/learning_progess_process.py` | -| JSON 序列化工具 | 处理复杂数据类型序列化 | `apps/utils/json_serializer.py` | -| 配置管理 | 管理 ASEngine 连接配置 | `apps/config.py` | +| 模块 | 功能描述 | 文件位置 | +| --------------- | -------------------------- | ------------------------------------------------------------- | +| 数据同步服务 | 处理与 ASEngine 的数据交互 | `apps/services/course_services/learning_progess_process.py` | +| JSON 序列化工具 | 处理复杂数据类型序列化 | `apps/utils/json_serializer.py` | +| 配置管理 | 管理 ASEngine 连接配置 | `apps/config.py` | ### 7.2 扩展建议 1. **添加重试机制**: + ```python def upload_with_retry(progress: Dict, max_retries: int = 3) -> Dict: for i in range(max_retries): @@ -230,8 +234,8 @@ if progress["exists"]: time.sleep(1) # 指数退避算法可进一步优化 return {"success": False, "message": f"上传失败,已重试{max_retries}次"} ``` - 2. **添加数据校验**: + ```python def validate_progress_data(progress: Dict) -> bool: """验证进度数据格式""" @@ -241,12 +245,12 @@ if progress["exists"]: return False return True ``` - 3. **支持异步操作**: + ```python import asyncio import aiohttp - + async def async_upload_learning_progress(progress: Dict) -> Dict: """异步上传学习进度""" # 异步实现 @@ -309,11 +313,11 @@ if progress["exists"]: ## 11. 版本历史 -| 版本 | 日期 | 描述 | 作者 | -|------|------|------|------| -| v1.0 | 2025-12-10 | 初始版本 | 系统自动生成 | -| v1.1 | YYYY-MM-DD | 添加异步支持 | XXX | -| v1.2 | YYYY-MM-DD | 实现增量同步 | XXX | +| 版本 | 日期 | 描述 | 作者 | +| ---- | ---------- | ------------ | ------------ | +| v1.0 | 2025-12-10 | 初始版本 | 系统自动生成 | +| v1.1 | YYYY-MM-DD | 添加异步支持 | XXX | +| v1.2 | YYYY-MM-DD | 实现增量同步 | XXX | ## 12. 参考资料 diff --git a/Html/apps/sockets/namespaces.py b/Html/apps/sockets/namespaces.py index 1c7952f..d347fd2 100644 --- a/Html/apps/sockets/namespaces.py +++ b/Html/apps/sockets/namespaces.py @@ -86,7 +86,6 @@ class AgentNamespace(Namespace): chatmanager.function_manager.add_function(next_chapter, {'user_uuid': user_uuid}) if not chatmanager.restart:# 尝试加载用户学习进度 - self.app.logger.info(f"尝试加载用户学习进度: {user_id}, {course_id}, {chapter_name}, {lesson_name}") progress_result = load_learning_progress(user_id, course_id, chapter_name, lesson_name) need_skip_chapters = 0 @@ -97,7 +96,6 @@ class AgentNamespace(Namespace): # 根据scores的数量确定需要跳过的章节数 need_skip_chapters = len(progress['scores']) chatmanager.scores = progress['scores'] - self.app.logger.info(f"恢复用户学习进度: {user_id}, 已完成 {need_skip_chapters} 个章节") # 恢复聊天历史 if 'chat_historys' in progress: @@ -113,7 +111,6 @@ class AgentNamespace(Namespace): # 使用默认值,确保有完整的结构 chatmanager.chat_historys = progress_result['data']['chat_historys'] chatmanager.scores = progress_result['data']['scores'] - self.app.logger.info(f"未找到学习记录,使用默认值: {progress_result['message']}") fmd,fmdp,fsp = load_full_markdown_file(course_id, chapter_name, lesson_name) user_uuid2ase_client[user_uuid] = HSAEngineClient(current_app.config["ASE_ENGINE_URL"], current_app.config["ASE_ENGINE_NAMESPACE"],id=user_id, chatmanager = chatmanager) @@ -186,10 +183,8 @@ class AgentNamespace(Namespace): def on_language(self, language): ex = current_app.extensions - self.app.logger.info(f"Language changed to: {language}") def on_message(self, data): - self.app.logger.info(f"Message from client: {data}") ex = current_app.extensions chatmanager = ex["user_uuid2chatmanager"] uuid = session.get('user_uuid') @@ -199,14 +194,11 @@ class AgentNamespace(Namespace): if data['type'] == 'text': res = user_uuid2ase_client[uuid].send_text('dialog', data['data']) chatmanager[uuid].chat_historys.append({'role': 'user', 'content': data['data']}) - self.app.logger.info(f"Send text to route 'dialog' success: {res}") if data['type'] == 'function': # 在这里 前端会发送允许执行的function与参数 - self.app.logger.info(f"function_call: {data['data']}") d = data['data'] res = chatmanager[uuid].function_call(d['data']['name'], d['data'].get('args', {})) d['data'] = res.to_dict() - self.app.logger.info(f"function_call_res: {d['data']}") emit(d['route'], d, room=uuid, namespace='/agent') chatmanager[uuid].chat_historys.append({'role': 'user', 'content': data['data']}) user_uuid2ase_client[uuid].send_text(d['route'], data['data']) @@ -217,10 +209,9 @@ class AgentNamespace(Namespace): uuid = session.get('user_uuid') user_uuid2ase_client = ex["user_uuid2ase_client"] res = user_uuid2ase_client[uuid].send_voice('voice_in', voice_data['data']) - self.app.logger.info(f"Send voicce to route 'voice_in' success: {res}") + def on_initiative(self,data): # 主动call - self.app.logger.info("User active function call") ex = current_app.extensions uuid = session.get('user_uuid') manager = ex["user_uuid2chatmanager"][uuid] @@ -248,7 +239,6 @@ class AgentNamespace(Namespace): chatmanager = user_uuid2chatmanager.get(uuid) if chatmanager: save_result = save_learning_progress(chatmanager, user_id) - self.app.logger.info(f"保存学习进度结果: {save_result}") except Exception as e: self.app.logger.error(f"保存学习进度时发生异常: {str(e)}")