T-576 增加生成和更新内容模式

This commit is contained in:
chengma
2026-07-09 17:44:03 +08:00
parent 9827c8c6d8
commit ab87be8223
17 changed files with 679 additions and 183 deletions
+54 -10
View File
@@ -14,6 +14,24 @@ _USER_LOG_PATH_RE = re.compile(
)
def _generation_mode_label(mode):
mode = appconfig.normalize_generate_mode(mode)
return {
"title": "只生成标题",
"cover": "只生成封面",
"title_cover": "生成标题和封面",
}.get(mode, "只生成标题")
def _update_mode_label(mode):
mode = appconfig.normalize_update_mode(mode)
return {
"title": "只更新标题",
"cover": "只更新封面",
"title_cover": "更新标题和封面",
}.get(mode, "只更新标题")
class GenerateWorker(BaseWorker):
"""Generate titles and covers for eligible collected or failed generation tasks."""
@@ -53,14 +71,15 @@ class GenerateWorker(BaseWorker):
}
self._account_by_alias = account_by_alias
ai_cfg = appconfig.ai_config(self.config)
generate_cover = bool(ai_cfg.get("generate_cover", False))
generate_mode = appconfig.ai_generate_mode(self.config)
generate_cover = appconfig.generate_mode_includes_cover(generate_mode)
eligible = [
task for task in self.tasks
if ai.is_generatable_task(task, generate_cover=generate_cover)
if ai.is_generatable_task(task, generate_mode=generate_mode)
]
component_totals = ai.generation_component_totals(
eligible,
generate_cover=generate_cover,
generate_mode=generate_mode,
)
self._eligible_total = len(eligible)
self._task_positions = {
@@ -69,11 +88,13 @@ class GenerateWorker(BaseWorker):
}
batch_ids = self._batch_ids(eligible)
self._run_id = self._create_run_log(eligible, batch_ids)
mode_text = _generation_mode_label(generate_mode)
if generate_cover:
if appconfig.ai_backend(self.config) == "cmhub":
concurrency = ai.cmhub_image_concurrency_plan(ai_cfg)
start_message = "[开始] 本轮生成 {total} 条:标题{title_total},图片{cover_total};标题并发{title_concurrency},图片并发{image_concurrency},cmhub实际生图并发{request_concurrency},下载并发{download_concurrency};开始时间 {started_at}".format(
start_message = "[开始] 本轮生成 {total} 条:本轮生成内容:{mode_text};标题{title_total},图片{cover_total};标题并发{title_concurrency},图片并发{image_concurrency},cmhub实际生图并发{request_concurrency},下载并发{download_concurrency};开始时间 {started_at}".format(
total=len(eligible),
mode_text=mode_text,
title_total=component_totals["title_total"],
cover_total=component_totals["cover_total"],
title_concurrency=ai_cfg.get("title_concurrency", 1),
@@ -83,8 +104,9 @@ class GenerateWorker(BaseWorker):
started_at=self._run_started_at_text,
)
else:
start_message = "[开始] 本轮生成 {total} 条:标题{title_total},图片{cover_total};标题并发{title_concurrency},图片并发{image_concurrency};开始时间 {started_at}".format(
start_message = "[开始] 本轮生成 {total} 条:本轮生成内容:{mode_text};标题{title_total},图片{cover_total};标题并发{title_concurrency},图片并发{image_concurrency};开始时间 {started_at}".format(
total=len(eligible),
mode_text=mode_text,
title_total=component_totals["title_total"],
cover_total=component_totals["cover_total"],
title_concurrency=ai_cfg.get("title_concurrency", 1),
@@ -92,8 +114,9 @@ class GenerateWorker(BaseWorker):
started_at=self._run_started_at_text,
)
else:
start_message = "[开始] 本轮生成 {total} 条:本轮仅生成标题,不生成图片;标题{title_total};标题并发{title_concurrency};开始时间 {started_at}".format(
start_message = "[开始] 本轮生成 {total} 条:本轮生成内容:{mode_text};标题{title_total};标题并发{title_concurrency};开始时间 {started_at}".format(
total=len(eligible),
mode_text=mode_text,
title_total=component_totals["title_total"],
title_concurrency=ai_cfg.get("title_concurrency", 1),
started_at=self._run_started_at_text,
@@ -112,6 +135,7 @@ class GenerateWorker(BaseWorker):
"on_event": self._on_generation_event,
"on_error": self._on_generation_error,
"generate_cover": generate_cover,
"generate_mode": generate_mode,
},
on_progress=self._emit_generate_progress,
should_stop=self._should_stop_generation,
@@ -130,6 +154,7 @@ class GenerateWorker(BaseWorker):
"failed": len(eligible),
"cancelled": self.should_cancel(),
"generate_cover": generate_cover,
"generate_mode": generate_mode,
}
user_error = self._user_log_detail(error) or "未知错误"
self._log_run_event(
@@ -550,6 +575,7 @@ class ApplyWorker(BaseWorker):
preflight=True,
close_success_tab=False,
dry_run=False,
update_mode=None,
parallel_accounts=False,
max_parallel_accounts=1,
batch_size=None,
@@ -562,6 +588,10 @@ class ApplyWorker(BaseWorker):
self.preflight = preflight
self.close_success_tab = close_success_tab
self.dry_run = bool(dry_run)
self.update_mode = appconfig.normalize_update_mode(
update_mode,
allow_cover_update=appconfig.shopee_update_config(config).get("allow_cover_update", False),
)
self.parallel_accounts = bool(parallel_accounts)
self.max_parallel_accounts = max(1, int(max_parallel_accounts or 1))
self.batch_size = None if batch_size is None else max(1, int(batch_size or 1))
@@ -595,8 +625,9 @@ class ApplyWorker(BaseWorker):
}
self._run_id = self._create_run_log(eligible, batch_ids)
self._log_run_event(
"step=start result=start detail=运行开始:{mode},任务{total},每批最多{batch_size},批次{batch_count},{parallel}".format(
"step=start result=start detail=运行开始:{mode},更新内容{update_mode},任务{total},每批最多{batch_size},批次{batch_count},{parallel}".format(
mode="检查本轮更新" if self.dry_run else "真实更新",
update_mode=_update_mode_label(self.update_mode),
total=total,
batch_size=batch_size,
batch_count=len(batches),
@@ -662,7 +693,16 @@ class ApplyWorker(BaseWorker):
return (
getattr(task, "stage", None) == "generated"
and getattr(task, "status", None) in {"success", "pending", "failed"}
and bool(getattr(task, "new_title", None) or getattr(task, "new_cover_path", None))
and (
(
appconfig.update_mode_includes_title(self.update_mode)
and bool(getattr(task, "new_title", None))
)
or (
appconfig.update_mode_includes_cover(self.update_mode)
and bool(getattr(task, "new_cover_path", None))
)
)
)
def _preflight_block(self, eligible, account_rows, account_by_alias):
@@ -823,9 +863,9 @@ class ApplyWorker(BaseWorker):
)
return "skipped"
action_parts = []
if getattr(task, "new_title", None):
if appconfig.update_mode_includes_title(self.update_mode) and getattr(task, "new_title", None):
action_parts.append("标题")
if getattr(task, "new_cover_path", None):
if appconfig.update_mode_includes_cover(self.update_mode) and getattr(task, "new_cover_path", None):
action_parts.append("封面")
action_text = "+".join(action_parts) or "无变更"
self._log_run_event(
@@ -899,6 +939,7 @@ class ApplyWorker(BaseWorker):
close_success_tab=self.close_success_tab,
on_step=on_step,
bring_to_front=bring_to_front,
update_mode=self.update_mode,
)
committed = bool(result.get("committed")) and not result.get("error")
error = result.get("error")
@@ -1027,6 +1068,7 @@ class ApplyWorker(BaseWorker):
"dry_run": self.dry_run,
"batch_size": self._current_batch_size,
"batch_count": self._batch_count,
"update_mode": self.update_mode,
}
)
@@ -1064,6 +1106,7 @@ class ApplyWorker(BaseWorker):
"parallel_accounts": self.parallel_accounts,
"batch_size": self._current_batch_size,
"batch_count": self._batch_count,
"update_mode": self.update_mode,
"run_id": self._run_id,
}
if blocked:
@@ -1086,6 +1129,7 @@ class ApplyWorker(BaseWorker):
"max_parallel_accounts": self.max_parallel_accounts,
"batch_size": self._current_batch_size,
"batch_count": self._batch_count,
"update_mode": self.update_mode,
},
path=self.db_path,
)