Commit Graph
138 Commits
Author SHA1 Message Date
nezumi b5d10c4525 fix: localize group analysis permission response 2026-07-24 15:50:48 +07:00
nezumi a9d0715f60 fix: prevent Chinese output in group analysis command 2026-07-24 15:28:24 +07:00
nezumi 5f74728b69 feat: enforce Vietnamese analysis output 2026-07-24 11:39:41 +07:00
nezumi e492b84fc1 feat: update translate 2026-07-24 10:17:58 +07:00
nezumi 5aefec8dcf feat(i18n): add Vietnamese localization 2026-07-22 18:02:17 +07:00
SXP-Simon 04fa154a28 [v4.11.2] - 🛠️ 定时报告可同时发送多种格式,可关闭报告发送时的 “📊 每日群聊分析报告已生成” 文字前缀 2026-07-21 16:33:00 +08:00
SXP-Simon 938ae5ddaf feat: 新增 show_report_caption 选项,可关闭报告发送时的文字前缀 2026-07-21 16:22:20 +08:00
SXP-Simon c19332a887 feat: output_format 支持多选,报告可同时发送多种格式
- ConfigManager: get_output_format 改为返回 list,向后兼容旧 string 值
- set_output_format 接受逗号分隔的格式列表
- Dispatcher: dispatch() 循环所有选中格式逐一分发
- manual (/群分析): 使用列表中的第一种格式
- 命令 /设置格式: 支持 image,html 等逗号分隔多选
- 配置面板 output_format 改为 list 类型 (可多选)
2026-07-21 15:50:31 +08:00
SXP-Simon 3a03c1f272 feat(filter_bot_messages): 新增 filter_bot 开关,控制 bot 消息是否纳入分析
Fixes #205

默认排除 bot 自身发言(filter_bot_messages=True),可通过 /分析设置 filter_bot 切换。
修改涉及三层:
1. 配置层:ConfigManager getter/setter + _conf_schema.json 面板选项
2. 适配器层:BotManager 传入配置,OneBotAdapter.fetch_messages 认 switch
3. 分析层:clean_messages 和 analyze_user_activity 的 bot_self_ids 受 switch 控制
2026-07-21 15:42:47 +08:00
clown145andSXP-Simon f2bcd6801e [v4.11.1] - 🛠️ 修复 QQ 官方机器人昵称与提及清洗 (#207)
Fix QQ official nickname and mention handling 

* fix: restore QQ official nicknames and sanitize mentions

* fix: protect QQ official identities and whitespace

* docs: update QQ official nickname guidance

* chore: bump version to v4.11.1

* docs: remove obsolete PDF guidance

* chore: finalize v4.11.1 release prep

* fix(qqofficial): 修复 _sanitize_qq_official_mentions .strip() 吞换行,补充 allow_alphanumeric_user_ids 注释

- .strip() → .strip(' \t'):仅清除首尾空白/制表符,保留用户创作的 \n 换行
- allow_alphanumeric_user_ids:在参数定义处补充注释,说明该标记还控制 ID 正则化和回退显示名
- 响应 Sourcery 代码审查 #207 指出的问题

* chore:  删除不必要的描述

---------

Co-authored-by: SXP-Simon <sxp20061207@163.com>
2026-07-21 14:53:31 +08:00
clown145andSXP-Simon c18224cb82 [v4.11.0] - 新增 QQ 官方机器人群聊分析与专用 Markdown 报告 (@clown145 #206)
* feat: add QQ official bot group analysis support

* fix: use text progress replies for QQ official bot

* fix: harden QQ official proactive reporting

* feat: enhance QQ official markdown reports

* refactor: isolate QQ official markdown reporting

* fix: restore platform adapter exports

* style: format QQ official changes

* fix(main): 添加 html_render 类型声明和 Callable 导入

为 self.html_render 属性添加显式类型声明,解决定时任务中可能因缺少类型注解导致的隐式错误。

* fix(analysis): 消除 execute_daily_analysis 中重复的 bot_self_ids 赋值

去除第二次冗余的 config_manager.get_bot_self_ids() 调用,直接复用已获取的变量。

* cleanup(domain): 移除未使用的分析器适配器和死代码服务文件

删除 golden_quote_analyzer.py、topic_analyzer.py、user_title_analyzer.py(均为未被引用的接口+适配器包装)report_generator.py(旧的文本报告生成器)statistics_calculator.py(与 StatisticsService 功能重复)更新 domain/services/__init__.py 移除对上述文件的引用。

* cleanup(domain): 移除冗余的实体和值对象文件,收敛数据模型至 domain/models/data_models.py

删除 analysis_result.py(与 data_models.py 重复的 SummaryTopic/UserTitle/GoldenQuote 等类定义)value_objects/golden_quote.py、statistics.py、topic.py、user_title.py(均为未被引用的 frozen dataclass 迁移残留)。所有活跃代码已统一导入 domain/models/data_models.py。

* refactor(llm): 抽取 _make_session_id 辅助方法消除重复代码

在 5 个方法(analyze_topics、analyze_user_titles、analyze_golden_quotes、analyze_all_concurrent、analyze_incremental_concurrent)中出现完全相同的 datetime.now().strftime(...) + umo 拼接逻辑,已提取为 _make_session_id 静态方法。

* refactor(message): 正则表达式提升为模块级常量避免重复编译

DISCORD_CUSTOM_EMOJI_PATTERN 和 COMMAND_PATTERN 从类属性移至模块级常量,避免每次实例化 MessageCleanerService 时重新编译正则。

* arch(domain): 定义 IActivityVisualizer 接口并通过依赖注入消除领域层反向依赖

创建 IActivityVisualizer 接口于 domain/repositories/visualization_repository.py,StatisticsService 改由依赖注入接收该接口;ActivityVisualizer 继承接口。消除原 StatisticsService 直接 import infrastructure.visualization 的 DDD 违规。

* fix(main): 补全 Callable 导入和 html_render 类型声明

初次提交(877adb6)因 git add -p 交互式分块时 BOM 导致错误的 hunk 被暂存,Callable 导入和 html_render 类型声明丢失。本次补全这两项修改。

* fix(platform): 补充 QQOfficialAdapter、TelegramAdapter、DiscordAdapter 导出

* refactor(main): 提取内嵌的文本报告生成/发送函数为独立类方法

将 _send_analysis_report 方法中的 generate_text_reports() 和 send_text_reports() 内嵌异步函数提取为 _generate_text_reports 和 _send_text_reports 私有方法。减少闭包复杂度,提升可维护性。

* cleanup(config): 移除废弃的 get_qq_official_t2i_activity_histogram_enabled 向后兼容方法

删除 config_manager.py 中的旧名别名方法,简化 qq_official_markdown.py 中对应的 getattr 回退逻辑为直接方法调用,移除测试中专门验证旧名兼容性的 LegacyDisabledConfig 测试用例。该兼容层仅在迁移期间临时存在,现已完成过渡。

* fix(types): 修复 Pylance 类型告警 — platform_key 未绑定、int(object) 和 template.filename 可能为 None

platform_group_registry.py: 将 platform_key 定义提前,消除 Pylance reportPossiblyUnboundVariable 告警。
qq_official_markdown.py: 将 int(value or 0) 改为 int(value) if value is not None else 0,消除 reportArgumentType 告警。
templates.py: 在使用 template.filename 前增加 None 检查,消除 str|None 不可分配给 str 的告警。
qq_official_adapter.py: 为 post_group_message 添加类型忽略注解,消除 await 不可等待对象的告警。

* fix(types): 修复残留的 Pylance 类型告警

platform_group_registry.py: 将 (platform_key, group_id) 改为 (str(platform_key), group_id),消除 str|None 不可分配给 str 的 reportArgumentType
qq_official_markdown.py: int(value) 添加 # type: ignore[arg-type],消除 object 不可分配给 ConvertibleToInt
qq_official_adapter.py: 移除无意义的中间变量,await 行直接添加 # type: ignore[arg-type]

* docs(message): 更新 MessageProcessingService 的文档和注释,消除 Telegram 特殊性表述

类 docstring:移除 '维护 Telegram 群组注册表' 等过时描述,补充 QQ 官方去重职责。
group_registry.upsert 注释:改为泛化的跨平台描述,不再限定 Telegram。
_extract_event_timestamp / _reserve_event_id / _commit_event_id / _release_event_id:英文 docstring 统一为中文。

* docs(message): 修正类注释中只提 QQ 官方的问题,明示 Telegram 也由本服务处理

Telegram 和 QQ 官方消息都经过 MessageProcessingService.process_message()。修正前类 docstring 只提了 QQ 官方的事件去重,缺少 Telegram 作为主要调用者的说明。

* fix(types): 修正 _sanitize_analysis_result_for_export 返回类型注解

函数声明 -> dict 但 _sanitize_export_identity_text 可返回 str|dict|list,Pylance 报 reportReturnType。
改为 -> dict[str, Any] 准确表达实际返回类型,补充缺失的 from typing import Any。

* fix(types): 抑制 Pylance reportReturnType 误报

_sanitize_analysis_result_for_export 的 analysis_result 参数运行时始终为 dict,但 _to_plain_export_data 递归返回 Any 导致 Pylance 推导出 str|dict|list 联合类型。
添加 # type: ignore[return-type] 抑制此误报。

* fix(report): 渲染匿名模式下的未知引用 token 不再静默丢弃

当 hide_user_names=True 且 [id] 不在 known_ids 中时,之前返回空 Markup 导致 token 被静默移除,可能扭曲文本语义。改为返回转义后的原始 [id] 字符串,保留文本布局和语义,同时不泄露身份信息。
参考 Sourcery AI code review 建议。

* fix(import): 避免从 astrbot.core 直接导入 File,优先使用公开 API

astrbot.core 是内部模块,不在公开 API 契约中,可能随版本变化。
改为 try 优先导入 astrbot.api.message_components.File(公开 API),
失败时回退到 astrbot.core.message.components.File(向后兼容)。
同时修复 main.py 和 qq_official_adapter.py 两处导入。

* fix(import): 回退 try/except 伪装,改为直接导入 + 风险注释

astrbot.api.message_components 不存在,try/except 永远走 except 分支,是无效代码。
改为直接 from astrbot.core.message.components import File,用注释说明这是内部 API 可能变化。

* fix(ruff): 代码质量

* docs(README): 调整文档说明,删除 lark 相关的描述和功能标识

* docs(desc): 更新 desc

* fix(message): 将 TG 和 QQ 官方消息缓存成功日志降为 debug

* perf(message): 将 _extract_event_timestamp 延迟到 QQ 官方分支内计算

该时间戳仅用于 QQ 官方消息的 history_content 元数据,但对所有平台都执行了深度 getattr 链。
改为只在 QQ 官方分支内延迟计算,消除 Telegram 等平台上每次消息的白算开销。

* chore(CHANGELOG)

---------

Co-authored-by: SXP-Simon <sxp20061207@163.com>
2026-07-20 03:24:50 +08:00
Helian Nuits e8af00e016 feat(muted): 被禁言避免触发分析功能浪费 token (#191) (#203)
* feat(AnalysisApplicationService): 增加针对禁言的优化

* fix: 优先从 Event 中提取 bot_self_id

* fix: 禁言异常处理

* fix: 不传递 no_cache=True 以免超时

* fix: 如果 bot_instance 没变,且已经有适配器,跳过重新创建,防止丢失内部状态

* fix: set_reaction 方法操作异常拦截

* fix: 修复错误的禁言发送消息,改为日志提示

* chore: add .tmp_refs to .gitignore

* refactor(onebot): optimize and prune group mute cache

* fix(onebot): resolve pylance type mismatch warning in min key

* fix(onebot): annotate params dict with precise union type to resolve pylance warning
2026-07-08 11:44:19 +08:00
d5b0c26289 fix(path): pass plugin name to StarTools.get_data_dir() to avoid inspect.stack() crash (#193)
* fix: pass plugin name to StarTools.get_data_dir to avoid inspect-stack crash

* refactor: reuse plugin name constant for data dir

---------

Co-authored-by: Rat0323 <rat0323@users.noreply.github.com>
Co-authored-by: Rat0323 <261020116+Rat0323@users.noreply.github.com>
2026-07-08 11:04:19 +08:00
leko 2618491246 fix: telegram avatar handling (#176)
* feat: add avatar caching support and improve error handling in Telegram adapter

* feat(avatar): implement avatar negative cache management and improve logging levels
2026-04-25 11:08:46 +08:00
ShiitinandSXP-Simon d47a9411b2 fix: 修复了当html_only_url打开时,URL拼接错误问题 (#169)
Fixes #169

* fix:修复了当html_only_url打开时,手动触发部分URL拼接错误问题

* fix:修复了当html_only_url打开时,自动触发部分URL拼接错误问题

* fix: ruff

---------

Co-authored-by: SXP-Simon <sxp20061207@163.com>
2026-04-13 15:37:18 +08:00
Shiitin 911b8b2fb2 feat(html): 增加了html_only_url选项,使在选择输出格式为html时可以单独发送BaseURL (#166 @shiitin)
* 更改了AstrBot中面板的的设置项,增加了html_only_url选项

* 增加了html_only_url

* 增加了单独发送URL

在html_only_url设置被打开且配置了Base URL后,将会单独发送URL

* 加入测试日志,尝试解决存在问题

* 加入测试日志,尝试解决存在问题

* 删除了定时触发部分的测试日志

* 修改了手动触发部分的发送HTML的判断

* 修改了main.py的单行长度过长问题

* 修复了dispatcher.py的缩进问题
2026-04-12 22:03:45 +08:00
SXP-Simon 937f4e1782 [v4.9.15] - fix: 发送假超时不应该导致上传群相册群文件失败,删除 PDF 模块和相关的功能 2026-04-07 22:30:20 +08:00
SXP-Simon 93b2b847ef fix(output_format): 改为 options 形式处理,提升用户体验 2026-04-07 22:27:34 +08:00
SXP-Simon ae38febca2 fix(pdf): 删除 PDF 模块和相关的功能 2026-04-07 22:17:09 +08:00
SXP-Simon 59e9f06d0d fix: 移除发送重试模块 2026-04-02 17:45:56 +08:00
lekoandSXP-Simon 47eeff3f61 fix(template-utils): str.format -> string.Template (#149)
* feat: upgrade prompt templates from str.format to string.Template for improved compatibility

* fix(get_astrbot_data_path): fallback 到 get_astrbot_data_path 方法

* feat: upgrade prompt templates from str.format to string.Template for improved compatibility

* fix: strict mode

* fix: 补齐文件名格式的自动迁移

* fix(ChatQualityAnalyzer): 删除无效的 prompt 提示语句

* ruff

---------

Co-authored-by: SXP-Simon <sxp20061207@163.com>
2026-04-02 16:40:34 +08:00
SXP-Simon 5e2da8c852 fix(get_astrbot_data_path): fallback 到 get_astrbot_data_path 方法 2026-04-02 15:25:07 +08:00
SXP-Simon 05836f64f2 fix: 定时任务超时问题优化
Fixes #141

定时分析任务间隔启动,放宽超时配置限制
2026-04-01 21:14:00 +08:00
lekoandSXP-Simon 8ba5f69788 feat: 檔案名稱模板支援 ULID 和資料夾路徑 (#146 @lekoOwO)
* feat: Enhance HTML report generation and dispatching with captions

* chore: apply ruff fixes

* fix(ReportGenerator): update HTML caption for report generation

* fix(ReportGenerator): encode filename in HTML report caption URL

* fix(ReportGenerator): refactor golden quotes handling for clarity and consistency

* feat(ReportGenerator): enhance filename formatting with ulid support and path sanitization

* fix(ReportGenerator): enhance path validation and filename uniqueness in report generation

* fix: pylance type error and ruff

* fix: 路径默认使用 ulid 变量

---------

Co-authored-by: SXP-Simon <sxp20061207@163.com>
2026-04-01 20:38:57 +08:00
3662ac3d75 feat(html): Add HTML output format support (#143 @lekoOwO)
* feat: add HTML output format support

- Add HTML settings section to _conf_schema.json with base URL and output directory configuration
- Add HTML configuration methods to ConfigManager (get_html_output_dir, get_html_base_url, get_html_filename_format)
- Create html_template.html files for all themes (fallback to image_template.html)
- Implement generate_html_report method in ReportGenerator to save HTML and JSON files
- Update main.py to handle HTML output format and send both file and URL if base_url is configured
- Update set_output_format command to include HTML as a valid format option

Co-authored-by: lekoOwO <20151124+lekoOwO@users.noreply.github.com>

* feat: enhance JSON serialization in HTML report generation

* fix: 优化输出目录获取逻辑

---------

Co-authored-by: anthropic-code-agent[bot] <242468646+Claude@users.noreply.github.com>
Co-authored-by: lekoOwO <20151124+lekoOwO@users.noreply.github.com>
Co-authored-by: SXP-Simon <sxp20061207@163.com>
2026-03-31 20:06:57 +08:00
clown145 697213826c fix: align reaction mapping across platforms (#139)
解决 TG 无法贴表情的 bug
2026-03-31 00:04:13 +08:00
SXP-Simon 9ed4771730 feat: 完善自动分析名单调度与面板配置说明
- 重构自动分析调度流程:以分层名单解析目标群组,统一报告入口,并按群组模式分发传统/增量任务。

- 新增定时名单与增量名单配置能力:补充 scheduled_group_list(_mode)、incremental_group_list(_mode)、incremental_fallback_enabled。

- 优化失败兜底策略:增量最终报告在超时、异常或无有效结果时,可回退至传统全量分析。

- 完善配置与文档说明:在 _conf_schema.json 与 README 中补充面板操作指引、判定顺序与边界场景说明。

- 兼容旧配置行为:保留废弃接口,并在配置管理中统一名单匹配语义(UMO/群号兼容)。
2026-03-26 19:23:49 +08:00
SXP-Simon d03b3d5b42 fix: 修复插件任务生命周期管理,避免用户困惑的报错行为 (#125)
- 修复 'NoneType' 报错 (Fix #125): 引入插件终止标志位并完善任务生命周期清理逻辑。
- 强化资源清理:重载时主动取消并等待所有运行中的异步任务(包括手动分析、自动调度和依赖安装),移除危险的属性置空操作,彻底消除重载时的属性访问竞态。
2026-03-25 16:49:14 +08:00
lingyun14 664918e28f feat: 新增文本/表情回复模式开关) (#123 @lingyun14beta)
fixes #115
2026-03-24 00:03:29 +08:00
SXP-Simon c65d26b4ba fix(close): 统一为异步方法以正确清理 aiohttp 会话和 diskcache 缓存 2026-03-23 00:42:18 +08:00
oculrandSXP-Simon f40243492f refactor: 报告中的群员头像重构为 diskcache 缓存,过期时间3天;优化代码可读性; (#118 @oculr)
* refactor: 报告中的群员头像重构为diskcache缓存,过期时间3天;优化代码可读性;

* refactor: 进一步优化头像处理逻辑与资源管理生命周期

- **头像处理性能优化**:
  - 将 Base64 转换重构为同步方法,消除微型 CPU 计算任务的异步上下文切换开销。
  - 增强图片 MIME 类型识别能力,通过分析文件头支持 WebP 和 JPEG 魔数检测。
  - 改善下载失败处理:移除了失败结果的持久化缓存(Negative Caching),确保在网络波动恢复后能自动重新尝试获取。
- **资源与生命周期管理**:
  - 完善插件终止流程:增加了显式的缓存关闭逻辑,并与插件卸载钩子集成,确保正确释放持久化层的文件句柄。
- **鲁棒性与调试增强**:
  - 加强对第三方头像获取器返回值的 URL 协议校验,并补充了相应的警告日志。
  - 优化了 Base64 转换等环节的异常日志记录格式,增加了对堆栈追踪的支持。
- **代码整洁度**:
  - 统一并清理了重复的模块导入,移除了方法内部冗余的库导入。
  - 全量应用 Ruff 格式化规范,优化了导入顺序及整体代码布局。

---------

Co-authored-by: SXP-Simon <sxp20061207@163.com>
2026-03-22 23:36:28 +08:00
SXP-Simon f3f93a96c4 fix typo 2026-03-20 21:07:03 +08:00
SXP-Simon 3ec4de1c99 feat(reaction): 将文字反馈调整为表情反馈 2026-03-19 15:12:44 +08:00
Helian Nuits 5876613deb fix: 群相册严格模式修复 (#111)
* fix: respect strict mode for qq group album upload(#100)

* fix: align album strict-mode default and bool parsing

* refactor: simplify strict mode config getter

* fix: enforce album strict mode in main upload path

* fix(pre-commit)
2026-03-15 23:21:54 +08:00
SXP-Simon 2e5ef3eba3 fix(terminate): 解决插件卸载/重载时因 schedule_jobs(None) 调用导致的 NoneType 报错,完善资源清理流程。 2026-03-12 18:43:47 +08:00
SXP-Simon f2b4c16919 fix(ruff) 2026-03-12 18:05:01 +08:00
SXP-Simon bd991e9c16 feat(trace): 实现语义化 Trace ID 机制并美化报告展现
- [TraceContext] 重构 ID 生成算法,支持包含群名和时间(如 manual_技术交流群_1733),极大提升日志调试效率。
 - [视觉美化] 从用户可见消息(初始提示及图片 Caption)中彻底移除技术性的 [ID: xxx] 字符串。
 - [去重增强] 在报告 Caption 中引入基于秒级时间戳的“隐式指纹”,配合共享正则匹配,确保精准去重。
 - [自动分析] 优化自动调度器逻辑,引入群名缓存,使服务端定时任务日志更具业务可读性。
 - [逻辑精简] 利用插件现有的任务并发锁,移除了 Trace ID 中冗余的 4 位随机后缀,进一步精简长度。
2026-03-12 18:03:23 +08:00
SXP-Simon b4abee55d4 fix: 修复 TraceContext 兼容性与服务返回结果缺失导致的崩溃问题
【链路追踪系统】
- 在 TraceContext 中补全 generate()、set() 和 get() 兼容性接口,确保旧代码无缝迁移。
- 重新实现 TraceLogFilter 日志过滤器,恢复日志流中的 TraceID 显示。
- 统一全插件 import 路径至 src/shared/trace_context.py,并删除冗余的旧文件。

【应用服务层】
- 修复 KeyError: 'group_id':在 execute_daily_analysis 和 execute_incremental_final_report 的返回结果中补全 group_id 和 platform_id。
- 完善 execute_incremental_analysis 的返回字段,保持 API 返回格式的一致性。

【基础设施与工具】
- 在 AutoScheduler 中增加对适配器获取失败的防御性检查。
- 修复 uto_scheduler.py 和 dispatcher.py 中的静态类型检查报错。
2026-03-12 14:51:59 +08:00
SXP-Simon 059d6ea68d feat: 全面重构主插件架构,解决并发竞态、资源泄露并优化代码健壮性
【并发与生命周期规范化】
- 引入 asyncio.Lock (_init_lock) 保护初始化流程,确保多入口(Reload/Init/Loaded)触发时维持单例运行,消除重复注册风险。
- 重构初始化任务创建逻辑,增加对当前协程 Loop 的状态检查,预防 Python 3.10+ 环境下常见的运行时异常。
- 引入 _background_tasks 集合统一追踪异步任务生命周期,实现透明的任务注册与自动移除。
【资源清理与加固】
- 增强 terminate() 析构逻辑:在卸载时主动取消所有追踪的后台任务(包括正在进行的分析、渲染或依赖安装),并使用 asyncio.gather 确保安全释放。
- 采用 type: ignore 配合非 Optional 类型声明,在保证 terminate() 能够置空引用的前提下,消除了 Pylance 对全局 50+ 处属性访问的“可能为 None”误报。
【业务流程健壮性】
- 提取超长逻辑:将分析报告的渲染与多格式分发逻辑抽离至 _send_analysis_report 异步生成器,显著降低单一函数圈复杂度。
- 优化图片上传服务:
  * 引入 MAX_PAYLOAD_SIZE (20MB) 机制,拦截超大 Base64/数据,隔离内存风险。
  * 弃用固定路径,改用 tempfile.mkstemp 生成线程安全的唯一临时文件。
  * 完善 finally 块清理逻辑,确保物理文件在上传成功或失败后都能被即时删除。
【指令系统重构】
- 采用子命令模式优化 /分析设置 (analysis_settings),将启用/禁用逻辑下沉至私有处理方法,提升代码可读性。
- 修复 /群分析 异步迭代漏洞,确保分析结果流能正确通过 AsyncGenerator 协议回传。
- 移除所有业务校验中的 assert 断言,替换为更安全的条件分支与错误消息返回。
2026-03-11 23:18:09 +08:00
SXP-Simon 0b90a8b9ac fix(analysis): 修复可选参数 days 以支持自定义分析天数 2026-03-10 12:33:12 +08:00
SXP-Simon a05959b60e fix(pre-commit) 2026-03-06 17:49:20 +08:00
SXP-Simon f627a2d8e1 fix: 引入任务生命周期管理,强制退出保护 2026-03-06 17:45:08 +08:00
SXP-Simon f47af8cb99 [v4.8.1] - feat(traceability): 实现全链路 TraceID 追踪,增强初始化韧性与去重拦截 2026-03-06 17:37:54 +08:00
SXP-Simon aa92a7087a feat(TraceID): 主要通过引入全链路追踪,增强了日志的可观测性,并加固了去重拦截逻辑 2026-03-06 16:39:51 +08:00
SXP-Simon 7850697f1a refactor(perf): 建立三级资源防线并优化并发限流配置
- 【异常处理优化】引入自定义任务重复异常,精准区分“因重复运行而跳过”与“实际分析取消”两种不同语义,提升调度健壮性。
- 【三级并发控制架构】针对不同层级的资源消耗,建立了完整的限流保护体系:
    - 入口层:控制同时处于活跃状态的任务总数,防止瞬时加载大量消息导致服务器内存溢出 (OOM);
    - 接口层:全局限制 LLM API 并发请求数,确保严格遵守服务商的频率限制 (RPM);
    - 渲染层:全局限制浏览器图片生成进程,保护物理 CPU 与内存不被高能耗渲染任务耗尽。
- 【配置体验升级】新增「并发限流设置」配置组,统一收纳核心性能参数,并提供面向普通用户的防坑说明与更稳健的默认值。
- 【代码清理】移除陈旧的兼容逻辑与冗余参数,统一配置命名规范。
- 【功能精化】重排增量分析逻辑,确保在任务入口与分段处理流程中均有可靠的信号量保护。
- 【细节完善】优化群文件及群相册上传设置的文案描述,明确功能支持范围与权限要求。
2026-03-03 21:07:51 +08:00
SXP-Simon ee0bf037b8 feat: 实现群聊分析任务锁及全局资源并发限流控制
1. 任务锁定机制 (Group Task Locking):
   - 在应用服务层实现基于群组和任务类型的异步锁,使用 asynccontextmanager 生成器函数确保同一群聊在同一时间只能执行一个分析任务。
   - 使用弱引用字典 (WeakValueDictionary) 管理锁实例,防止长期的内存占用。
   - 在指令入口增加对 CancelledError 的捕获,当任务冲突时向用户反馈“任务正在执行中”的友好提示。

2. 全局并发限流重构 (Resource-level Throttling):
   - 资源层限流下沉:将并发控制中心从调度层迁移至具体的资源处理层(T2I/LLM)。
   - T2I 渲染保护:在报告生成器中引入全局信号量,严格控制 T2I 引擎的瞬时负载。
   - LLM API 保护:在应用服务层引入全局信号量,平滑所有分析请求对 LLM 提供商接口的请求频率。
   - 调度逻辑简化:移除调度器内部冗余的信号量,使其仅专注于分发逻辑与 Stagger(交错启动)平滑。

3. 调度与反馈优化:
   - 自动分析调度器增加对“跳过”任务的独立统计,并在执行报告中清晰展示“成功、跳过、失败”的具体数量。
   - 优化了管理测试指令和增量分析指令的异常处理逻辑。

4. 消息重复发送防护:
   - 在重试组件中增加基于消息历史记录的探活逻辑。在重试发送前先核实记录,确认是否已因网络抖动导致“假失败”但已实达,有效拦截重复消息。
2026-03-03 21:07:51 +08:00
SXP-Simon 544458aadd fix(retry): 增强重试管理器,尝试避免重试地狱和重复发送 2026-02-23 00:34:55 +08:00
SXP-Simon e4819c866d fix(image): 处理绝对路径和相对路径的文件路径转换 2026-02-22 15:33:01 +08:00
SXP-Simon d8f28ecf84 fix(pre-commit) 2026-02-21 23:36:46 +08:00
SXP-Simon bceb27d00e fix(image): 优化图片发送 2026-02-21 23:34:22 +08:00