feat: complete T-533 incremental generation
This commit is contained in:
+19
-10
@@ -270,6 +270,7 @@ class GenerateTab(QWidget):
|
||||
def _on_generate_cover_toggled(self, checked):
|
||||
previous = bool(appconfig.ai_config(self.config).get("generate_cover", False))
|
||||
if self._save_generate_cover_setting(show_status=True):
|
||||
self.refresh_tasks()
|
||||
return
|
||||
self.generate_cover_checkbox.blockSignals(True)
|
||||
self.generate_cover_checkbox.setChecked(previous)
|
||||
@@ -470,11 +471,17 @@ class GenerateTab(QWidget):
|
||||
generate_cover = bool(self.generate_cover_checkbox.isChecked())
|
||||
tasks = [
|
||||
task for task in self.model.tasks
|
||||
if ai.is_generatable_task(task)
|
||||
if ai.is_generatable_task(task, generate_cover=generate_cover)
|
||||
]
|
||||
if not tasks:
|
||||
self._set_status("当前筛选结果没有待生成或生成失败可重试任务;请先在①导入采集完成旧数据采集")
|
||||
self._set_status(
|
||||
"当前筛选结果没有可生成的缺失内容;请先在①导入采集完成采集,或勾选“生成封面图片(成本较高)”补封面"
|
||||
)
|
||||
return
|
||||
component_totals = ai.generation_component_totals(
|
||||
tasks,
|
||||
generate_cover=generate_cover,
|
||||
)
|
||||
prompt_values = {
|
||||
"title": self.title_prompt_edit.toPlainText(),
|
||||
"cover": self.cover_prompt_edit.toPlainText(),
|
||||
@@ -502,9 +509,10 @@ class GenerateTab(QWidget):
|
||||
self._update_generate_progress(
|
||||
{
|
||||
"total": len(tasks),
|
||||
"title_total": component_totals["title_total"],
|
||||
"title_done": 0,
|
||||
"cover_done": 0,
|
||||
"cover_total": len(tasks) if generate_cover else 0,
|
||||
"cover_total": component_totals["cover_total"] if generate_cover else 0,
|
||||
"generated_done": 0,
|
||||
"failed": 0,
|
||||
"generate_cover": generate_cover,
|
||||
@@ -681,15 +689,16 @@ class GenerateTab(QWidget):
|
||||
|
||||
def _update_generate_progress(self, payload):
|
||||
total = max(0, int(payload.get("total", 0) or 0))
|
||||
title_total = max(0, int(payload.get("title_total", total) or 0))
|
||||
title_done = max(0, int(payload.get("title_done", 0) or 0))
|
||||
cover_done = max(0, int(payload.get("cover_done", 0) or 0))
|
||||
cover_total = self._cover_total_for_progress(payload, total)
|
||||
failed = max(0, int(payload.get("failed", 0) or 0))
|
||||
self.progress_label.setText("进度:" + self._generate_progress_text(payload))
|
||||
self.title_progress_label.setText(f"标题 {title_done}/{total}")
|
||||
self.title_progress_label.setText(f"标题 {title_done}/{title_total}")
|
||||
self.cover_progress_label.setText(f"图片 {cover_done}/{cover_total}")
|
||||
self.failed_progress_label.setText(f"失败 {failed}")
|
||||
self._set_progress_bar(self.title_progress_bar, title_done, total)
|
||||
self._set_progress_bar(self.title_progress_bar, title_done, title_total)
|
||||
self._set_progress_bar(self.cover_progress_bar, cover_done, cover_total)
|
||||
|
||||
def _reset_cmhub_balance_label(self):
|
||||
@@ -736,12 +745,13 @@ class GenerateTab(QWidget):
|
||||
|
||||
def _generate_progress_text(self, payload):
|
||||
total = max(0, int(payload.get("total", 0) or 0))
|
||||
title_total = max(0, int(payload.get("title_total", total) or 0))
|
||||
cover_total = self._cover_total_for_progress(payload, total)
|
||||
return "标题{title}/{total} · 图片{cover}/{cover_total} · 失败{failed}".format(
|
||||
return "标题{title}/{title_total} · 图片{cover}/{cover_total} · 失败{failed}".format(
|
||||
title=payload.get("title_done", 0),
|
||||
cover=payload.get("cover_done", 0),
|
||||
cover_total=cover_total,
|
||||
total=payload.get("total", 0),
|
||||
title_total=title_total,
|
||||
failed=payload.get("failed", 0),
|
||||
)
|
||||
|
||||
@@ -896,7 +906,8 @@ class GenerateTab(QWidget):
|
||||
if selected_status in (None, "all"):
|
||||
return True
|
||||
if selected_status == "to_generate":
|
||||
return ai.is_generatable_task(task) and task.status != "failed"
|
||||
generate_cover = bool(self.generate_cover_checkbox.isChecked())
|
||||
return ai.is_generatable_task(task, generate_cover=generate_cover) and task.status != "failed"
|
||||
if selected_status == "generated":
|
||||
return task.stage == "generated"
|
||||
if selected_status == "applied":
|
||||
@@ -906,5 +917,3 @@ class GenerateTab(QWidget):
|
||||
if selected_status == "skipped":
|
||||
return task.status == "skipped"
|
||||
return True
|
||||
|
||||
|
||||
|
||||
+18
-8
@@ -37,10 +37,16 @@ class GenerateWorker(BaseWorker):
|
||||
if str(account.alias).strip()
|
||||
}
|
||||
self._account_by_alias = account_by_alias
|
||||
ai_cfg = appconfig.ai_config(self.config)
|
||||
generate_cover = bool(ai_cfg.get("generate_cover", False))
|
||||
eligible = [
|
||||
task for task in self.tasks
|
||||
if ai.is_generatable_task(task)
|
||||
if ai.is_generatable_task(task, generate_cover=generate_cover)
|
||||
]
|
||||
component_totals = ai.generation_component_totals(
|
||||
eligible,
|
||||
generate_cover=generate_cover,
|
||||
)
|
||||
self._eligible_total = len(eligible)
|
||||
self._task_positions = {
|
||||
getattr(task, "id", None): index
|
||||
@@ -48,17 +54,18 @@ class GenerateWorker(BaseWorker):
|
||||
}
|
||||
batch_ids = self._batch_ids(eligible)
|
||||
self._run_id = self._create_run_log(eligible, batch_ids)
|
||||
ai_cfg = appconfig.ai_config(self.config)
|
||||
generate_cover = bool(ai_cfg.get("generate_cover", False))
|
||||
if generate_cover:
|
||||
start_message = "[开始] 本轮生成 {total} 条:标题{total},图片{total};标题并发{title_concurrency},图片并发{image_concurrency}".format(
|
||||
start_message = "[开始] 本轮生成 {total} 条:标题{title_total},图片{cover_total};标题并发{title_concurrency},图片并发{image_concurrency}".format(
|
||||
total=len(eligible),
|
||||
title_total=component_totals["title_total"],
|
||||
cover_total=component_totals["cover_total"],
|
||||
title_concurrency=ai_cfg.get("title_concurrency", 1),
|
||||
image_concurrency=ai_cfg.get("image_concurrency", 1),
|
||||
)
|
||||
else:
|
||||
start_message = "[开始] 本轮生成 {total} 条:本轮仅生成标题,不生成图片;标题并发{title_concurrency}".format(
|
||||
start_message = "[开始] 本轮生成 {total} 条:本轮仅生成标题,不生成图片;标题{title_total};标题并发{title_concurrency}".format(
|
||||
total=len(eligible),
|
||||
title_total=component_totals["title_total"],
|
||||
title_concurrency=ai_cfg.get("title_concurrency", 1),
|
||||
)
|
||||
self._log_run_event(start_message)
|
||||
@@ -85,9 +92,10 @@ class GenerateWorker(BaseWorker):
|
||||
"ok": False,
|
||||
"error": error,
|
||||
"total": len(eligible),
|
||||
"title_total": component_totals["title_total"],
|
||||
"title_done": 0,
|
||||
"cover_done": 0,
|
||||
"cover_total": len(eligible) if generate_cover else 0,
|
||||
"cover_total": component_totals["cover_total"] if generate_cover else 0,
|
||||
"generated_done": 0,
|
||||
"failed": len(eligible),
|
||||
"cancelled": self.should_cancel(),
|
||||
@@ -160,6 +168,8 @@ class GenerateWorker(BaseWorker):
|
||||
if phase == "title":
|
||||
if result == "start" and step == "title_submit":
|
||||
return f"[标题] {self._task_progress_label(task)} 开始生成"
|
||||
if result == "skipped":
|
||||
return f"[标题] {self._task_progress_label(task)} 已有标题,跳过生文"
|
||||
if result == "success" and step == "title_done":
|
||||
return f"[标题] {self._task_progress_label(task)} 成功"
|
||||
if result == "success" and step == "db_write":
|
||||
@@ -251,12 +261,13 @@ class GenerateWorker(BaseWorker):
|
||||
return f"[完成] AI 生成完成:{progress}"
|
||||
|
||||
def _summary_text(self, summary):
|
||||
title_total = summary.get("title_total", summary.get("total", 0))
|
||||
cover_total = summary.get("cover_total", summary.get("total", 0))
|
||||
return "标题{title}/{total},图片{cover}/{cover_total},失败{failed}".format(
|
||||
title=summary.get("title_done", 0),
|
||||
cover=summary.get("cover_done", 0),
|
||||
cover_total=cover_total,
|
||||
total=summary.get("total", 0),
|
||||
total=title_total,
|
||||
failed=summary.get("failed", 0),
|
||||
)
|
||||
|
||||
@@ -1994,4 +2005,3 @@ class AIModelTestWorker(BaseWorker):
|
||||
|
||||
def _elapsed_ms(self, started):
|
||||
return _elapsed_ms(started)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user