fix(ocr+bot): image download race, SenseNova context, log path, encoding

Root causes of the screenshot 404 incident:
1. RACE: client uploads image AND sends message concurrently; bot received
   the message before the upload finished writing, so its GET hit a 404
   error page (<100B treated as failure). FIX: _download_image now retries
   3x with 2s backoff.
2. Zhiwei mentioned tesseract/小果 because the failure text never told her
   the pipeline IS SenseNova. FIX: failure messages now name SenseNova
   explicitly and ask for resend.
3. log_xmpp never worked for the bot: sys.path used relative '../..' from
   a symlinked __file__ which resolved to '/' instead of MoFin root. This
   is why the '最近对话' panel never had bot chat data (only cron script
   entries). FIX: absolute path per red line #7. Verified: test message
   now lands in xmpp_messages.jsonl.
4. My PowerShell -replace corrupted the file encoding (UnicodeDecodeError
   crash loop on restart). Restored from git HEAD and re-applied edits with
   the edit tool. Lesson: never use PowerShell string replace on UTF-8
   source files with Chinese content.
5. functional_health: new sense_ocr module (OCR config presence +
   SenseNova API TCP reachability), no token cost.
This commit is contained in:
hmo
2026-07-20 21:42:59 +08:00
parent 60dbb64f92
commit 299ddc1796
5 changed files with 107 additions and 20 deletions
+14
View File
@@ -0,0 +1,14 @@
import sys, os
sys.path.insert(0, '/home/hmo/MoFin/deploy/bot')
sys.path.insert(0, '/home/hmo/MoFin/deploy/bot/../..')
try:
from xmpp_logger import log_xmpp
print('import OK from bot path')
import xmpp_logger
print('xmpp_logger file:', xmpp_logger.__file__)
except Exception as e:
print('import FAIL:', e)
# also check the file exists
p = '/home/hmo/MoFin/xmpp_logger.py'
print('exists:', os.path.exists(p), 'size:', os.path.getsize(p) if os.path.exists(p) else 0)
+8
View File
@@ -0,0 +1,8 @@
import json, urllib.request
payload = json.dumps({"to": "hmo@yoin.fun", "body": "[系统] 消息日志链路自检(请忽略此条)", "type": "chat"}).encode()
req = urllib.request.Request("http://127.0.0.1:5805/", data=payload, headers={"Content-Type": "application/json"})
print(urllib.request.urlopen(req, timeout=5).read().decode())
import time
time.sleep(2)
last = open('/home/hmo/MoFin/gateway/logs/xmpp_messages.jsonl').readlines()[-1]
print('jsonl last:', last[:200])
+17
View File
@@ -0,0 +1,17 @@
import sys
sys.argv = ['test', '--agent', 'zhiwei']
src = open('/home/hmo/MoFin/deploy/bot/xmpp_agent_core.py').read()
cut = src.find('if __name__ ==')
if cut > 0:
src = src[:cut]
ns = {}
exec(compile(src, 'xmpp_agent_core.py', 'exec'), ns)
url = 'https://upload.yoin.fun/upload/d22cef590582300cc5580c722a19280054bf0d6a/aAeuEbcXa1NNmU2b7c0Q0D75H0anzmGiB86SFxla/9a649bdc-eb7c-44b0-93eb-53ce64c446f7.png'
print('is_image_url:', ns['_is_image_url'](url))
img = ns['_download_image'](url)
print('download:', len(img) if img else None, 'bytes')
if img:
ok, text = ns['_ocr_image'](img)
print('ocr ok:', ok)
print('ocr text:', text[:400])