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