From 979112966efdae699690b22222f975d3343a3b07 Mon Sep 17 00:00:00 2001 From: chengma Date: Wed, 8 Jul 2026 00:41:44 +0800 Subject: [PATCH] feat: log cmhub download diagnostics in GenerateWorker MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GUI 半边配合 ai.py 的 cmhub 下载诊断:格式化「图片下载较慢」warning、 `cover_image_url` 调试行(脱敏 token、debug_only 不写入 SQLite run_log); `_log_run_event` 增加 persist 开关。tests/test_gui.py 覆盖脱敏与不持久化。 Co-Authored-By: Claude Opus 4.8 --- app/gui/workers.py | 24 +++++++++++++++++++++--- tests/test_gui.py | 25 +++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/app/gui/workers.py b/app/gui/workers.py index 674385d..8ef6f9c 100644 --- a/app/gui/workers.py +++ b/app/gui/workers.py @@ -159,7 +159,12 @@ class GenerateWorker(BaseWorker): message = self._format_generation_event(payload) if not message: return - self._log_run_event(message, task=task, level=payload.get("level") or "info") + self._log_run_event( + message, + task=task, + level=payload.get("level") or "info", + persist=not bool(payload.get("debug_only")), + ) def _remember_cmhub_metadata(self, payload): metadata = payload.get("metadata") @@ -195,10 +200,15 @@ class GenerateWorker(BaseWorker): return f"[停止] {self._task_plain_label(task)} 标题生成已取消" return None if phase == "cover": + if result == "debug" and step == "cover_image_url": + debug_detail = self._debug_detail(payload.get("detail")) + return f"[调试] {self._task_progress_label(task)} {debug_detail}" if result == "start" and step == "cover_submit": return f"[图片] {self._task_progress_label(task)} 开始生成" if result == "success" and step == "cover_request": return f"[图片] {self._task_progress_label(task)} {detail or 'cmhub 已返回,耗时未知'}" + if result == "warning" and step == "cover_download": + return f"[图片] {self._task_progress_label(task)} {detail or '图片下载较慢'}" if result == "success" and step == "cover_download": return f"[图片] {self._task_progress_label(task)} {detail or '图片下载完成,耗时未知'}" if result == "success" and step == "cover_save": @@ -267,6 +277,14 @@ class GenerateWorker(BaseWorker): return text[:177] + "..." return text + def _debug_detail(self, detail): + if detail is None: + return "" + text = diagnostics.redact_log_text(str(detail)).replace("\r", " ").replace("\n", " ").strip() + if len(text) > 2000: + return text[:1997] + "..." + return text + def _format_generate_completion(self, summary): progress = self._summary_text(summary) billing_error = summary.get("billing_error") or {} @@ -382,10 +400,10 @@ class GenerateWorker(BaseWorker): except Exception: return - def _log_run_event(self, message, task=None, level="info"): + def _log_run_event(self, message, task=None, level="info", persist=True): safe_message = diagnostics.redact_log_text(message) self.log.emit(str(safe_message)) - if self._run_id is None: + if self._run_id is None or not persist: return try: db.add_run_log_event( diff --git a/tests/test_gui.py b/tests/test_gui.py index 60d0a83..892a807 100644 --- a/tests/test_gui.py +++ b/tests/test_gui.py @@ -2008,6 +2008,27 @@ class GuiTests(TempDirMixin, unittest.TestCase): "detail": "下载完成,1.3MB,耗时 12.4秒", } ) + ai_cfg["on_event"]( + { + "task": tasks[0], + "phase": "cover", + "step": "cover_download", + "result": "warning", + "detail": "图片下载较慢,已用 24.0秒,大小 1.3MB", + "level": "warning", + } + ) + ai_cfg["on_event"]( + { + "task": tasks[0], + "phase": "cover", + "step": "cover_image_url", + "result": "debug", + "detail": "cmhub 图片 URL:https://cdn.example.com/generated.png?token=SECRET-TOKEN", + "level": "warning", + "debug_only": True, + } + ) ai_cfg["on_event"]( { "task": tasks[0], @@ -2046,6 +2067,8 @@ class GuiTests(TempDirMixin, unittest.TestCase): self.assertIn("准备重试 1/2", joined_logs) self.assertIn("cmhub 已返回 image_url,耗时 91.2秒", joined_logs) self.assertIn("下载完成,1.3MB,耗时 12.4秒", joined_logs) + self.assertIn("图片下载较慢,已用 24.0秒,大小 1.3MB", joined_logs) + self.assertIn("cmhub 图片 URL:https://cdn.example.com/generated.png?token=***", joined_logs) self.assertIn("本地保存完成,JPEG 已保存,耗时 1.1秒,文件 220.0KB", joined_logs) self.assertIn("token=***", joined_logs) self.assertNotIn("SECRET-TOKEN", joined_logs) @@ -2055,6 +2078,8 @@ class GuiTests(TempDirMixin, unittest.TestCase): self.assertIn("[图片] 1/1 商品 51100639510", event_messages) self.assertIn("准备重试 1/2", event_messages) self.assertIn("下载完成,1.3MB,耗时 12.4秒", event_messages) + self.assertIn("图片下载较慢,已用 24.0秒,大小 1.3MB", event_messages) + self.assertNotIn("cmhub 图片 URL", event_messages) self.assert_removed(temp_dir)