feat: add diagnostic logs for generation flows
This commit is contained in:
+57
@@ -667,3 +667,60 @@
|
||||
- 变更:`app/gui.py` 将⑤设置页的 AI 模型下拉/新增/删除从左侧分栏移到“模型详情”上方,设置页改为单列滚动布局;模型详情、角色与生成参数、路径与端口、Shopee 更新安全表单尽量两项一行,URL/API Key/Chrome 路径等长字段独占整行。
|
||||
- 文档:同步 `docs/routes.md`、`docs/api.md`、`docs/current-state.md` 中的设置页布局描述,并更新 `docs/ui/tab5-settings.svg` UI 草图。
|
||||
- 验证:`python -m compileall app main.py tests` 通过;`python -m unittest discover -s tests -p test_gui.py` 通过(48 tests)。
|
||||
|
||||
## 【2026-06-29】T-206 删除指定批次(设计登记)
|
||||
|
||||
- 状态:TODO(设计登记;硬删除语义仍待用户最终确认,排在 T-404 之后实现)
|
||||
- 问题:①导入采集仅有批次筛选下拉,没有任何删除入口;`db` 有 `delete_account` 但无 `delete_batch`。导错文件 / 测试导入 / 处理完的历史批次都无法清理,批次下拉只增不减,长期必然劣化使用体验。
|
||||
- 数据模型:`tasks.batch_id REFERENCES batches(id)`;每条 task 关联磁盘封面图片 `old_cover_path`(采集下载的旧封面)、`new_cover_path`(AI 生成的新封面),均为本工具产出,硬删后会成为孤儿文件。
|
||||
- 方案(硬删除):
|
||||
- `app/db.py` 新增 `delete_batch(batch_id)`:单事务内先 `DELETE FROM tasks WHERE batch_id=?` 再 `DELETE FROM batches WHERE id=?`;返回 `{"tasks": 删除任务数, "committed": 其中已上线数, "images": 关联封面绝对路径列表}`。
|
||||
- `app/gui.py` ①导入采集页批次筛选旁加「删除批次」按钮:仅选中具体批次时可用,运行中随其他控件一起禁用。
|
||||
- 二次确认弹窗(不可逆动作,符合安全红线):展示批次标签 + 任务数 + 已上线(`committed=1`)任务数,明确提示「删除本地记录不会回滚 Shopee 线上已提交的修改」;提供「同时删除已下载/生成的封面图片」勾选项,默认不勾。
|
||||
- 确认后调用 `db.delete_batch`,按勾选 `os.remove` 清理 images 列表中的孤儿图片(容错,缺失/占用不报错只记日志),刷新①与③的批次下拉和任务列表。
|
||||
- 安全:删除前显式弹窗确认;提示线上修改不可回滚;图片清理默认不开启需用户主动勾选。
|
||||
- 测试计划:`tests/test_db.py` 覆盖 `delete_batch` 删任务+批次、返回计数/图片路径、外键不残留;`tests/test_gui.py` 覆盖未选具体批次时按钮禁用、确认后调用删除并刷新、取消不删除。
|
||||
|
||||
## 【2026-06-29】T-303b ②/③ 商品ID筛选
|
||||
|
||||
- 状态:DONE
|
||||
- 文档:先同步 `docs/routes.md`、`docs/api.md`、`docs/06-tasks.md`,明确 ② AI生成与 ③ 更新shopee 的商品ID输入框按包含匹配 `item_id`,清空表示全部;当前筛选结果约束「开始生成」和「开始更新」范围;③确认弹窗显示商品ID筛选条件。
|
||||
- 实现:`app/gui.py` 在 `GenerateTab` 和 `ApplyTab` 增加商品ID输入框,刷新时与批次/店铺/状态共同过滤;运行中禁用该输入框,避免生成/更新过程中改变作用范围。
|
||||
- 测试:`tests/test_gui.py` 覆盖 ② 商品ID筛选、③ 商品ID筛选,以及③确认弹窗显示商品ID。
|
||||
- 任务顺序:T-206 删除批次仍为设计登记,依赖 T-404,避免抢在真实 Shopee 单条冒烟前执行。
|
||||
- 验证:`python -m compileall app main.py tests` 通过;`python -m unittest discover -s tests -p test_gui.py` 通过(48 tests);`python -m unittest discover -s tests` 通过(112 tests)。
|
||||
|
||||
## 【2026-06-29】文档补充 · 采集失败诊断日志方案
|
||||
|
||||
- 背景:用户本次导入 5 个商品 ID 采集旧标题/旧封面时有 1 条失败;当前实现会把该任务写成 `status=failed` 并保存 `last_error`,但不会写 ① 采集的持久运行日志,也没有本地 traceback,因此无法判断卡在打开商品页、页面就绪、读标题、读封面、下载图片、写库还是 Excel 回写。
|
||||
- 方案:采用两层日志。SQLite `run_logs/run_log_events` 保存业务可读事件(run_type、task_id、alias、item_id、step、简短错误);本地 gitignore 的 `logs/` 保存脱敏 traceback、异常类型、步骤、耗时和必要上下文。
|
||||
- 任务:新增 T-207「① 采集诊断日志(run_logs + 本地 log)」作为下一步可领取任务;新增 T-505「全流程诊断日志扩展」覆盖 ② AI生成、Excel 导入/回写、③ 更新shopee、④ Chrome/登录检测、⑤ AI 模型测试连接。
|
||||
- 安全:日志不得记录 Cookie、密码、API Key、token;结构化 payload 过 `sanitize_for_log()`,自由文本异常按需 `redact_secrets()`。
|
||||
- 文档:同步 `docs/04-architecture.md`、`docs/06-tasks.md`、`docs/api.md`、`docs/routes.md`、`docs/05-coding-rules.md`、`docs/current-state.md`。
|
||||
- 验证:仅文档更新,未运行测试。
|
||||
|
||||
## 【2026-06-29】T-207 ①采集诊断日志(run_logs + 本地 log)
|
||||
|
||||
- 状态:DONE
|
||||
- 文档:`docs/06-tasks.md` 将 T-207 标为 DONE;`docs/04-architecture.md` 更新为 T-207 已接入 ①采集、T-505 待扩展;`docs/current-state.md` 同步当前快照、目录清单、下一步和已知限制。
|
||||
- 实现:新增 `app/diagnostics.py`,写入 gitignore 的 `logs/cmshopee.log`,支持大小滚动、异常类型、traceback、step、task_id/alias/item_id、耗时和 payload;结构化 payload 与自由文本统一脱敏。
|
||||
- 采集链路:`app/editor.py` 为采集流程增加 `on_step` 回调,覆盖 `open_product`、`wait_ready`、`read_title`、`read_cover`、`download_cover`;`CollectWorker` 创建 `run_type=collect` 的 `run_logs`,逐任务写 `run_log_events`,失败时保留最后 step、简短错误并继续后续任务。
|
||||
- UI:①导入采集页新增最近一次采集运行日志视图;采集完成自动回写 Excel 时记录 `excel_write_back` 开始/成功/失败事件。
|
||||
- 安全:DB 运行日志、状态栏错误、本地诊断日志均不记录 Cookie、密码、API Key、token;自由文本中的 `token/password/cookie/authorization/api_key` 形式会写入前脱敏。
|
||||
- 测试:`tests/test_gui.py` 覆盖采集成功/略过写 run log、采集失败写 DB 事件与本地诊断 log、token 脱敏、①日志视图加载最近一次 collect run log。
|
||||
- 验证:`python -m py_compile app\diagnostics.py app\editor.py app\gui.py tests\test_gui.py` 通过;`python -m unittest discover -s tests -p test_gui.py` 通过(50 tests);`python -m compileall app main.py tests` 通过;`python -m unittest discover -s tests` 通过(114 tests);`git diff --check` 通过(仅 LF/CRLF 提示)。
|
||||
- 下一步:按 `docs/current-state.md`,建议领取 T-404(真实 Shopee 单条更新冒烟)。
|
||||
## 【2026-06-29】修复⑤设置测试连接 base URL 返回 HTTP 404
|
||||
|
||||
- 问题:本地文本模型 URL 配置为 OpenAI-compatible base URL(如 `https://api.vectorengine.ai/v1`)时,⑤「测试连接」原样 POST 到 `/v1`,服务端返回 HTTP 404;实际 AI 生成请求也存在同类风险。
|
||||
- 修复:`app/appconfig.py` 新增 `model_request_url()`,当 `url` 是 `/v1`、`/v1beta`、`/api/v1`、`/api/v1beta` 这类 base URL 时,按 `api_type` 自动补 `/chat/completions` 或 `/images/edits`;完整 endpoint 和自定义路径保持不变。
|
||||
- 接入:`appconfig.test_ai_model()` 与 `app/ai.py` 的真实 AI HTTP 调用统一使用解析后的 endpoint。
|
||||
- 文档:更新 `docs/api.md`、`docs/routes.md`、`docs/troubleshooting.md`、`docs/current-state.md`,说明⑤网址可填完整 endpoint 或 OpenAI-compatible base URL,并记录 HTTP 404 排查方法。
|
||||
- 测试:`tests/test_appconfig.py` 覆盖 base URL/full endpoint/custom path 解析和测试连接请求 URL;`tests/test_ai.py` 覆盖标题生成使用 base URL 自动补 endpoint。
|
||||
- 验证:`python -m unittest discover -s tests -p test_appconfig.py` 通过(7 tests);`python -m unittest discover -s tests -p test_ai.py` 通过(7 tests);`python -m compileall app main.py tests` 通过;`python -m unittest discover -s tests` 通过(117 tests);`git diff --check` 通过(仅 LF/CRLF 提示)。
|
||||
## 【2026-06-29】② AI生成图片失败诊断日志补丁
|
||||
|
||||
- 背景:用户实测 ② AI生成已能按商品 ID 和提示词生成标题,但生成图片失败时页面与本地都找不到可定位原因的日志。
|
||||
- 代码:`app/ai.py` 为标题/封面生成增加 `on_step` 与 `on_event/on_error` 回调,覆盖模型加载、请求构建、请求发送、响应解析、图片保存、写库等步骤;失败错误进入任务 `last_error` 前先脱敏。
|
||||
- UI/日志:`GenerateWorker` 创建 `run_type=generate` 的 `run_logs/run_log_events`,② 页面新增「AI生成运行日志」;图片生成异常同时写本地 `logs/cmshopee.log` 脱敏 traceback。
|
||||
- 测试:新增覆盖 GenerateWorker 图片生成失败时 DB 运行日志、本地诊断日志和 token 脱敏,以及 ② 页面加载最近一次 generate 日志。
|
||||
|
||||
Reference in New Issue
Block a user