Commit History
Today
-
diagnostics: trace bounded image IO timeouts without request data
xiaolongmrdd9afb9 -
fix: serve newly persisted images from bounded hot caches
xiaolongmr3ab01a7 -
fix: handle disconnected uploads and bound HF image/config reads
xiaolongmr3241f40 -
fix: isolate HF slow-storage image metadata and avatar I/O
xiaolongmr7df78ec -
daochu baode format ziduan qudiao xiangmu ming, daoru jianrong jiu zhi
xiaolongmr导出包的 manifest.json 会随 zip 离开本机(用户分享、网盘备份), format 字段里的项目名不该外泄。前端 LOCAL_HISTORY_FORMAT 与后端 HISTORY_FORMAT 统一换成中性的 image-history-package;导入端 (前端 detectHistoryPackage / isLocalHistoryPackage,后端 manifest 校验)同时接受旧值,已经导出的老包还能正常导回来。3adaf75 -
fix: prevent watchdog CPU spin and reduce navigation polling overhead
xiaolongmr0dc72aa -
修事件循环被持久卷 IO 卡死导致的整站无响应
xiaolongmr线上日志(2026-10-28 02:35 启动那一轮)里 event_loop_wedged 的线程栈 指向的不是 CPU 算不过来,而是事件循环线程自己在做同步文件读: list_user_options -> public_models_for_identity -> _load_locked -> pathlib read_text 这些文件都在 /app/persist(HF 上是 S3 挂载)。那一轮挂载本身在报 Errno 5,同一时间 skills 同步 180 秒失败、清理 214 张过期图片花了 1048 秒。单次读盘秒级,落在事件循环上就是整站 0 字节响应。 改动: - third_party_images 的 options 端点、accounts 的两个查询端点改走 run_in_threadpool,不再占用事件循环。 - third_party_images.json 与 chatgpt_sessions.json 加进程内缓存 (前者按 5 秒 TTL,后者按 mtime+size 校验),命中期只 stat 一次, 不再每次读全文。 - 模型目录刷新不再在全局锁内做网络请求:正在刷新时其他线程等同一个 结果(最多 5 秒),对话路由直接用手上的缓存不等待;上游全挂时退避 30 秒,避免每个请求都重试一整轮;同类型账号最多试 3 个 token, 不再把几十个限流号挨个串行试一遍。 - 日志改写到容器本地盘。持久卷适合存要跨重启保留的数据,不适合逐行 append:每写一条日志就是一次网络往返。 - 过期图片清理改用 os.scandir 单遍扫描并给单轮设 20000 项上限, 扫不完留到下一轮。 全量测试 949 passed / 31 failed,与改动前基线逐条一致。a439c46 -
daoru lishi jilu shi zidong shibie wai ceng mulu
xiaolongmr用户从线上导出的 image-history-20261028-103246.zip 导入时报「包里缺少 manifest.json」。检查发现包本身完好:manifest 里 2 条任务、1 个会话、 2 张图片都在,只是所有条目被套在了 image-history-20261028-103246/ 目录下 (用解压工具重新压缩会多出这一层),而导入端按根目录读 manifest,于是判定 为「不是本系统导出的包」。 改动: - 新增 _history_prefix():根目录找不到 manifest.json 时,识别唯一的单层 目录前缀。只接受正好一层,避免误命中 images/ 内部同名的文件;多层或 多个候选一律不猜,仍走原来的报错。 - 读取 manifest 与遍历图片都改用该前缀,图片相对路径照旧做 zip slip 校验。 验证:带前缀的包直接调用导入,imported=2、images=2、会话 1 条;修正成根 目录结构的包走 HTTP 上传同样 200。相关测试 46 项通过。c4b43c4 -
图片历史记录支持一键导出与导入
xiaolongmr历史记录弹窗新增「导出」「导入」两个按钮,按账号隔离、合并导入。 后端: - ImageTaskService.export_owned_tasks / import_tasks:导出本人全部任务原始数据; 导入时 task_key 按当前身份重算(不信任包里的 owner_id),同 task_id 跳过, 包里未完成的任务标为 error,避免前端一直等一个不存在的轮询,也不重算积分。 - POST /api/image-tasks/export:打包 zip,含 manifest.json、会话结构、任务与 原图(images/ 相对路径与 /images/<rel> 一致)。图片已是压缩格式,用 STORED 存储省 CPU。导出后由后台任务删临时文件。 - POST /api/image-tasks/import:限 8GB 解压上限、逐条校验路径防 zip slip, 图片落到 images_dir(已存在则跳过),并把记录里的图片地址重写到当前部署。 前端: - 会话结构(标题/分组/轮次)只存在浏览器本地,导出时一并上传进包,导入时 写回本地存储,否则导入后标题和分组会丢; - 导入后把会话里的图片地址改成本站相对路径,换部署也能显示; - 按钮带 loading 与结果提示(新增/跳过/图片张数)。 实测:导出 13 条记录 + 5 张图 12.5MB;重复导入返回 skipped=13 imported=0; 坏包与格式不符均返回 400。35a279e
Yesterday
-
微信登录不再被会话残留的死代理毒死
xiaolongmr本地会话每次注入的 HTTP(S)_PROXY 端口都会变,后端进程里可能残留上一次 启动的死端口;httpx 默认 trust_env=True 会盲用它,ConnectError 之后被 统一转成 502「微信登录服务暂时不可用」,排查时没有任何日志可看。 改为直连优先(wx.z-l.top 是公网 HTTPS,直连即可)、失败再退回环境代理 兜底,既绕开死端口,又保留需要代理的极端网络下的可用性。 配套(仅本地、artifacts/ 已 gitignore):本地启动器把后端 env 代理钉到 稳定的 7890,覆盖会话注入的死端口,顺带修好 model_catalog 的 ConnectionError。0402839 -
init
xiaolongmr85270f9