From 9dfa0c97382373b12f47b5ddc0a9ea428919c6a1 Mon Sep 17 00:00:00 2001 From: CakeCN Date: Wed, 10 Dec 2025 22:47:39 +0800 Subject: [PATCH 1/8] speed up event wait --- Html/apps/extension_ase/ase_client/client.py | 40 +++++++++++++++++--- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/Html/apps/extension_ase/ase_client/client.py b/Html/apps/extension_ase/ase_client/client.py index bef2f36..2cc6f9e 100644 --- a/Html/apps/extension_ase/ase_client/client.py +++ b/Html/apps/extension_ase/ase_client/client.py @@ -228,7 +228,7 @@ class ASEngineClient: self.sid = None print("Disconnected from server") - def send_text(self, route: str, text: str, id:str="", wait_for_ack: bool = False, timeout: int = 5) -> bool: + def send_text(self, route: str, text: str, id:str="", wait_for_ack: bool = False, timeout: int = 5, return_event: bool = False) -> Any: """ 发送文本消息 :param route: 目标路由 @@ -236,7 +236,8 @@ class ASEngineClient: :param id: 发送者ID :param wait_for_ack: 是否等待服务器ACK确认 :param timeout: 等待ACK的超时时间(秒) - :return: 是否发送成功(若wait_for_ack为True,则返回是否收到ACK) + :param return_event: 是否返回事件对象和ack_id而不是等待ACK + :return: 如果wait_for_ack为True且return_event为False,返回是否收到ACK;如果return_event为True,返回(event, ack_id);否则返回是否发送成功 """ if not self.connected: print("Not connected to server") @@ -268,6 +269,10 @@ class ASEngineClient: event = Event() self.ack_events[ack_id] = event + # 如果需要返回事件对象,直接返回 + if return_event: + return event, ack_id + # 等待ACK或超时 received_ack = event.wait(timeout=timeout) @@ -428,6 +433,31 @@ class HSAEngineClient(ASEngineClient): super().__init__(server_url, namespace, id) self.chatmanager = chatmanager def loadmarkdown(self, fmd, fmdp, fsp): - self.send_text('markdown-in', fmd, self.id, wait_for_ack=True) - self.send_text('markdown-prompt-in', fmdp, self.id, wait_for_ack=True) - self.send_text('score-prompt-in', fsp, self.id, wait_for_ack=True) + # 并行发送三个消息,获取事件对象和ack_id + event1, ack_id1 = self.send_text('markdown-in', fmd, self.id, wait_for_ack=True, return_event=True) + event2, ack_id2 = self.send_text('markdown-prompt-in', fmdp, self.id, wait_for_ack=True, return_event=True) + event3, ack_id3 = self.send_text('score-prompt-in', fsp, self.id, wait_for_ack=True, return_event=True) + + # 等待所有事件完成 + timeout = 5 # 超时时间 + success1 = event1.wait(timeout=timeout) + success2 = event2.wait(timeout=timeout) + success3 = event3.wait(timeout=timeout) + + # 清理ACK事件 + if ack_id1 in self.ack_events: + del self.ack_events[ack_id1] + if ack_id2 in self.ack_events: + del self.ack_events[ack_id2] + if ack_id3 in self.ack_events: + del self.ack_events[ack_id3] + + # 检查是否所有ACK都成功收到 + if not success1: + print(f"ACK timeout for message: {ack_id1}") + if not success2: + print(f"ACK timeout for message: {ack_id2}") + if not success3: + print(f"ACK timeout for message: {ack_id3}") + + return success1 and success2 and success3 From 1bf13aacf6d97771d34cf31bd0e1724377aaf1c2 Mon Sep 17 00:00:00 2001 From: CakeCN Date: Thu, 11 Dec 2025 14:04:58 +0800 Subject: [PATCH 2/8] little change --- Html/apps/services/asectrl_service.py | 1 - profile_stats | Bin 0 -> 1264 bytes profile_stats_extract | Bin 0 -> 1223 bytes 3 files changed, 1 deletion(-) create mode 100644 profile_stats create mode 100644 profile_stats_extract diff --git a/Html/apps/services/asectrl_service.py b/Html/apps/services/asectrl_service.py index 15027c6..ad37c74 100644 --- a/Html/apps/services/asectrl_service.py +++ b/Html/apps/services/asectrl_service.py @@ -24,7 +24,6 @@ def on_connect_to_ase(client, entry, init_data, **kwargs): } 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() diff --git a/profile_stats b/profile_stats new file mode 100644 index 0000000000000000000000000000000000000000..0ec44af6c59f63ed3216c0fc9f37185f46d34eff GIT binary patch literal 1264 zcmaJ=O=uHA7)_gO8%-54B2ct*hC3+F65sdR~%%rhdLm1xd_vXFXZ{PPT8Eo{O zcLUSj5>$oS z{`66XDNF0x6xKD8K5XliGPXEN8-!ymU1D0=!L(@8vS#U6<(To5bJiUeinZ_qHg#a;5i$mDCGhy61=K@x4M%Ev zvkCDOn$SmYF%}xx>>&G&jOMwE%1ZDz5_4J$XGN@uWgw3uwq?6eF)%*$uDbkmeSUW3`2}ROK{b>416II{8vp3kf(H*O;z=ZU@gOuP1uasD9(=QHVm84-b9lTV-+c4E_r15jWBx|Z zrMeG(js59tks9I%wIU`K({?W6o~gy-xQz8oEKu(O9P5QZ&VT*&=*7$B3<EQ3{LKA-lO#Lve=^E}QfQWrfs*z|eLgpk(|a$!xrkCqE2%#5HnX(phY^+6lzix6skYiu4VO=#;5NNF71 zNVTHkU=9V>pSh2yD#1ckJuRL8^5e{hg>wp7y6KB8%uFd&wi&=4Azc_LjasVKr;mdVzaneOtNy zaUeRWkUcjh=O^CYRjM(6EtuwlQHx~U0fVDy=ZXf*NV|buH>H6gc+|bbcFW=dtGPR- zbGL>*-F`i;kjL*opLn$bW7;iA= Date: Thu, 11 Dec 2025 15:02:33 +0800 Subject: [PATCH 3/8] logger time --- Html/apps/extension_ase/ase_client/client.py | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/Html/apps/extension_ase/ase_client/client.py b/Html/apps/extension_ase/ase_client/client.py index 2cc6f9e..1e23ba7 100644 --- a/Html/apps/extension_ase/ase_client/client.py +++ b/Html/apps/extension_ase/ase_client/client.py @@ -433,17 +433,20 @@ class HSAEngineClient(ASEngineClient): super().__init__(server_url, namespace, id) self.chatmanager = chatmanager def loadmarkdown(self, fmd, fmdp, fsp): + now = time.time() # 并行发送三个消息,获取事件对象和ack_id event1, ack_id1 = self.send_text('markdown-in', fmd, self.id, wait_for_ack=True, return_event=True) event2, ack_id2 = self.send_text('markdown-prompt-in', fmdp, self.id, wait_for_ack=True, return_event=True) event3, ack_id3 = self.send_text('score-prompt-in', fsp, self.id, wait_for_ack=True, return_event=True) - + self.chatmanager.app.logger.info(f"Load markdown time cost: {time.time() - now}") + now = time.time() # 等待所有事件完成 timeout = 5 # 超时时间 success1 = event1.wait(timeout=timeout) success2 = event2.wait(timeout=timeout) success3 = event3.wait(timeout=timeout) - + self.chatmanager.app.logger.info(f"Wait markdown time cost: {time.time() - now}") + now = time.time() # 清理ACK事件 if ack_id1 in self.ack_events: del self.ack_events[ack_id1] @@ -451,13 +454,4 @@ class HSAEngineClient(ASEngineClient): del self.ack_events[ack_id2] if ack_id3 in self.ack_events: del self.ack_events[ack_id3] - - # 检查是否所有ACK都成功收到 - if not success1: - print(f"ACK timeout for message: {ack_id1}") - if not success2: - print(f"ACK timeout for message: {ack_id2}") - if not success3: - print(f"ACK timeout for message: {ack_id3}") - return success1 and success2 and success3 From 99758ce1f851ed7aebbfacb9cfe8543c52086090 Mon Sep 17 00:00:00 2001 From: CakeCN Date: Thu, 11 Dec 2025 15:10:02 +0800 Subject: [PATCH 4/8] add app context log --- Html/apps/extension_ase/ase_client/client.py | 45 ++++++++++---------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/Html/apps/extension_ase/ase_client/client.py b/Html/apps/extension_ase/ase_client/client.py index 1e23ba7..967c885 100644 --- a/Html/apps/extension_ase/ase_client/client.py +++ b/Html/apps/extension_ase/ase_client/client.py @@ -433,25 +433,26 @@ class HSAEngineClient(ASEngineClient): super().__init__(server_url, namespace, id) self.chatmanager = chatmanager def loadmarkdown(self, fmd, fmdp, fsp): - now = time.time() - # 并行发送三个消息,获取事件对象和ack_id - event1, ack_id1 = self.send_text('markdown-in', fmd, self.id, wait_for_ack=True, return_event=True) - event2, ack_id2 = self.send_text('markdown-prompt-in', fmdp, self.id, wait_for_ack=True, return_event=True) - event3, ack_id3 = self.send_text('score-prompt-in', fsp, self.id, wait_for_ack=True, return_event=True) - self.chatmanager.app.logger.info(f"Load markdown time cost: {time.time() - now}") - now = time.time() - # 等待所有事件完成 - timeout = 5 # 超时时间 - success1 = event1.wait(timeout=timeout) - success2 = event2.wait(timeout=timeout) - success3 = event3.wait(timeout=timeout) - self.chatmanager.app.logger.info(f"Wait markdown time cost: {time.time() - now}") - now = time.time() - # 清理ACK事件 - if ack_id1 in self.ack_events: - del self.ack_events[ack_id1] - if ack_id2 in self.ack_events: - del self.ack_events[ack_id2] - if ack_id3 in self.ack_events: - del self.ack_events[ack_id3] - return success1 and success2 and success3 + with self.chatmanager.app.app_context(): + now = time.time() + # 并行发送三个消息,获取事件对象和ack_id + event1, ack_id1 = self.send_text('markdown-in', fmd, self.id, wait_for_ack=True, return_event=True) + event2, ack_id2 = self.send_text('markdown-prompt-in', fmdp, self.id, wait_for_ack=True, return_event=True) + event3, ack_id3 = self.send_text('score-prompt-in', fsp, self.id, wait_for_ack=True, return_event=True) + self.chatmanager.app.logger.info(f"Load markdown time cost: {time.time() - now}") + now = time.time() + # 等待所有事件完成 + timeout = 5 # 超时时间 + success1 = event1.wait(timeout=timeout) + success2 = event2.wait(timeout=timeout) + success3 = event3.wait(timeout=timeout) + self.chatmanager.app.logger.info(f"Wait markdown time cost: {time.time() - now}") + now = time.time() + # 清理ACK事件 + if ack_id1 in self.ack_events: + del self.ack_events[ack_id1] + if ack_id2 in self.ack_events: + del self.ack_events[ack_id2] + if ack_id3 in self.ack_events: + del self.ack_events[ack_id3] + return success1 and success2 and success3 From 5df2931fa19fe890ce6c2b11e5b8d7f7a9080920 Mon Sep 17 00:00:00 2001 From: CakeCN Date: Thu, 11 Dec 2025 15:23:50 +0800 Subject: [PATCH 5/8] fix logger --- Html/apps/extension_ase/ase_client/client.py | 57 ++++++++++++-------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/Html/apps/extension_ase/ase_client/client.py b/Html/apps/extension_ase/ase_client/client.py index 967c885..a8eed33 100644 --- a/Html/apps/extension_ase/ase_client/client.py +++ b/Html/apps/extension_ase/ase_client/client.py @@ -433,26 +433,37 @@ class HSAEngineClient(ASEngineClient): super().__init__(server_url, namespace, id) self.chatmanager = chatmanager def loadmarkdown(self, fmd, fmdp, fsp): - with self.chatmanager.app.app_context(): - now = time.time() - # 并行发送三个消息,获取事件对象和ack_id - event1, ack_id1 = self.send_text('markdown-in', fmd, self.id, wait_for_ack=True, return_event=True) - event2, ack_id2 = self.send_text('markdown-prompt-in', fmdp, self.id, wait_for_ack=True, return_event=True) - event3, ack_id3 = self.send_text('score-prompt-in', fsp, self.id, wait_for_ack=True, return_event=True) - self.chatmanager.app.logger.info(f"Load markdown time cost: {time.time() - now}") - now = time.time() - # 等待所有事件完成 - timeout = 5 # 超时时间 - success1 = event1.wait(timeout=timeout) - success2 = event2.wait(timeout=timeout) - success3 = event3.wait(timeout=timeout) - self.chatmanager.app.logger.info(f"Wait markdown time cost: {time.time() - now}") - now = time.time() - # 清理ACK事件 - if ack_id1 in self.ack_events: - del self.ack_events[ack_id1] - if ack_id2 in self.ack_events: - del self.ack_events[ack_id2] - if ack_id3 in self.ack_events: - del self.ack_events[ack_id3] - return success1 and success2 and success3 + # 保存app实例以便在回调中使用 + app = self.chatmanager.app + + def log_info(message): + """安全的日志记录函数,确保在任何线程中都能使用""" + try: + with app.app_context(): + app.logger.info(message) + except Exception as e: + print(f"Log error: {e}") + print(f"Message: {message}") + + now = time.time() + # 并行发送三个消息,获取事件对象和ack_id + event1, ack_id1 = self.send_text('markdown-in', fmd, self.id, wait_for_ack=True, return_event=True) + event2, ack_id2 = self.send_text('markdown-prompt-in', fmdp, self.id, wait_for_ack=True, return_event=True) + event3, ack_id3 = self.send_text('score-prompt-in', fsp, self.id, wait_for_ack=True, return_event=True) + log_info(f"Load markdown time cost: {time.time() - now}") + now = time.time() + # 等待所有事件完成 + timeout = 5 # 超时时间 + success1 = event1.wait(timeout=timeout) + success2 = event2.wait(timeout=timeout) + success3 = event3.wait(timeout=timeout) + log_info(f"Wait markdown time cost: {time.time() - now}") + now = time.time() + # 清理ACK事件 + if ack_id1 in self.ack_events: + del self.ack_events[ack_id1] + if ack_id2 in self.ack_events: + del self.ack_events[ack_id2] + if ack_id3 in self.ack_events: + del self.ack_events[ack_id3] + return success1 and success2 and success3 From 84a4a578a8b003db50188d53393c104df5a93be7 Mon Sep 17 00:00:00 2001 From: CakeCN Date: Thu, 11 Dec 2025 15:32:41 +0800 Subject: [PATCH 6/8] add some logger --- Html/apps/extension_ase/ase_client/client.py | 15 ++------------- Html/apps/extension_ase/ase_client/manager.py | 4 ++-- Html/apps/services/asectrl_service.py | 4 ++-- 3 files changed, 6 insertions(+), 17 deletions(-) diff --git a/Html/apps/extension_ase/ase_client/client.py b/Html/apps/extension_ase/ase_client/client.py index a8eed33..f6a83b8 100644 --- a/Html/apps/extension_ase/ase_client/client.py +++ b/Html/apps/extension_ase/ase_client/client.py @@ -433,31 +433,20 @@ class HSAEngineClient(ASEngineClient): super().__init__(server_url, namespace, id) self.chatmanager = chatmanager def loadmarkdown(self, fmd, fmdp, fsp): - # 保存app实例以便在回调中使用 - app = self.chatmanager.app - - def log_info(message): - """安全的日志记录函数,确保在任何线程中都能使用""" - try: - with app.app_context(): - app.logger.info(message) - except Exception as e: - print(f"Log error: {e}") - print(f"Message: {message}") now = time.time() # 并行发送三个消息,获取事件对象和ack_id event1, ack_id1 = self.send_text('markdown-in', fmd, self.id, wait_for_ack=True, return_event=True) event2, ack_id2 = self.send_text('markdown-prompt-in', fmdp, self.id, wait_for_ack=True, return_event=True) event3, ack_id3 = self.send_text('score-prompt-in', fsp, self.id, wait_for_ack=True, return_event=True) - log_info(f"Load markdown time cost: {time.time() - now}") + print(f"Load markdown time cost: {time.time() - now}") now = time.time() # 等待所有事件完成 timeout = 5 # 超时时间 success1 = event1.wait(timeout=timeout) success2 = event2.wait(timeout=timeout) success3 = event3.wait(timeout=timeout) - log_info(f"Wait markdown time cost: {time.time() - now}") + print(f"Wait markdown time cost: {time.time() - now}") now = time.time() # 清理ACK事件 if ack_id1 in self.ack_events: diff --git a/Html/apps/extension_ase/ase_client/manager.py b/Html/apps/extension_ase/ase_client/manager.py index 766cd62..583b642 100644 --- a/Html/apps/extension_ase/ase_client/manager.py +++ b/Html/apps/extension_ase/ase_client/manager.py @@ -129,8 +129,8 @@ class ChatManager: self.chapter_chain_now = chapter_index self.chapter_chain[chapter_index].Focus() - def load_next_chapter(self): - print(f"now load next chapter markdown {self.chapter_chain_now}") + def load_now_chapter(self): + print(f"now load now chapter markdown {self.chapter_chain_now}") self.ase_client.loadmarkdown(self.chapter_chain[self.chapter_chain_now].chapter, self.chapter_chain[self.chapter_chain_now].chapter_prompt, self.chapter_chain[self.chapter_chain_now].score_prompt) self.load_code_in_markdown() diff --git a/Html/apps/services/asectrl_service.py b/Html/apps/services/asectrl_service.py index ad37c74..258ec6a 100644 --- a/Html/apps/services/asectrl_service.py +++ b/Html/apps/services/asectrl_service.py @@ -26,7 +26,7 @@ def on_connect_to_ase(client, entry, init_data, **kwargs): response.raise_for_status() # 检查请求是否成功 except Exception as e: print(f"Error clearing user session: {e}") - ase_client.chatmanager.load_next_chapter() + ase_client.chatmanager.load_now_chapter() ase_client.send_text("chapter-start", "") namespace_entry.emit('message', "教案加载完毕", room=init_data['room'], namespace='/agent') @@ -68,5 +68,5 @@ def receive_ase_chapter_score(client_entry, user_and_manager, data, init_data): 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.load_now_chapter() chatmanager.ase_client.send_text("chapter-start", "") From 7aa7bf1690e0a4f19d10ff252de1a3c7cbf82738 Mon Sep 17 00:00:00 2001 From: CakeCN Date: Thu, 11 Dec 2025 15:42:45 +0800 Subject: [PATCH 7/8] log receive ack --- Html/apps/extension_ase/ase_client/client.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Html/apps/extension_ase/ase_client/client.py b/Html/apps/extension_ase/ase_client/client.py index f6a83b8..3d36eb4 100644 --- a/Html/apps/extension_ase/ase_client/client.py +++ b/Html/apps/extension_ase/ase_client/client.py @@ -72,6 +72,7 @@ class ASEngineClient: # ACK事件处理 @self.sio.on('ack', namespace=self.namespace) def on_ack(data): + print(f"Received ACK: {data}") ack_id = data.get('ack_id') if ack_id and ack_id in self.ack_events: print(f"Received ACK for message: {ack_id}") From 7300b304e36d81caff19b65698f6324fb996a9bf Mon Sep 17 00:00:00 2001 From: CakeCN Date: Thu, 11 Dec 2025 16:19:59 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Html/apps/extension_ase/ase_client/client.py | 22 -------------------- 1 file changed, 22 deletions(-) diff --git a/Html/apps/extension_ase/ase_client/client.py b/Html/apps/extension_ase/ase_client/client.py index 3d36eb4..35e43c7 100644 --- a/Html/apps/extension_ase/ase_client/client.py +++ b/Html/apps/extension_ase/ase_client/client.py @@ -32,8 +32,6 @@ class ASEngineClient: # ACK相关 self.ack_events: Dict[str, Event] = {} # 存储ack_id和对应的Event对象 - - # 注册基础事件处理函数 self._register_base_events() def _register_base_events(self): @@ -249,20 +247,13 @@ class ASEngineClient: try: # 生成唯一ack_id ack_id = f"{id}_{datetime.now().strftime('%Y%m%d%H%M%S%f')}" - - # 准备发送数据 data = { 'type': 'text', 'data': text, 'id': id, 'ack_id': ack_id } - - # 发送数据 self.sio.emit(route, data, namespace=self.namespace) - print(f"Sent text to route '{route}': {text[:20]}") - - # 如果不需要等待ACK,直接返回True if not wait_for_ack: return True @@ -322,9 +313,6 @@ class ASEngineClient: }, namespace=self.namespace ) - - print(f"Sent voice file to route '{route}'") - # 如果不需要等待ACK,直接返回True if not wait_for_ack: return True @@ -390,7 +378,6 @@ class ASEngineClient: }, namespace=self.namespace ) - print(f"Sent image file to route '{route}': {filename}") # 如果不需要等待ACK,直接返回True if not wait_for_ack: @@ -434,22 +421,13 @@ class HSAEngineClient(ASEngineClient): super().__init__(server_url, namespace, id) self.chatmanager = chatmanager def loadmarkdown(self, fmd, fmdp, fsp): - - now = time.time() - # 并行发送三个消息,获取事件对象和ack_id event1, ack_id1 = self.send_text('markdown-in', fmd, self.id, wait_for_ack=True, return_event=True) event2, ack_id2 = self.send_text('markdown-prompt-in', fmdp, self.id, wait_for_ack=True, return_event=True) event3, ack_id3 = self.send_text('score-prompt-in', fsp, self.id, wait_for_ack=True, return_event=True) - print(f"Load markdown time cost: {time.time() - now}") - now = time.time() - # 等待所有事件完成 timeout = 5 # 超时时间 success1 = event1.wait(timeout=timeout) success2 = event2.wait(timeout=timeout) success3 = event3.wait(timeout=timeout) - print(f"Wait markdown time cost: {time.time() - now}") - now = time.time() - # 清理ACK事件 if ack_id1 in self.ack_events: del self.ack_events[ack_id1] if ack_id2 in self.ack_events: