From 88ae20d5961a8627236c458f431511d8af7314c7 Mon Sep 17 00:00:00 2001 From: CakeCN Date: Tue, 9 Dec 2025 15:47:17 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=96=87=E4=BB=B6=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Html/apps/services/asectrl_service.py | 73 ++++++++++++++++++ Html/apps/sockets/namespaces.py | 106 ++++++-------------------- 2 files changed, 95 insertions(+), 84 deletions(-) create mode 100644 Html/apps/services/asectrl_service.py diff --git a/Html/apps/services/asectrl_service.py b/Html/apps/services/asectrl_service.py new file mode 100644 index 0000000..bfacae1 --- /dev/null +++ b/Html/apps/services/asectrl_service.py @@ -0,0 +1,73 @@ +import requests +from flask_socketio import Namespace + + +def on_connect_to_ase(client_entry, namespace_entry, init_data): + ''' + 此时刚刚建立好aseclient连接,并向前端发送打开code-server-like指令。 + ''' + print(f"on_connect_to_ase {client_entry}, {namespace_entry}, {init_data}") + namespace_entry, ase_client = namespace_entry + namespace_entry.emit('open-iframe',"", room=init_data['room'], namespace='/agent') + namespace_entry.emit('message', "Agents服务已连接, 加载教案中", room=init_data['room'], namespace='/agent') + + try: + base_url = namespace_entry.app.config['ASE_ENGINE_URL'] + clear_url = f"{base_url}/clear_user_session" + payload = { + 'namespace_url': namespace_entry.app.config['ASE_ENGINE_URL_TOKEN'], # WebSocket命名空间URL + 'user_id': init_data['room'], # 用户ID,对应session_info.id + 'clear_type': 'all' # 清理类型,默认为全部 + } + headers = { + 'Content-Type': 'application/json' + } + response = requests.post(clear_url, json=payload, headers=headers) + response.raise_for_status() # 检查请求是否成功 + print(f"Clear user session successful: {response.json()}") + except Exception as e: + print(f"Error clearing user session: {e}") + ase_client.chatmanager.load_next_chapter() + ase_client.send_text("chapter-start", "") + namespace_entry.emit('message', "教案加载完毕", room=init_data['room'], namespace='/agent') + + +#接受消息回来直接让message监听发送 +def receive_ase_paste_detected(client_entry, namespace_entry, data, init_data): + print("receive_ase_paste_detected", data) + client_entry.chatmanager.chat_historys.append({'role': 'assistant', 'content': data['data']}) + namespace_entry.emit('message', data['data'], room=init_data['room'], namespace='/agent') + +def receive_ase_dialog(client_entry, namespace_entry, data, init_data): + print("receive_ase_dialog", data) + client_entry.chatmanager.chat_historys.append({'role': 'assistant', 'content': data['data']}) + namespace_entry.emit('message', data['data'], room=init_data['room'], namespace='/agent') + +def receive_ase_message_hint(client_entry, namespace_entry, data, init_data): + print("receive_ase_message_hint", data) + namespace_entry.emit('message-hint', data['data'], room=init_data['room'], namespace='/agent') + +#接受语音信息 +def receive_ase_voice_out(client_entry, namespace_entry, data, init_data): + namespace_entry.emit('voiceMessage', data['data'], room=init_data['room'], namespace='/agent') + +def receive_ase_process(client_entry, namespace_entry, data, init_data): + namespace_entry.emit('process', data['data'], room=init_data['room'], namespace='/agent') + +def receive_ase_judge(client_entry, namespace_entry, data, init_data): + print("receive_ase_judge", data) + namespace_entry.emit('request_function', data, room=init_data['room'], namespace='/agent') # data 是一个列表 /dict也支持 + +def receive_ase_next_chapter(client_entry, namespace_entry, data, init_data): + print("receive_ase_next_chapter", data) + namespace_entry.emit('request_function',data, room=init_data['room'], namespace='/agent') # data 是一个列表 /dict也支持 + +def receive_ase_chapter_score(client_entry, user_and_manager, data, init_data): + print("load_next_chapter") + user, chatmanager = user_and_manager + if len(chatmanager.scores) >= chatmanager.chapter_chain_now: + chatmanager.scores[chatmanager.chapter_chain_now - 1] = data.get('data', None) + else: chatmanager.scores.append(data.get('data', None)) + user.set_course_progress(chatmanager.chat_historys, chatmanager.scores, chatmanager.course_id, chatmanager.chapter_name, chatmanager.lesson_name) + chatmanager.load_next_chapter() + chatmanager.ase_client.send_text("chapter-start", "") diff --git a/Html/apps/sockets/namespaces.py b/Html/apps/sockets/namespaces.py index c519a55..92a4d26 100644 --- a/Html/apps/sockets/namespaces.py +++ b/Html/apps/sockets/namespaces.py @@ -14,14 +14,23 @@ from ..services.course_service import save_learning_progress, upload_learning_pr from ..extension_ase.ase_client import HSAEngineClient from ..services.user_service import get_or_load_current_user from ..services.course_service import load_learning_progress +from ..services.asectrl_service import ( + on_connect_to_ase, + receive_ase_paste_detected, + receive_ase_dialog, + receive_ase_message_hint, + receive_ase_voice_out, + receive_ase_process, + receive_ase_judge, + receive_ase_next_chapter, + receive_ase_chapter_score +) class VSCodeNamespace(Namespace): - - - def on_login(self,data): + self.app = current_app ex = current_app.extensions print("VSCode client connected") dataconfig = data['config'] @@ -54,7 +63,7 @@ class VSCodeNamespace(Namespace): class AgentNamespace(Namespace): def on_login(self, data): - self.current_app = current_app + self.app = current_app ex = current_app.extensions uuid2username = ex["uuid2username"] backboard_manager = ex["backboard_manager"] @@ -116,55 +125,55 @@ class AgentNamespace(Namespace): self.chatmanager = chatmanager self.ase_client = user_uuid2ase_client[user_uuid] user_uuid2ase_client[user_uuid].register_on_connect_entry( - callback=self.on_connect_to_ase, + callback=on_connect_to_ase, entry=(self, user_uuid2ase_client[user_uuid]), init_data={'room':user_uuid} ) user_uuid2ase_client[user_uuid].register_route_with_entry( route='dialog', - callback=self.receive_ase_dialog, + callback=receive_ase_dialog, entry=self, init_data={'room': user_uuid} ) user_uuid2ase_client[user_uuid].register_route_with_entry( route='dialog-hint', - callback=self.receive_ase_message_hint, + callback=receive_ase_message_hint, entry=self, init_data={'room': user_uuid} ) user_uuid2ase_client[user_uuid].register_route_with_entry( route='voice_out', - callback=self.receive_ase_voice_out, + callback=receive_ase_voice_out, entry=self, init_data={'room': user_uuid} ) user_uuid2ase_client[user_uuid].register_route_with_entry( route='judge', - callback=self.receive_ase_judge, + callback=receive_ase_judge, entry=self, init_data={'room': user_uuid} ) user_uuid2ase_client[user_uuid].register_route_with_entry( route='next_chapter', - callback=self.receive_ase_next_chapter, + callback=receive_ase_next_chapter, entry=self, init_data={'room': user_uuid} ) user_uuid2ase_client[user_uuid].register_route_with_entry( route='chapter_score', - callback=self.receive_ase_chapter_score, + callback=receive_ase_chapter_score, entry=(get_or_load_current_user(),chatmanager), init_data={'room': user_uuid} ) user_uuid2ase_client[user_uuid].register_route_with_entry( route='process', - callback=self.receive_ase_process, + callback=receive_ase_process, entry=self, init_data={'room': user_uuid} ) user_uuid2ase_client[user_uuid].register_route_with_entry( route='paste_detected', - callback=self.receive_ase_paste_detected, + callback=receive_ase_paste_detected, entry=self, init_data={'room': user_uuid} ) @@ -205,77 +214,6 @@ class AgentNamespace(Namespace): user_uuid2ase_client = ex["user_uuid2ase_client"] res = user_uuid2ase_client[uuid].send_voice('voice_in', voice_data['data']) print(f"Send voicce to route 'voice_in' success: {res}") - - def on_connect_to_ase(client_entry: HSAEngineClient, namespace_entry, init_data): - ''' - 此时刚刚建立好aseclient连接,并向前端发送打开code-server-like指令。 - ''' - print(f"on_connect_to_ase {client_entry}, {namespace_entry}, {init_data}") - namespace_entry, ase_client = namespace_entry - namespace_entry.emit('open-iframe',"", room=init_data['room'], namespace='/agent') - namespace_entry.emit('message', "Agents服务已连接, 加载教案中", room=init_data['room'], namespace='/agent') - - try: - base_url = current_app.config['ASE_ENGINE_URL'] - clear_url = f"{base_url}/clear_user_session" - payload = { - 'namespace_url': current_app.config['ASE_ENGINE_URL_TOKEN'], # WebSocket命名空间URL - 'user_id': init_data['room'], # 用户ID,对应session_info.id - 'clear_type': 'all' # 清理类型,默认为全部 - } - headers = { - 'Content-Type': 'application/json' - } - response = requests.post(clear_url, json=payload, headers=headers) - response.raise_for_status() # 检查请求是否成功 - print(f"Clear user session successful: {response.json()}") - except Exception as e: - print(f"Error clearing user session: {e}") - ase_client.chatmanager.load_next_chapter() - ase_client.send_text("chapter-start", "") - namespace_entry.emit('message', "教案加载完毕", room=init_data['room'], namespace='/agent') - - - #接受消息回来直接让message监听发送 - def receive_ase_paste_detected(client_entry: HSAEngineClient, namespace_entry: Namespace, data, init_data): - print("receive_ase_paste_detected", data) - client_entry.chatmanager.chat_historys.append({'role': 'assistant', 'content': data['data']}) - namespace_entry.emit('message', data['data'], room=init_data['room'], namespace='/agent') - - def receive_ase_dialog(client_entry: HSAEngineClient, namespace_entry: Namespace, data, init_data): - print("receive_ase_dialog", data) - client_entry.chatmanager.chat_historys.append({'role': 'assistant', 'content': data['data']}) - namespace_entry.emit('message', data['data'], room=init_data['room'], namespace='/agent') - - def receive_ase_message_hint(client_entry: HSAEngineClient, namespace_entry: Namespace, data, init_data): - print("receive_ase_message_hint", data) - namespace_entry.emit('message-hint', data['data'], room=init_data['room'], namespace='/agent') - - #接受语音信息 - def receive_ase_voice_out(client_entry: HSAEngineClient, namespace_entry: Namespace, data, init_data): - namespace_entry.emit('voiceMessage', data['data'], room=init_data['room'], namespace='/agent') - - def receive_ase_process(client_entry: HSAEngineClient, namespace_entry: Namespace, data, init_data): - namespace_entry.emit('process', data['data'], room=init_data['room'], namespace='/agent') - - def receive_ase_judge(client_entry: HSAEngineClient, namespace_entry: Namespace, data, init_data): - print("receive_ase_judge", data) - namespace_entry.emit('request_function', data, room=init_data['room'], namespace='/agent') # data 是一个列表 /dict也支持 - - def receive_ase_next_chapter(client_entry: HSAEngineClient, namespace_entry: Namespace, data, init_data): - print("receive_ase_next_chapter", data) - namespace_entry.emit('request_function',data, room=init_data['room'], namespace='/agent') # data 是一个列表 /dict也支持 - - def receive_ase_chapter_score(client_entry: HSAEngineClient, user_and_manager, data, init_data): - print("load_next_chapter") - user, chatmanager = user_and_manager - if len(chatmanager.scores) >= chatmanager.chapter_chain_now: - chatmanager.scores[chatmanager.chapter_chain_now - 1] = data.get('data', None) - else: chatmanager.scores.append(data.get('data', None)) - user.set_course_progress(chatmanager.chat_historys, chatmanager.scores, chatmanager.course_id, chatmanager.chapter_name, chatmanager.lesson_name) - chatmanager.load_next_chapter() - chatmanager.ase_client.send_text("chapter-start", "") - def on_initiative(self,data): # 主动call print("User active function call")