From 1f6e75f0060e51d945131417b178d74d62337483 Mon Sep 17 00:00:00 2001 From: CakeCN Date: Sun, 14 Dec 2025 14:07:27 +0800 Subject: [PATCH] =?UTF-8?q?history=20=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Html/apps/extension_ase/ase_client/manager.py | 3 + Html/apps/services/asectrl_service.py | 9 ++- Html/apps/sockets/namespaces.py | 79 +++++++++++-------- Html/apps/views/vscode.py | 17 +++- 4 files changed, 70 insertions(+), 38 deletions(-) diff --git a/Html/apps/extension_ase/ase_client/manager.py b/Html/apps/extension_ase/ase_client/manager.py index 5d2cf7b..84630a6 100644 --- a/Html/apps/extension_ase/ase_client/manager.py +++ b/Html/apps/extension_ase/ase_client/manager.py @@ -70,6 +70,9 @@ class ChatManager: self.chapter_chain = load_chapters(raw_markdown, raw_markdown_prompts, raw_score_prompts) self.bb = None self.chat_historys = [] + self.chapter_chain_now = -1 + self.scores = [] + def send_to_vscode(self, event: str, data: dict, room: str = None, namespace: str = '/vscode'): diff --git a/Html/apps/services/asectrl_service.py b/Html/apps/services/asectrl_service.py index 42d249b..a9fca88 100644 --- a/Html/apps/services/asectrl_service.py +++ b/Html/apps/services/asectrl_service.py @@ -33,10 +33,15 @@ def on_connect_to_ase(client, entry, init_data, **kwargs): namespace_entry.emit('message', "Agents服务已连接, 加载教案中", room=init_data['room'], namespace='/agent') restart = init_data.get("restart", False) - if restart: # 重启时,从-1章进入 0章 - ase_client.chatmanager.next_chapter() + # 不再需要手动next_chapter,因为已经在on_login中根据mongo进度恢复了正确的章节 + # if restart: # 重启时,从-1章进入 0章 + # ase_client.chatmanager.next_chapter() + + # 根据restart决定是否重新加载代码 ase_client.chatmanager.load_now_chapter(load_code=restart) print("load_now_chapter with restart:", restart) + + # 只有当需要restart时才发送chapter-start if restart: ase_client.send_text("chapter-start", "") namespace_entry.emit('message', "教案加载完毕", room=init_data['room'], namespace='/agent') diff --git a/Html/apps/sockets/namespaces.py b/Html/apps/sockets/namespaces.py index 28fac0b..534ab81 100644 --- a/Html/apps/sockets/namespaces.py +++ b/Html/apps/sockets/namespaces.py @@ -72,38 +72,41 @@ class AgentNamespace(Namespace): course_id: 课程ID chapter_name: 章节名称 lesson_name: 课时名称 - continue_learn: 是否继续学习 + continue_learn: 是否继续学习(现在总是为True,保持兼容性) Returns: int: 需要跳过的章节数 """ need_skip_chapters = 0 - if continue_learn: # 尝试加载用户学习进度 - progress_result = load_learning_progress(user_id, course_id, chapter_name, lesson_name) + # 总是从mongo加载学习进度 + progress_result = load_learning_progress(user_id, course_id, chapter_name, lesson_name) + + if progress_result['exists']: + progress = progress_result['data'] + # 恢复学习进度数据 + if 'scores' in progress: + chatmanager.scores = progress['scores'] - if progress_result['exists']: - progress = progress_result['data'] - # 恢复学习进度数据 - if 'scores' in progress: - # 根据scores的数量确定需要跳过的章节数 - need_skip_chapters = len(progress['scores']) - chatmanager.scores = progress['scores'] - - # 恢复聊天历史 - if 'chat_historys' in progress: - chatmanager.chat_historys = progress['chat_historys'] - else: - chatmanager.chat_historys = [] - - # 恢复当前章节链 - if 'chapter_chain_now' in progress: - chatmanager.chapter_chain_now = progress['chapter_chain_now'] - upload_learning_progress_to_cloud(progress) + # 恢复聊天历史 + if 'chat_historys' in progress: + chatmanager.chat_historys = progress['chat_historys'] else: - # 使用默认值,确保有完整的结构 - chatmanager.chat_historys = progress_result['data']['chat_historys'] - chatmanager.scores = progress_result['data']['scores'] + chatmanager.chat_historys = [] + + # 恢复当前章节链 + if 'chapter_chain_now' in progress: + chatmanager.chapter_chain_now = progress['chapter_chain_now'] + upload_learning_progress_to_cloud(progress) + + # 计算需要跳过的章节数:从初始的-1到当前的chapter_chain_now + need_skip_chapters = chatmanager.chapter_chain_now + 1 + else: + # 使用默认值,确保有完整的结构 + chatmanager.chat_historys = progress_result['data']['chat_historys'] + chatmanager.scores = progress_result['data']['scores'] + chatmanager.chapter_chain_now = -1 + need_skip_chapters = 0 return need_skip_chapters @@ -131,8 +134,9 @@ class AgentNamespace(Namespace): chatmanager.function_manager.add_function(next_chapter, {'user_uuid': user_uuid}) clear_user_session(current_app.config["ASE_ENGINE_URL"], current_app.config["ASE_ENGINE_URL_TOKEN"], user_id) - continue_learn = not chatmanager.restart - need_skip_chapters = self._load_learning_progress(chatmanager, user_id, course_id, chapter_name, lesson_name, continue_learn) + + # 总是从mongo加载进度,不管restart状态 + need_skip_chapters = self._load_learning_progress(chatmanager, user_id, course_id, chapter_name, lesson_name, True) 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) @@ -141,21 +145,26 @@ class AgentNamespace(Namespace): backboard_manager.add_backboard(user_uuid, user_id, course_id, lesson_name, root_path=f'/home/{user_id}/{course_id}/{chapter_name}/{lesson_name}') chatmanager.bb = backboard_manager.get_backboard(user_uuid) - # 如果有保存的进度,需要跳过已经完成的章节、无需清空代码、对话历史恢复 - if continue_learn: - for _ in range(need_skip_chapters): - chatmanager.next_chapter() - emit('next_chapter', room=user_uuid, namespace='/agent') - # 恢复对话历史到前端 - 使用批量发送消息列表 - if chatmanager.chat_historys: - emit('messages', chatmanager.chat_historys, room=user_uuid, namespace='/agent') + + # 总是根据进度跳过章节,恢复对话历史 + for _ in range(need_skip_chapters): + chatmanager.next_chapter() + emit('next_chapter', room=user_uuid, namespace='/agent') + # 恢复对话历史到前端 - 使用批量发送消息列表 + if chatmanager.chat_historys: + emit('messages', chatmanager.chat_historys, room=user_uuid, namespace='/agent') self.chatmanager = chatmanager self.ase_client = user_uuid2ase_client[user_uuid] + + # 将restart设置为False,避免后续重复处理 + restart = chatmanager.restart + chatmanager.restart = False + user_uuid2ase_client[user_uuid].register_on_connect_entry( callback=on_connect_to_ase, entry=(self, user_uuid2ase_client[user_uuid]), - init_data={'room':user_uuid, 'restart':chatmanager.restart} + init_data={'room':user_uuid, 'restart':restart} ) user_uuid2ase_client[user_uuid].register_route_with_entry( route='dialog', diff --git a/Html/apps/views/vscode.py b/Html/apps/views/vscode.py index 4505067..71226f3 100644 --- a/Html/apps/views/vscode.py +++ b/Html/apps/views/vscode.py @@ -69,8 +69,23 @@ def desktop(user_uuid, course_id, chapter_name, lesson_name): - chatmanager = ChatManager(restart=not load_history) + restart = not load_history + chatmanager = ChatManager(restart=restart) current_app.extensions["user_uuid2chatmanager"][user_uuid] = chatmanager + + # 如果restart为True,删除mongo中的学习进度 + if restart: + try: + mongo = current_app.extensions["mongo"] + mongo.db.learning_progress.delete_one({ + "user_id": user_id, + "material_id": course_id, + "chapter_name": chapter_name, + "lesson_name": lesson_name + }) + current_app.logger.info(f"删除学习进度成功: user_id={user_id}, course_id={course_id}, chapter={chapter_name}, lesson={lesson_name}") + except Exception as e: + current_app.logger.error(f"删除学习进度失败: {str(e)}") code_server_port = 10000 + int(uuid.uuid4().int % 10000) # chatmanager.start_code_server(user_uuid, user_id, path_dir, code_server_port)