fix: set cmhub title read timeout to 600s
This commit is contained in:
@@ -37,6 +37,7 @@ class CMHubError(AIError):
|
||||
|
||||
|
||||
CMHUB_IMAGE_MAX_BYTES = 20 * 1024 * 1024
|
||||
CMHUB_TITLE_READ_TIMEOUT_SECONDS = 600
|
||||
|
||||
_RESOLUTION_SIZES = {
|
||||
"512": (512, 512),
|
||||
@@ -635,7 +636,7 @@ def _gen_title_cmhub(
|
||||
runtime["api_key"],
|
||||
payload=payload,
|
||||
connect_timeout=runtime["connect_timeout"],
|
||||
read_timeout=_cmhub_read_timeout(config, ai_cfg.get("resolution", "1k")),
|
||||
read_timeout=CMHUB_TITLE_READ_TIMEOUT_SECONDS,
|
||||
attempts=attempts,
|
||||
on_retry=lambda attempt, total_attempts, exc: _notify_cmhub_retry(
|
||||
on_step,
|
||||
|
||||
@@ -134,6 +134,7 @@
|
||||
| T-532 | ⑤ cmhub 连接成功提示显示账号名 | T-531, T-527, T-528 | 问题:⑤「测试连接/查余额」或刷新别名成功后,界面只提示 `cmhub 连接成功:...`,用户无法确认当前 API Key 实际属于哪个 cmhub 账号,尤其多账号或换 Key 时容易误判。方案:成功 payload 中若 `/api/v1/balance` 返回可识别账号信息,则在结果 label 和状态栏优先显示 `cmhub 账号「<账号名>」连接成功:生文别名 X 个,生图别名 X 个;余额 Y;别名已拉取,记得点『保存设置』持久化`;当前接口结构按 `{ "user": "cmhub_user", "points_balance": 88, "account": { "username": "cmhub_user", "display_name": "主账号" } }` 兼容,显示名优先取 `account.display_name/name/account_name/username/email/id`,再兜底 `user` 字符串或 `user.name/account_name/username/email/id`、顶层 `display_name/name/username/email/id`;邮箱需要脱敏展示;没有账号字段、仅刷新别名不查余额或接口未返回用户信息时,保留现有 `cmhub 连接成功:...` 文案。不得把 API Key、token、完整邮箱或原始敏感响应写入 GUI、run log、诊断日志;不改变 cmhub HTTP 协议、配置 schema、保存逻辑、AI 生成流程或 Shopee/CDP 流程。同步 GUI 单测覆盖有账号名、当前接口结构、只有邮箱、无账号名四种成功提示 | DONE |
|
||||
| T-533 | ② 增量生成:按缺失组件补生成(先标题后封面分离) | T-303, T-520, T-509 | 现象:先关闭「生成封面图片」只生成了标题(`stage=generated/status=success`、`new_cover_path` 为空),之后勾选封面再点「开始生成」,提示「当前筛选结果没有待生成任务」,无法补生成封面;若改用「重置生成结果」会连标题一起清掉、重生成时白扣一次标题点并覆盖 T-509 手动改的标题。根因:`ai.is_generatable_task` 把 `generated+success` 一律判为不可生成,且 `generate_batch` 对每条 eligible 任务都先重生成标题再生成封面。方案:把「开始生成」改为**按缺失组件增量补齐**——① 判定放宽:`generated+success` 且(封面开关 ON 且 `new_cover_path` 为空)判为可生成(只补封面);② `generate_batch` 组件级跳过:`new_title` 已存在则**跳过标题生成**(复用现有标题,不再调 cmhub 生文、不扣标题点、**不覆盖用户手动标题**),封面开关 ON 且 `new_cover_path` 为空才生成封面;③ 进度计数分组件——`title_total`=缺标题任务数、`cover_total`=(封面开关 ON 时)缺封面任务数,不再用 `len(eligible)` 一刀切;④「没有待生成任务」提示只在**按当前设置真的无缺口**(标题全有 且(封面关 或 封面全有))时出现;⑤ 幂等/点数:全组件齐备的任务不纳入、不重复调用扣点。保持 `set_generated` 写库、run_logs、诊断日志、停止取消未开始项语义不变;不改 cmhub HTTP 协议、DB schema、Excel、Shopee/CDP 流程。单测覆盖:只补封面(跳过标题、标题点不增、手动标题不被覆盖)、混合批(部分缺标题+部分缺封面)、无缺口提示无任务、封面关时标题态任务不纳入 | DONE |
|
||||
| T-534 | ② 重置增强:多选/筛选范围 + 按组件(标题/封面/全部)重置 | T-533, T-404a, T-509 | 现状:②「重置生成结果」只能对单条、且整条全清(`db.reset_generated` 同时清 `new_title` 和 `new_cover_path` 退回 collected)。真实诉求是精准重置——一批标题不满意但封面 OK(只重标题、保封面、不重扣封面点)、或封面差但标题 OK(只重封面、**保留 `new_title` 保护 T-509 手动标题**、不重扣标题点);且需要作用于多条。方案:与 T-533 的组件模型咬合——① 后端 `db.reset_generated` 加组件开关 `reset_title`/`reset_cover`(`delete_file` 仅在重置封面时可选),只清对应字段与 `last_error`,stage 保持 `generated`,由 T-533 泛化后的 `is_generatable_task`(缺任一必需组件即可生成)识别缺口后由「开始生成」只补被清组件;② UI 重置入口给三选项「重置标题 / 重置封面 / 重置全部」;③ 作用域从单条扩到**多选(表格改 `ExtendedSelection`)或当前筛选结果**,与③「作用于当前筛选结果」心智一致;④ 二次确认框显示将重置的标题/封面条数、其中 `committed=1` 条数,并提示「线上已提交、本地重置不回滚 Shopee、重生成后再更新会再次提交线上」+ 重生成会消耗 cmhub 点数;⑤ 运行中禁用;批量写 `run_type=reset` 运行日志,不触碰 Shopee、不回写 Excel。**只重置封面时绝不改 `new_title`**。不改 cmhub HTTP 协议、Excel、Shopee/CDP 流程。单测覆盖:只重标题保留封面、只重封面保留标题(含手动标题不被清)、重置全部、多选/筛选批量、committed 提示、运行中禁用 | DONE |
|
||||
| T-535 | ② cmhub 生成标题读取等待固定 600 秒 | T-526, T-533 | 问题:当前 cmhub 生文请求的读取等待时间复用 `ai.resolution_timeouts`,会跟随当前分辨率变化;默认 `1k=240s`,若上游模型排队或响应较慢,标题生成容易先超时。方案:cmhub `gen_title()` 的 `title_request` 读取等待固定使用 600 秒(等同 4k 上限),不再跟随当前分辨率;连接超时仍使用 `ai.cmhub.connect_timeout`,重试次数仍使用 `ai.retry`。封面生成与图片下载继续按分辨率读取等待,direct 兼容路径保持现状。补 `tests/test_ai.py` 断言标题请求 timeout 为 `(connect_timeout, 600)`,不改配置 schema、cmhub HTTP 协议、DB、Excel、Shopee/CDP 或 GUI 交互 | DONE |
|
||||
|
||||
## Phase 8 · 工程基础设施后续(`docs/engineering-review.md`)
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1245,3 +1245,12 @@
|
||||
- 边界:不改 cmhub HTTP 协议、配置 schema、Excel、Shopee/CDP 流程;默认不删除本地新封面文件,不触碰 Shopee,不自动回写 Excel。
|
||||
- 测试:新增/调整 DB、AI、GUI 单测覆盖只重标题保留封面、只重封面保留手动标题、重置全部、多选/筛选范围、committed 警告、运行中禁用、提交历史下补封面。
|
||||
- 验证:`python -m py_compile app\db.py app\ai.py app\gui\tabs\generate.py tests\test_db.py tests\test_ai.py tests\test_gui.py` 通过;`python -m unittest discover -s tests -p test_db.py` 通过(7 tests);`python -m unittest discover -s tests -p test_ai.py` 通过(24 tests);相关 GUI 用例通过;`python -m compileall app main.py` 通过;`python -m unittest discover -s tests` 通过(212 tests)。
|
||||
|
||||
## 【2026-07-06】T-535 完成 · cmhub 生成标题读取等待固定 600 秒
|
||||
|
||||
- 状态:DONE
|
||||
- 文档:`docs/06-tasks.md` 新增 T-535,`docs/current-state.md` 记录当前 cmhub 生文请求超时口径。
|
||||
- 代码:`app/ai.py` 新增 `CMHUB_TITLE_READ_TIMEOUT_SECONDS = 600`,cmhub `gen_title()` 的 `title_request` 读取等待固定 600 秒;连接超时仍取 `ai.cmhub.connect_timeout`,重试次数仍取 `ai.retry`。
|
||||
- 边界:封面生成和图片下载继续按分辨率读取等待;direct 兼容路径不变;未改配置 schema、cmhub HTTP 协议、DB、Excel、Shopee/CDP 或 GUI 交互。
|
||||
- 测试:`tests/test_ai.py` 更新 cmhub 标题请求 timeout 断言为 `(connect_timeout, 600)`。
|
||||
- 验证:`python -m py_compile app\ai.py tests\test_ai.py` 通过;`python -m unittest discover -s tests -p test_ai.py` 通过(24 tests);`python -m compileall app main.py` 通过;`python -m unittest discover -s tests` 通过(212 tests)。
|
||||
|
||||
+1
-1
@@ -306,7 +306,7 @@ class AITests(TempDirMixin, unittest.TestCase):
|
||||
method, url, kwargs = calls[0]
|
||||
self.assertEqual("POST", method)
|
||||
self.assertEqual("https://cmhub.example.com/api/v1/generate/title", url)
|
||||
self.assertEqual((3, 180), kwargs["timeout"])
|
||||
self.assertEqual((3, 600), kwargs["timeout"])
|
||||
self.assertEqual("Bearer sk-cmhub-secret", kwargs["headers"]["Authorization"])
|
||||
payload = kwargs["json"]
|
||||
self.assertEqual("title-standard", payload["model"])
|
||||
|
||||
Reference in New Issue
Block a user