18 Commits
Author SHA1 Message Date
youpaishidifu 09ea05fc79 fix: EasyOCR启动异常+超时保护+消息搅和隔离
1. 修复负冷却时间bug:启动失败时若未设置冷却,现在设置30s冷却
2. EasyOCR worker添加超时保护:readtext()使用concurrent.futures包装,30s超时
3. Windows OCR消息搅和隔离:EasyOCR超时+Windows OCR多时间戳→返回空结果
4. 添加easyocr_worker_state.json到.gitignore
2026-08-08 22:14:02 +08:00
youpaishidifu 5c4a17043a fix: 修复两个OCR问题
1. 修复_clean_ocr_prefix误删登录关键词导致答非所问
   - 噪声前缀后必须跟标点/空格或字符串结束,不能紧跟中文字符
   - 登录插件,哪里可以下载到?不再被清理为插件,哪里可以下载到?

2. 修复EasyOCR静默原生崩溃检测
   - 父进程:空stderr+空crash log也计入CUDA崩溃计数,2次后强制CPU
   - Worker:添加CUDA驱动DLL预检,加载失败时强制CPU模式
2026-08-07 14:50:29 +08:00
youpaishidifu 9944d74798 fix(easyocr): 顶层崩溃全程留痕,消除"一声不吭"结束进程
- easyocr_worker.py: 新增 worker 状态文件 easyocr_worker_state.json
  (pid/mode/status/last_img_len/ts/error),就绪/忙碌/空闲实时落盘;
  强化 sys.excepthook / _flush_exit / _signal_handler 崩溃写状态+crash.log
- monitor.py: _kill_easyocr_proc 杀前诊断三路
  (状态文件 + 残留stderr + crash.log尾),以 warning 汇总进主日志;
  _read_easyocr_crash_tail 新增 ignore_age 跳过60s时间窗用于诊断路径
- unicode_radicals.md: 丿(U+4E3F)行改 - 不参与偏旁过滤,修复OCR碎片误杀儿下载等
2026-08-06 22:55:29 +08:00
youpaishidifu 53175f57eb 修复EasyOCR三个问题:正常调度误判、内存检测误判、消息hash漏消息 2026-08-05 23:20:00 +08:00
youpaishidifu 4418a46460 修复三个问题:时间戳过滤放宽、系统进程名过滤、EasyOCR CUDA崩溃修复
1. 放宽时间戳过滤:窗口30s→60s,消息长度4字→20字,包含中文即放行
2. 添加系统进程名过滤:200+个Windows/第三方进程名模式,防止混入OCR文本
3. EasyOCR崩溃修复:检测内存不足时设置CUDA_VISIBLE_DEVICES=''禁用CUDA,避免import torch加载CUDA库导致崩溃
2026-08-05 21:57:53 +08:00
youpaishidifu fd5d2ee73a 修复内存泄漏和回复截断问题
1. 内存泄漏修复(Bug D):
   - 在 easyocr_worker.py 中添加 GPU 清理函数和信号处理器
   - 在 monitor.py 中创建 _kill_easyocr_proc() 辅助方法
   - 使用 terminate→wait→kill→gc.collect() 安全终止序列替换所有直接 kill()
   - 确保 CUDA 上下文在子进程退出时正确清理

2. 回复截断修复(Bug E):
   - 在 knowledge_base.py 的 search() 方法中检测指南类查询
   - 对于步骤类查询(如何/怎么/教程等),合并同一文档的所有步骤 section
   - 确保用户获得完整的操作指南而非单个步骤
2026-08-05 17:56:07 +08:00
youpaishidifu 5b20037052 fix: 修复提交量阈值过严导致CUDA误拒绝(Bug C)
- 提交量检查从绝对阈值(物理内存×1.5)改为百分比阈值(提交量/总量>90%)
- 页面文件百分比阈值从85%提高到95%
- 解决系统有大页面文件时提交量被误判为过高的问题
2026-08-05 15:49:17 +08:00
youpaishidifu 4aeb03d869 fix: 内存误判(psutil→GlobalMemoryStatusEx) + 时间戳硬截止(>30min丢弃)
- easyocr_worker.py: 删除psutil物理内存检查,统一使用GlobalMemoryStatusEx
  (Windows上psutil可比Task Manager少报~1.7GB,导致4.2GB可用误判为2.5GB)
- monitor.py: _ocr_text_has_fresh_timestamp()加硬截止——最新时间戳>1800s(30min)
  无论是否含CJK均丢弃,修复15:09看到13:34消息(90min前)被误回复
- 新增_timestamp_age_seconds()辅助方法
2026-08-05 15:25:33 +08:00
youpaishidifu 4d7017be6a 修复知识库搜索:表格内容不再被切分,表格section优先返回
- knowledge_base.py: _split_body_by_list_items检测表格区域,不切分表格行
- knowledge_base.py: 添加独立表格section,确保表格内容可被搜索匹配
- knowledge_base.py: 表格兜底策略:最佳文档含操作/支持表格时强制加入并置顶
- knowledge_base.py: reranking后无条件优先返回含操作/支持的表格section
- .gitignore: 添加msg_history.db和诊断脚本到忽略列表
2026-08-05 13:22:27 +08:00
youpaishidifu a3b0e35581 fix: EasyOCR内存不足时强制CPU模式,避免CUDA加载导致系统冻结
- monitor.py: 内存阈值从2GB提高到3GB,CUDA加载torch需要大量内存
- easyocr_worker.py: 新增物理内存预检(3GB阈值),不足时强制CPU模式
- easyocr_worker.py: _init_reader()再次检查物理内存,双重保障
- 改进错误日志:记录内存详细信息(总量、使用率)
- 解决:内存不足时仍加载CUDA导致电脑冻结的问题
2026-08-04 12:18:54 +08:00
youpaishidifu c853b3e504 fix(ocr): 页面文件不足防护——双重预检+长期冷却
问题:EasyOCR worker启动报 WinError 1455(页面文件太小),
无法加载 cufft64_11.dll,物理内存充足但虚拟内存(已提交32.5/35.7GB)不足。

修复:
1. worker端:import前预检虚拟内存——剩余<2GB则直接exit(2),不进入torch/easyocr加载
2. worker端:import捕获WinError 1455时写入虚拟内存诊断信息(物理/页面/提交率)
3. 父进程端:启动worker前预检虚拟内存——<2GB直接冷却1小时,不启动worker
4. 父进程端:识别exit(2)/页面文件错误——冷却1小时而非30秒(系统级问题不反复重试)

诊断增强:
- _get_virtual_memory_info():通过Win32 API获取物理/虚拟内存/页面文件状态
- 崩溃日志包含完整虚拟内存快照,便于排查
- 日志明确提示'增大Windows页面文件'
2026-08-02 21:35:33 +08:00
youpaishidifu a858bbb9f6 fix(ocr): EasyOCR CUDA崩溃防护——健康检查+冻结隔离+自动降级
问题:EasyOCR worker启动即崩溃(access violation in torch CUDA),
冻住整台电脑,用户需强制重启。

修复三层防护:
1. worker端:CUDA健康检查——启动时创建小张量测试CUDA可用性,
   失败则降级CPU,避免进入VGG模型加载的崩溃路径
2. 父进程端:CUDA_LAUNCH_BLOCKING=1——CUDA操作同步化,
   access violation时只杀子进程不冻整机(关键防冻结)
3. 父进程端:崩溃检测——读取崩溃日志,含access violation/torch
   则增加_easyocr_cuda_oom_count,第二次崩溃后强制CPU模式
   (_easyocr_cuda_oom_count>=2 → EASYOCR_FORCE_CPU=1)
2026-08-02 21:22:59 +08:00
youpaishidifu 4ae189e82f 修复EasyOCR CUDA OOM冻结+时间戳day=0崩溃+OCR图片分目录img/raw+processed
- 冻结根因: CUDA OOM后worker不退出, 损坏context持续占显存, 父进程不杀子进程
  反复发图→线程堆积+显存耗尽→桌面冻结
- worker: readtext CUDA/kernel错误→立即退出释放显存(faulerhandler已有兜底)
- 父进程: 收到CUDA错误→立即杀子进程+30s冷却; 连续2次CUDA错误→EASYOCR_FORCE_CPU=1
  强制CPU模式启动(显存不足降级防冻结)
- 时间戳day=0崩溃: _is_timestamp_old跨午夜用replace(day-1), 每月1号day=1→day=0
  抛ValueError day is out of range for month→微信OCR整轮失败; 改用timedelta(days=±1)
- OCR调试图片回源码目录: img/raw(原图PNG) + img/processed(处理后JPG) 分目录存储
- 崩溃日志回源码根 easyocr_crash.log (不写%LOCALAPPDATA%)
- _clean_old_ocr_debug 默认 keep=20 (回退上一轮激进keep=6)
- .gitignore: 忽略 img/ 与 worker_stderr/stdout.txt
2026-08-01 22:23:55 +08:00
youpaishidifu 0405e42a90 修复OCR回复牛头不对马嘴+残留消息+EasyOCR崩溃捕获+360误报
1. knowledge_base.py: 检索排序惩罚标题-only/短正文段,降低heading bonus,奖励正文命中,避免纯标题/免责声明段排第一
2. auto_reply.py: 动作类查询要求正文命中才放行;拒绝纯标题/免责声明答案
3. monitor.py: 调试截图改存%LOCALAPPDATA%/windowmsgbot/ocr_debug避开源码目录(360); 收紧残留消息fresh gate(600s硬门); 启动即崩溃/请求崩溃时读取easyocr_crash.log写入主日志
4. easyocr_worker.py: 加faulthandler+sys.excepthook全局捕获,崩溃traceback落盘%LOCALAPPDATA%/windowmsgbot/easyocr_crash.log
2026-08-01 21:21:05 +08:00
youpaishidifu 16fdfb0620 EasyOCR修复: 1)worker加顶层异常捕获确保stderr可见 2)竞态保护:stdin写入前检查proc非None 3)增加处理日志 4)超时改30s 2026-08-01 15:58:58 +08:00
youpaishidifu ba0e6e2450 修复3个OCR问题: easyocr子进程ready握手+60s初始化预算, 偏旁过滤改Unicode范围判断, 新旧消息按新鲜特征放行
- easyocr_worker.py: 初始化完成后输出{"ready":true}握手, 父进程不再把3-10s初始化计入10s请求超时
- monitor.py: _ensure_easyocr_subprocess重写 - 60s握手预算(daemon线程+Queue), stderr PIPE捕获崩溃原因, 崩溃/超时改30s冷却自动重试(不再永久broken)
- monitor.py: 删除markdown表格字符key偏旁库, 改U+2E80-U+2FDF码位范围判断, 修复"地图"/"太"等正常汉字被误判为偏旁丢弃
- monitor.py: _looks_fresh_content新鲜特征判断 - 旧时间戳但含疑问词/问句/句尾标点的消息放行, 不再整块丢弃
- 新增test_easyocr_handshake.py: 子进程握手+OCR往返回归测试(实测通过: 28s含初始化, 识别'你好世界测试123')
2026-08-01 13:00:57 +08:00
youpaishidifu ef227eb7b0 修复2个问题: OCR拼接合并 + 微信定位冻结3-5s
问题1: OCR拼接合并 (2处改动)
  - easyocr_worker.py: ' '.join→'\n'.join, 各检测区域用换行而非空格拼接
    避免 '兑换码导入错误时如何处置?游戏专用小筑憩-草一' 式合并
  - _process_ocr_output 尾部新增 _split_merged_ocr_text:
    在中文句尾标点([。?!?])后紧跟CJK处拆分,两侧CJK>=3且非续接语气词
    将合并文本分为多条消息,各自独立参与KB匹配

问题2: 微信 _fresh_window 冻结3-5s (2处改动)
  - _poll: 对wechat跳过 _fresh_window(ControlFromHandle构建Electron UIA树冻结)
    用 win=None 代替
  - _read_messages(wechat): 接收window=None, OCR失败后惰性创建UIA控件
    大多数轮次 OCR 读到消息就直接返回,不碰UIA树
2026-07-29 18:11:29 +08:00
youpaishidifu 7102821127 EasyOCR GPU crash隔离:子进程隔离GPU推理,崩溃只杀子进程不冻电脑;新增easyocr_worker.py常驻worker;主进程降级到Windows OCR 2026-07-28 19:24:33 +08:00