feat(product-suite): add cmhub vision AI writing

This commit is contained in:
chengma
2026-07-17 09:09:09 +08:00
parent 56d6b59a00
commit 40a9f5fbf2
15 changed files with 575 additions and 40 deletions
+55 -5
View File
@@ -88,6 +88,8 @@ class SettingsTab(QWidget):
self.cmhub_title_alias_combo.setObjectName("cmhubTitleAliasCombo")
self.cmhub_image_alias_combo = QComboBox()
self.cmhub_image_alias_combo.setObjectName("cmhubImageAliasCombo")
self.cmhub_vision_alias_combo = QComboBox()
self.cmhub_vision_alias_combo.setObjectName("cmhubVisionAliasCombo")
self.cmhub_connect_timeout_spin = QSpinBox()
self.cmhub_connect_timeout_spin.setObjectName("cmhubConnectTimeoutSpin")
self.cmhub_connect_timeout_spin.setRange(1, 3600)
@@ -304,6 +306,7 @@ class SettingsTab(QWidget):
("连接超时(秒)", self.cmhub_connect_timeout_spin),
("生文别名", self.cmhub_title_alias_combo),
("生图别名", self.cmhub_image_alias_combo),
("图片理解别名", self.cmhub_vision_alias_combo),
("", self.cmhub_check_balance_checkbox),
]
)
@@ -480,6 +483,7 @@ class SettingsTab(QWidget):
self.backend_combo,
self.cmhub_title_alias_combo,
self.cmhub_image_alias_combo,
self.cmhub_vision_alias_combo,
self.category_combo,
self.api_type_combo,
self.default_text_model_combo,
@@ -814,6 +818,7 @@ class SettingsTab(QWidget):
"base_url": appconfig.normalize_cmhub_base_url(self.cmhub_base_url_edit.text()),
"title_alias": self.cmhub_title_alias_combo.currentData() or "",
"image_alias": self.cmhub_image_alias_combo.currentData() or "",
"vision_alias": self.cmhub_vision_alias_combo.currentData() or "",
"connect_timeout": self.cmhub_connect_timeout_spin.value(),
"check_balance_before_batch": self.cmhub_check_balance_checkbox.isChecked(),
}
@@ -866,6 +871,7 @@ class SettingsTab(QWidget):
self.cmhub_models,
title_selected=cmhub_cfg.get("title_alias", ""),
image_selected=cmhub_cfg.get("image_alias", ""),
vision_selected=cmhub_cfg.get("vision_alias", ""),
)
self._set_combo_by_data(
self.default_text_model_combo,
@@ -1127,6 +1133,7 @@ class SettingsTab(QWidget):
self.cmhub_api_key_edit,
self.cmhub_title_alias_combo,
self.cmhub_image_alias_combo,
self.cmhub_vision_alias_combo,
self.cmhub_connect_timeout_spin,
self.cmhub_check_balance_checkbox,
self.cmhub_refresh_button,
@@ -1149,17 +1156,27 @@ class SettingsTab(QWidget):
current_cfg = appconfig.cmhub_config(self.config)
title_selected = self.cmhub_title_alias_combo.currentData() or current_cfg.get("title_alias", "")
image_selected = self.cmhub_image_alias_combo.currentData() or current_cfg.get("image_alias", "")
vision_selected = self.cmhub_vision_alias_combo.currentData() or current_cfg.get("vision_alias", "")
self._populate_cmhub_alias_combos(
models,
title_selected=title_selected,
image_selected=image_selected,
vision_selected=vision_selected,
)
title_count = self._cmhub_alias_count("title")
image_count = self._cmhub_alias_count("image")
vision_aliases = {
str(model.get("alias") or "").strip()
for model in self._cmhub_priced_models(models, "vision")
}
vision_count = len(vision_aliases)
balance = payload.get("points_balance")
balance_text = f";余额 {balance}" if balance is not None else ""
subject = self._cmhub_success_subject(payload)
message = f"{subject}:生文别名 {title_count} 个,生图别名 {image_count} 个{balance_text};别名已拉取,记得点『保存设置』持久化"
vision_text = f"图片理解别名 {vision_count} 个"
if vision_selected and vision_selected not in vision_aliases:
vision_text += "(当前已保存值暂不可用)"
message = f"{subject}:生文别名 {title_count} 个,生图别名 {image_count} 个,{vision_text}{balance_text};别名已拉取,记得点『保存设置』持久化"
self.cmhub_result_label.setText(message)
self._set_status(message)
@@ -1224,10 +1241,21 @@ class SettingsTab(QWidget):
self.cmhub_result_label.setText(message)
self._set_status(message)
def _populate_cmhub_alias_combos(self, models, title_selected="", image_selected=""):
def _populate_cmhub_alias_combos(
self,
models,
title_selected="",
image_selected="",
vision_selected="",
):
if self._suspend_dirty <= 0:
with self._dirty_tracking_suspended():
self._populate_cmhub_alias_combos(models, title_selected, image_selected)
self._populate_cmhub_alias_combos(
models,
title_selected,
image_selected,
vision_selected,
)
return
self._populate_cmhub_alias_combo(
self.cmhub_title_alias_combo,
@@ -1241,6 +1269,12 @@ class SettingsTab(QWidget):
"image",
image_selected,
)
self._populate_cmhub_alias_combo(
self.cmhub_vision_alias_combo,
models,
"vision",
vision_selected,
)
def _populate_cmhub_alias_combo(self, combo, models, operation, selected):
combo.blockSignals(True)
@@ -1270,12 +1304,28 @@ class SettingsTab(QWidget):
alias = str(model.get("alias") or "").strip()
op = str(model.get("operation_type") or "").lower()
pricing_status = str(model.get("pricing_status") or "").lower()
if alias and op == operation and pricing_status != "unpriced":
requires_image = bool(model.get("requires_image"))
if (
alias
and op == operation
and pricing_status != "unpriced"
and (
operation != "vision"
or (pricing_status == "priced" and requires_image)
)
):
items.append(model)
return items
def _cmhub_alias_count(self, operation):
combo = self.cmhub_title_alias_combo if operation == "title" else self.cmhub_image_alias_combo
combos = {
"title": self.cmhub_title_alias_combo,
"image": self.cmhub_image_alias_combo,
"vision": self.cmhub_vision_alias_combo,
}
combo = combos.get(operation)
if combo is None:
return 0
return sum(1 for index in range(combo.count()) if combo.itemData(index))
def _show_error(self, error):