From 2cd97a73b769784575edae88a3dcabeba1cccdb2 Mon Sep 17 00:00:00 2001 From: SXP-Simon Date: Tue, 10 Feb 2026 23:16:07 +0800 Subject: [PATCH] =?UTF-8?q?fix(debug):=20=E5=A2=9E=E5=8A=A0=E6=AF=8F?= =?UTF-8?q?=E6=AC=A1=E5=A2=9E=E9=87=8F=E5=88=86=E6=9E=90=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E5=90=8E=E5=8F=91=E9=80=81=E7=9A=84=E9=85=8D=E7=BD=AE=EF=BC=8C?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _conf_schema.json | 6 +++ main.py | 14 +++++- src/infrastructure/config/config_manager.py | 31 ++++++++++--- .../scheduler/auto_scheduler.py | 44 ++++++++++--------- 4 files changed, 69 insertions(+), 26 deletions(-) diff --git a/_conf_schema.json b/_conf_schema.json index 749bc71..1fc5e43 100644 --- a/_conf_schema.json +++ b/_conf_schema.json @@ -226,6 +226,12 @@ "default": false, "hint": "启用后,插件会在一天内多次进行小规模分析并累积结果,最终在报告时间汇总输出。适用于消息量大的群聊,可显著提升分析覆盖率和24小时活跃图表准确性。关闭时保持传统的单次全量分析模式。" }, + "incremental_report_immediately": { + "type": "bool", + "description": "增量分析立即报告(调试用)", + "default": false, + "hint": "【调试功能】启用后,每次增量分析完成后都会立即生成并发送一份最终报告。仅建议在调试时开启,生产环境请保持关闭,否则会频繁打扰群友。" + }, "incremental_interval_minutes": { "type": "int", "description": "增量分析间隔(分钟)", diff --git a/main.py b/main.py index d3a2946..e781db1 100644 --- a/main.py +++ b/main.py @@ -606,6 +606,7 @@ class QQGroupDailyAnalysis(Star): - status: 查看当前状态 - reload: 重新加载配置并重启定时任务 - test: 测试自动分析功能 + - incremental_debug: 切换增量分析立即报告模式(调试用) """ group_id = self._get_group_id_from_event(event) @@ -711,6 +712,13 @@ class QQGroupDailyAnalysis(Star): except Exception as e: yield event.plain_result(f"❌ 自动分析测试失败: {str(e)}") + elif action == "incremental_debug": + current_state = self.config_manager.get_incremental_report_immediately() + new_state = not current_state + self.config_manager.set_incremental_report_immediately(new_state) + status_text = "已启用" if new_state else "已禁用" + yield event.plain_result(f"✅ 增量分析立即报告模式: {status_text}") + else: # status is_allowed = self.config_manager.is_group_allowed(group_id) status = "已启用" if is_allowed else "未启用" @@ -738,15 +746,19 @@ class QQGroupDailyAnalysis(Star): f"活跃时段{active_start}:00-{active_end}:00)" ) + debug_report = self.config_manager.get_incremental_report_immediately() + debug_status = "✅ 开启" if debug_report else "❌ 关闭" + yield event.plain_result(f"""📊 当前群分析功能状态: • 群分析功能: {status} (模式: {mode}) • 自动分析: {auto_status} ({auto_time}) • 增量分析: {incremental_status_text} +• 调试模式: {debug_status} (增量立即报告) • 输出格式: {output_format} • PDF 功能: {pdf_status} • 最小消息数: {min_threshold} -💡 可用命令: enable, disable, status, reload, test +💡 可用命令: enable, disable, status, reload, test, incremental_debug 💡 支持的输出格式: image, text, pdf (图片和PDF包含活跃度可视化) 💡 其他命令: /设置格式, /安装PDF, /增量状态""") diff --git a/src/infrastructure/config/config_manager.py b/src/infrastructure/config/config_manager.py index 9491140..0608edd 100644 --- a/src/infrastructure/config/config_manager.py +++ b/src/infrastructure/config/config_manager.py @@ -121,11 +121,15 @@ class ConfigManager: def get_user_title_analysis_enabled(self) -> bool: """获取是否启用用户称号分析""" - return self._get_group("analysis_features").get("user_title_analysis_enabled", True) + return self._get_group("analysis_features").get( + "user_title_analysis_enabled", True + ) def get_golden_quote_analysis_enabled(self) -> bool: """获取是否启用金句分析""" - return self._get_group("analysis_features").get("golden_quote_analysis_enabled", True) + return self._get_group("analysis_features").get( + "golden_quote_analysis_enabled", True + ) def get_max_topics(self) -> int: """获取最大话题数量""" @@ -216,7 +220,9 @@ class ConfigManager: def get_user_title_analysis_prompt(self, style: str = "user_title_prompt") -> str: """获取用户称号分析提示词模板""" - prompts_config = self._get_group("prompts").get("user_title_analysis_prompts", {}) + prompts_config = self._get_group("prompts").get( + "user_title_analysis_prompts", {} + ) prompt = prompts_config.get(style, "") if prompt: return prompt @@ -226,7 +232,9 @@ class ConfigManager: self, style: str = "golden_quote_prompt" ) -> str: """获取金句分析提示词模板""" - prompts_config = self._get_group("prompts").get("golden_quote_analysis_prompts", {}) + prompts_config = self._get_group("prompts").get( + "golden_quote_analysis_prompts", {} + ) prompt = prompts_config.get(style, "") if prompt: return prompt @@ -317,7 +325,9 @@ class ConfigManager: def set_golden_quote_analysis_enabled(self, enabled: bool): """设置是否启用金句分析""" - self._ensure_group("analysis_features")["golden_quote_analysis_enabled"] = enabled + self._ensure_group("analysis_features")["golden_quote_analysis_enabled"] = ( + enabled + ) self.config.save_config() def set_max_topics(self, count: int): @@ -364,6 +374,17 @@ class ConfigManager: """获取是否启用增量分析模式""" return self._get_group("incremental").get("incremental_enabled", False) + def get_incremental_report_immediately(self) -> bool: + """获取是否启用增量分析立即发送报告(调试用)""" + return self._get_group("incremental").get( + "incremental_report_immediately", False + ) + + def set_incremental_report_immediately(self, enabled: bool): + """设置增量分析是否立即发送报告""" + self._ensure_group("incremental")["incremental_report_immediately"] = enabled + self.config.save_config() + def get_incremental_interval_minutes(self) -> int: """获取增量分析间隔(分钟)""" return self._get_group("incremental").get("incremental_interval_minutes", 120) diff --git a/src/infrastructure/scheduler/auto_scheduler.py b/src/infrastructure/scheduler/auto_scheduler.py index cf09795..5414765 100644 --- a/src/infrastructure/scheduler/auto_scheduler.py +++ b/src/infrastructure/scheduler/auto_scheduler.py @@ -202,9 +202,7 @@ class AutoScheduler: f"已注册增量分析任务: {hour:02d}:{minute:02d} (Job ID: {job_id})" ) except Exception as e: - logger.error( - f"注册增量分析任务失败 ({hour:02d}:{minute:02d}): {e}" - ) + logger.error(f"注册增量分析任务失败 ({hour:02d}:{minute:02d}): {e}") # 注册最终报告生成任务(使用配置的自动分析时间点) time_config = self.config_manager.get_auto_analysis_time() @@ -227,9 +225,7 @@ class AutoScheduler: misfire_grace_time=60, ) self.scheduler_job_ids.append(job_id) - logger.info( - f"已注册增量最终报告任务: {t_str} (Job ID: {job_id})" - ) + logger.info(f"已注册增量最终报告任务: {t_str} (Job ID: {job_id})") except Exception as e: logger.error(f"注册增量最终报告任务失败 ({t_str}): {e}") @@ -478,10 +474,26 @@ class AutoScheduler: # 按索引交错延迟,均匀分散 API 压力 if idx > 0 and stagger > 0: await asyncio.sleep(stagger * idx) - return await self._perform_incremental_analysis_for_group_with_timeout( - gid, pid + + result = ( + await self._perform_incremental_analysis_for_group_with_timeout( + gid, pid + ) ) + # 检查是否需要立即发送报告(调试模式) + if self.config_manager.get_incremental_report_immediately(): + if isinstance(result, dict) and result.get("success"): + logger.info( + f"增量分析立即报告模式生效,正在为群 {gid} 生成报告..." + ) + # 立即生成最终报告 + await self._perform_incremental_final_report_for_group_with_timeout( + gid, pid + ) + + return result + analysis_tasks = [] for idx, (gid, pid) in enumerate(target_list): task = asyncio.create_task( @@ -586,9 +598,7 @@ class AutoScheduler: return result except Exception as e: - logger.error( - f"群 {group_id} 增量分析执行失败: {e}", exc_info=True - ) + logger.error(f"群 {group_id} 增量分析执行失败: {e}", exc_info=True) return {"success": False, "reason": str(e)} finally: logger.debug(f"群 {group_id} 增量分析流程结束") @@ -707,9 +717,7 @@ class AutoScheduler: # 检查平台状态 if not self.bot_manager.is_ready_for_auto_analysis(): - logger.warning( - f"群 {group_id} 最终报告跳过:bot管理器未就绪" - ) + logger.warning(f"群 {group_id} 最终报告跳过:bot管理器未就绪") return {"success": False, "reason": "bot_not_ready"} # 委派给应用层服务执行最终报告用例 @@ -756,9 +764,7 @@ class AutoScheduler: return result except Exception as e: - logger.error( - f"群 {group_id} 最终报告执行失败: {e}", exc_info=True - ) + logger.error(f"群 {group_id} 最终报告执行失败: {e}", exc_info=True) return {"success": False, "reason": str(e)} finally: logger.debug(f"群 {group_id} 最终报告流程结束") @@ -787,9 +793,7 @@ class AutoScheduler: adapter_ids = list(self.bot_manager._adapters.keys()) # 调试模式下记录详细信息,INFO级别仅显示概览 - logger.debug( - f"[AutoScheduler] Bot实例: {bot_ids}, 适配器: {adapter_ids}" - ) + logger.debug(f"[AutoScheduler] Bot实例: {bot_ids}, 适配器: {adapter_ids}") if not bot_ids: logger.warning("[AutoScheduler] 自动发现后未找到任何Bot实例")