5563b76b by 柴进

增加软件的降级模式,在慢速模式的用量用光后可以回退到极速模式

1 parent 683c07f9
1 { 1 {
2 "api_key": "AIzaSyBRIH8iItqTZXg7d4zAWVNhyit2CZbXWIU", 2 "api_key": "AIzaSyDKfEF-yHbKxGirdHgaGa7jNSzxyWfReus",
3 "saved_prompts": [ 3 "saved_prompts": [
4 "主石换成闪耀的祖母绿", 4 "主石换成闪耀的祖母绿",
5 "主石换成闪耀的钻石", 5 "主石换成闪耀的钻石",
......
...@@ -1470,6 +1470,17 @@ class ImageGeneratorWindow(QMainWindow): ...@@ -1470,6 +1470,17 @@ class ImageGeneratorWindow(QMainWindow):
1470 settings_group = QGroupBox("生成设置") 1470 settings_group = QGroupBox("生成设置")
1471 settings_layout = QVBoxLayout() 1471 settings_layout = QVBoxLayout()
1472 1472
1473 # 生成模式(放在最前面)
1474 settings_layout.addWidget(QLabel("生成模式"))
1475 self.generation_mode = QComboBox()
1476 self.generation_mode.addItems(["极速模式", "慢速模式"])
1477 self.generation_mode.setCurrentIndex(0) # Default to 极速模式
1478 self.generation_mode.currentIndexChanged.connect(self.on_generation_mode_changed)
1479 settings_layout.addWidget(self.generation_mode)
1480
1481 settings_layout.addSpacing(10)
1482
1483 # 宽高比
1473 settings_layout.addWidget(QLabel("宽高比")) 1484 settings_layout.addWidget(QLabel("宽高比"))
1474 self.aspect_ratio = QComboBox() 1485 self.aspect_ratio = QComboBox()
1475 self.aspect_ratio.addItems(["1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9", "21:9"]) 1486 self.aspect_ratio.addItems(["1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9", "21:9"])
...@@ -1477,10 +1488,12 @@ class ImageGeneratorWindow(QMainWindow): ...@@ -1477,10 +1488,12 @@ class ImageGeneratorWindow(QMainWindow):
1477 1488
1478 settings_layout.addSpacing(10) 1489 settings_layout.addSpacing(10)
1479 1490
1491 # 图片尺寸
1480 settings_layout.addWidget(QLabel("图片尺寸")) 1492 settings_layout.addWidget(QLabel("图片尺寸"))
1481 self.image_size = QComboBox() 1493 self.image_size = QComboBox()
1482 self.image_size.addItems(["1K", "2K", "4K"]) 1494 self.image_size.addItems(["1K", "2K", "4K"])
1483 self.image_size.setCurrentIndex(1) # Default to 2K 1495 self.image_size.setCurrentIndex(0) # Default to 1K for 极速模式
1496 self.image_size.currentIndexChanged.connect(self.on_image_size_changed)
1484 settings_layout.addWidget(self.image_size) 1497 settings_layout.addWidget(self.image_size)
1485 1498
1486 settings_layout.addSpacing(10) 1499 settings_layout.addSpacing(10)
...@@ -1764,6 +1777,9 @@ class ImageGeneratorWindow(QMainWindow): ...@@ -1764,6 +1777,9 @@ class ImageGeneratorWindow(QMainWindow):
1764 self.status_label.setText(f"● 已添加 {valid_count} 张参考图片") 1777 self.status_label.setText(f"● 已添加 {valid_count} 张参考图片")
1765 self.status_label.setStyleSheet("QLabel { color: #34C759; }") 1778 self.status_label.setStyleSheet("QLabel { color: #34C759; }")
1766 self.logger.info(f"图片上传完成,有效图片: {valid_count} 张") 1779 self.logger.info(f"图片上传完成,有效图片: {valid_count} 张")
1780
1781 # 检查极速模式下的多图限制
1782 self.check_multi_image_mode_conflict()
1767 else: 1783 else:
1768 self.logger.info("用户取消了图片选择") 1784 self.logger.info("用户取消了图片选择")
1769 1785
...@@ -1793,6 +1809,9 @@ class ImageGeneratorWindow(QMainWindow): ...@@ -1793,6 +1809,9 @@ class ImageGeneratorWindow(QMainWindow):
1793 self.image_count_label.setText(f"已选择 {len(self.uploaded_images)} 张") 1809 self.image_count_label.setText(f"已选择 {len(self.uploaded_images)} 张")
1794 self.status_label.setText(f"● 已通过拖拽添加 {added_count} 张参考图片") 1810 self.status_label.setText(f"● 已通过拖拽添加 {added_count} 张参考图片")
1795 self.status_label.setStyleSheet("QLabel { color: #34C759; }") 1811 self.status_label.setStyleSheet("QLabel { color: #34C759; }")
1812
1813 # 检查极速模式下的多图限制
1814 self.check_multi_image_mode_conflict()
1796 else: 1815 else:
1797 self.logger.warning("没有找到有效的拖拽图片文件") 1816 self.logger.warning("没有找到有效的拖拽图片文件")
1798 QMessageBox.warning(self, "警告", "没有找到有效的图片文件") 1817 QMessageBox.warning(self, "警告", "没有找到有效的图片文件")
...@@ -1835,6 +1854,9 @@ class ImageGeneratorWindow(QMainWindow): ...@@ -1835,6 +1854,9 @@ class ImageGeneratorWindow(QMainWindow):
1835 self.status_label.setText("● 已添加剪贴板图片") 1854 self.status_label.setText("● 已添加剪贴板图片")
1836 self.status_label.setStyleSheet("QLabel { color: #34C759; }") 1855 self.status_label.setStyleSheet("QLabel { color: #34C759; }")
1837 self.logger.info(f"剪贴板图片已成功保存到: {temp_file_path}") 1856 self.logger.info(f"剪贴板图片已成功保存到: {temp_file_path}")
1857
1858 # 检查极速模式下的多图限制
1859 self.check_multi_image_mode_conflict()
1838 else: 1860 else:
1839 self.logger.error("图片保存失败") 1861 self.logger.error("图片保存失败")
1840 QMessageBox.critical(self, "错误", "无法保存剪贴板图片") 1862 QMessageBox.critical(self, "错误", "无法保存剪贴板图片")
...@@ -2088,6 +2110,63 @@ class ImageGeneratorWindow(QMainWindow): ...@@ -2088,6 +2110,63 @@ class ImageGeneratorWindow(QMainWindow):
2088 self.status_label.setText("● 已删除提示词") 2110 self.status_label.setText("● 已删除提示词")
2089 self.status_label.setStyleSheet("QLabel { color: #34C759; }") 2111 self.status_label.setStyleSheet("QLabel { color: #34C759; }")
2090 2112
2113 def get_selected_model(self):
2114 """根据生成模式返回对应的模型名称"""
2115 if self.generation_mode.currentText() == "慢速模式":
2116 return "gemini-3-pro-image-preview"
2117 else:
2118 return "gemini-2.5-flash-image-preview"
2119
2120 def on_generation_mode_changed(self, index):
2121 """生成模式切换时的处理"""
2122 if self.generation_mode.currentText() == "极速模式":
2123 # 极速模式强制使用1K
2124 self.image_size.setCurrentIndex(0) # 1K
2125
2126 def on_image_size_changed(self, index):
2127 """图片尺寸切换时的处理"""
2128 selected_size = self.image_size.currentText()
2129 current_mode = self.generation_mode.currentText()
2130
2131 # 如果选择2K或4K,且当前是极速模式,提示切换
2132 if selected_size in ["2K", "4K"] and current_mode == "极速模式":
2133 reply = QMessageBox.question(
2134 self,
2135 "模式切换确认",
2136 f"{selected_size} 只有慢速模式支持,是否确认切换到慢速模式?",
2137 QMessageBox.Yes | QMessageBox.No,
2138 QMessageBox.No
2139 )
2140 if reply == QMessageBox.Yes:
2141 self.generation_mode.setCurrentIndex(1) # 切换到慢速模式
2142 else:
2143 # 用户拒绝,恢复到1K
2144 self.image_size.setCurrentIndex(0)
2145
2146 def check_multi_image_mode_conflict(self):
2147 """检查极速模式下的多图限制"""
2148 current_mode = self.generation_mode.currentText()
2149 image_count = len(self.uploaded_images)
2150
2151 # 如果是极速模式且有多张图片,提示切换
2152 if current_mode == "极速模式" and image_count > 1:
2153 reply = QMessageBox.question(
2154 self,
2155 "模式切换确认",
2156 f"极速模式只支持单张参考图,您已上传 {image_count} 张图片。\n是否切换到慢速模式以使用多图功能?",
2157 QMessageBox.Yes | QMessageBox.No,
2158 QMessageBox.No
2159 )
2160 if reply == QMessageBox.Yes:
2161 self.generation_mode.setCurrentIndex(1) # 切换到慢速模式
2162 else:
2163 # 用户拒绝,移除多余的图片,只保留第一张
2164 self.uploaded_images = self.uploaded_images[:1]
2165 self.update_image_preview()
2166 self.image_count_label.setText(f"已选择 {len(self.uploaded_images)} 张")
2167 self.status_label.setText("● 已保留第一张参考图片")
2168 self.status_label.setStyleSheet("QLabel { color: #FF9500; }")
2169
2091 def generate_image_async(self): 2170 def generate_image_async(self):
2092 """Submit image generation task to queue""" 2171 """Submit image generation task to queue"""
2093 from task_queue import TaskType 2172 from task_queue import TaskType
...@@ -2108,7 +2187,7 @@ class ImageGeneratorWindow(QMainWindow): ...@@ -2108,7 +2187,7 @@ class ImageGeneratorWindow(QMainWindow):
2108 reference_images=self.uploaded_images.copy(), 2187 reference_images=self.uploaded_images.copy(),
2109 aspect_ratio=self.aspect_ratio.currentText(), 2188 aspect_ratio=self.aspect_ratio.currentText(),
2110 image_size=self.image_size.currentText(), 2189 image_size=self.image_size.currentText(),
2111 model="gemini-3-pro-image-preview", 2190 model=self.get_selected_model(),
2112 user_name=self.authenticated_user, 2191 user_name=self.authenticated_user,
2113 device_name=socket.gethostname() 2192 device_name=socket.gethostname()
2114 ) 2193 )
...@@ -2702,6 +2781,9 @@ class ImageGenerationWorker(QThread): ...@@ -2702,6 +2781,9 @@ class ImageGenerationWorker(QThread):
2702 self.progress.emit("正在生成图片...") 2781 self.progress.emit("正在生成图片...")
2703 2782
2704 # Generation config 2783 # Generation config
2784 # Note: gemini-2.5-flash-image-preview does not support image_size parameter
2785 if "gemini-3-pro-image-preview" in self.model:
2786 # Gemini 3 Pro supports both aspect_ratio and image_size
2705 config = types.GenerateContentConfig( 2787 config = types.GenerateContentConfig(
2706 response_modalities=["IMAGE"], 2788 response_modalities=["IMAGE"],
2707 image_config=types.ImageConfig( 2789 image_config=types.ImageConfig(
...@@ -2709,10 +2791,18 @@ class ImageGenerationWorker(QThread): ...@@ -2709,10 +2791,18 @@ class ImageGenerationWorker(QThread):
2709 image_size=self.image_size 2791 image_size=self.image_size
2710 ) 2792 )
2711 ) 2793 )
2794 else:
2795 # Gemini 2.5 Flash only supports aspect_ratio (fixed 1024px output)
2796 config = types.GenerateContentConfig(
2797 response_modalities=["IMAGE"],
2798 image_config=types.ImageConfig(
2799 aspect_ratio=self.aspect_ratio
2800 )
2801 )
2712 2802
2713 # Generate 2803 # Generate
2714 response = client.models.generate_content( 2804 response = client.models.generate_content(
2715 model="gemini-3-pro-image-preview", 2805 model=self.model,
2716 contents=content_parts, 2806 contents=content_parts,
2717 config=config 2807 config=config
2718 ) 2808 )
...@@ -3211,6 +3301,19 @@ class StyleDesignerTab(QWidget): ...@@ -3211,6 +3301,19 @@ class StyleDesignerTab(QWidget):
3211 settings_group = QGroupBox("生成设置") 3301 settings_group = QGroupBox("生成设置")
3212 settings_layout = QVBoxLayout() 3302 settings_layout = QVBoxLayout()
3213 3303
3304 # 生成模式(放在最前面)
3305 mode_label = QLabel("生成模式")
3306 mode_label.setStyleSheet("QLabel { font-size: 14px; line-height: 18px; }")
3307 settings_layout.addWidget(mode_label)
3308 self.generation_mode = QComboBox()
3309 self.generation_mode.addItems(["极速模式", "慢速模式"])
3310 self.generation_mode.setCurrentIndex(0) # Default to 极速模式
3311 self.generation_mode.currentIndexChanged.connect(self.on_generation_mode_changed)
3312 settings_layout.addWidget(self.generation_mode)
3313
3314 settings_layout.addSpacing(10)
3315
3316 # 宽高比
3214 aspect_label = QLabel("宽高比") 3317 aspect_label = QLabel("宽高比")
3215 aspect_label.setStyleSheet("QLabel { font-size: 14px; line-height: 18px; }") 3318 aspect_label.setStyleSheet("QLabel { font-size: 14px; line-height: 18px; }")
3216 settings_layout.addWidget(aspect_label) 3319 settings_layout.addWidget(aspect_label)
...@@ -3220,12 +3323,14 @@ class StyleDesignerTab(QWidget): ...@@ -3220,12 +3323,14 @@ class StyleDesignerTab(QWidget):
3220 3323
3221 settings_layout.addSpacing(10) 3324 settings_layout.addSpacing(10)
3222 3325
3326 # 图片尺寸
3223 size_label = QLabel("图片尺寸") 3327 size_label = QLabel("图片尺寸")
3224 size_label.setStyleSheet("QLabel { font-size: 14px; line-height: 18px; }") 3328 size_label.setStyleSheet("QLabel { font-size: 14px; line-height: 18px; }")
3225 settings_layout.addWidget(size_label) 3329 settings_layout.addWidget(size_label)
3226 self.image_size = QComboBox() 3330 self.image_size = QComboBox()
3227 self.image_size.addItems(["1K", "2K", "4K"]) 3331 self.image_size.addItems(["1K", "2K", "4K"])
3228 self.image_size.setCurrentIndex(1) 3332 self.image_size.setCurrentIndex(0) # Default to 1K for 极速模式
3333 self.image_size.currentIndexChanged.connect(self.on_image_size_changed)
3229 settings_layout.addWidget(self.image_size) 3334 settings_layout.addWidget(self.image_size)
3230 3335
3231 settings_layout.addSpacing(10) 3336 settings_layout.addSpacing(10)
...@@ -3503,6 +3608,39 @@ class StyleDesignerTab(QWidget): ...@@ -3503,6 +3608,39 @@ class StyleDesignerTab(QWidget):
3503 button.setText("🔒") 3608 button.setText("🔒")
3504 button.setToolTip("字段已锁定") 3609 button.setToolTip("字段已锁定")
3505 3610
3611 def get_selected_model(self):
3612 """根据生成模式返回对应的模型名称"""
3613 if self.generation_mode.currentText() == "慢速模式":
3614 return "gemini-3-pro-image-preview"
3615 else:
3616 return "gemini-2.5-flash-image-preview"
3617
3618 def on_generation_mode_changed(self, index):
3619 """生成模式切换时的处理"""
3620 if self.generation_mode.currentText() == "极速模式":
3621 # 极速模式强制使用1K
3622 self.image_size.setCurrentIndex(0) # 1K
3623
3624 def on_image_size_changed(self, index):
3625 """图片尺寸切换时的处理"""
3626 selected_size = self.image_size.currentText()
3627 current_mode = self.generation_mode.currentText()
3628
3629 # 如果选择2K或4K,且当前是极速模式,提示切换
3630 if selected_size in ["2K", "4K"] and current_mode == "极速模式":
3631 reply = QMessageBox.question(
3632 self,
3633 "模式切换确认",
3634 f"{selected_size} 只有慢速模式支持,是否确认切换到慢速模式?",
3635 QMessageBox.Yes | QMessageBox.No,
3636 QMessageBox.No
3637 )
3638 if reply == QMessageBox.Yes:
3639 self.generation_mode.setCurrentIndex(1) # 切换到慢速模式
3640 else:
3641 # 用户拒绝,恢复到1K
3642 self.image_size.setCurrentIndex(0)
3643
3506 def generate_image(self): 3644 def generate_image(self):
3507 """Submit image generation task to queue""" 3645 """Submit image generation task to queue"""
3508 from task_queue import TaskType 3646 from task_queue import TaskType
...@@ -3516,7 +3654,7 @@ class StyleDesignerTab(QWidget): ...@@ -3516,7 +3654,7 @@ class StyleDesignerTab(QWidget):
3516 # 获取设置 3654 # 获取设置
3517 aspect_ratio = self.aspect_ratio.currentText() 3655 aspect_ratio = self.aspect_ratio.currentText()
3518 image_size = self.image_size.currentText() 3656 image_size = self.image_size.currentText()
3519 model = "gemini-3-pro-image-preview" 3657 model = self.get_selected_model()
3520 3658
3521 # 获取父窗口的 API key 3659 # 获取父窗口的 API key
3522 if not hasattr(self.parent_window, 'api_key') or not self.parent_window.api_key: 3660 if not hasattr(self.parent_window, 'api_key') or not self.parent_window.api_key:
...@@ -3620,7 +3758,7 @@ class StyleDesignerTab(QWidget): ...@@ -3620,7 +3758,7 @@ class StyleDesignerTab(QWidget):
3620 reference_images=[], # 款式设计无参考图 3758 reference_images=[], # 款式设计无参考图
3621 aspect_ratio=self.aspect_ratio.currentText(), 3759 aspect_ratio=self.aspect_ratio.currentText(),
3622 image_size=self.image_size.currentText(), 3760 image_size=self.image_size.currentText(),
3623 model="gemini-3-pro-image-preview" 3761 model=self.get_selected_model()
3624 ) 3762 )
3625 self.logger.info(f"款式设计已添加到历史记录: {timestamp}") 3763 self.logger.info(f"款式设计已添加到历史记录: {timestamp}")
3626 3764
......