feat: 新增启动欢迎通知、流式预览节点及多项功能更新

- 新增启动弹窗通知(绿色主题,支持关闭)
- 新增 StreamPreview 流式文本预览节点
- 新增 fileUpload、updateNotifier 前端 JS 模块
- 重构多个 client,统一错误处理
- 删除废弃节点 batch_nano_banana_v2、quan_neng_sheng_tu 等
- 将 .config 纳入版本控制(已清空密钥)
This commit is contained in:
Jony
2026-04-13 00:49:51 +08:00
parent bbc5f4a2c4
commit 92bcf65d14
28 changed files with 1381 additions and 3518 deletions
+8 -73
View File
@@ -236,18 +236,6 @@ class BatchNanoBananaPro:
"分辨率": (all_resolutions, {
"default": "2K"
}),
"像素缩放": ("BOOLEAN", {
"default": False,
"label_on": "打开",
"label_off": "关闭"
}),
"分辨率像素": ("FLOAT", {
"default": 1.0,
"min": 0.1,
"max": 100.0,
"step": 0.1,
"display": "number"
}),
"谷歌搜索(联网)": (["关闭", "打开"], {
"default": "关闭"
}),
@@ -298,11 +286,6 @@ class BatchNanoBananaPro:
"保存路径": ("STRING", {
"default": "",
"multiline": False
}),
"跳过错误": ("BOOLEAN", {
"default": False,
"label_on": "打开",
"label_off": "关闭"
})
},
"optional": optional_inputs
@@ -324,8 +307,6 @@ class BatchNanoBananaPro:
folder2: Optional[str],
folder3: Optional[str],
folder4: Optional[str],
enable_scaling: bool,
target_megapixels: float,
folder5: Optional[str] = None,
folder6: Optional[str] = None,
folder7: Optional[str] = None,
@@ -334,48 +315,25 @@ class BatchNanoBananaPro:
) -> List[List[ImageInfo]]:
"""
加载所有文件夹中的图片
Args:
folder1-9: 文件夹路径
enable_scaling: 是否启用像素缩放
target_megapixels: 目标像素数(百万像素)
Returns:
图片列表的列表
"""
folders = [folder1, folder2, folder3, folder4, folder5, folder6, folder7, folder8, folder9]
all_images = []
for i, folder in enumerate(folders, 1):
if folder and folder.strip():
try:
images = load_images_from_folder(folder)
if images:
# 应用像素缩放
if enable_scaling:
scaled_images = []
for img_info in images:
scaled_img = self.resize_to_megapixels(
img_info.image,
target_megapixels
)
# 创建新的 ImageInfo,保留其他元数据
scaled_info = ImageInfo(
image=scaled_img,
filename=img_info.filename,
extension=img_info.extension,
source_path=img_info.source_path
)
scaled_images.append(scaled_info)
images = scaled_images
all_images.append(images)
else:
# 空文件夹,静默跳过
pass
except ValueError as e:
print(f"BatchNanoBananaPro: 文件夹{i} 加载失败 - {e}")
return all_images
def _create_pairs(
@@ -596,8 +554,7 @@ class BatchNanoBananaPro:
total_tasks = len(pairs)
# 保持并发数为10不变(按用户要求)
max_concurrent = 10
max_concurrent = 50
# 分批保存的批次大小(与并发数一致)
save_batch_size = 10
@@ -627,7 +584,7 @@ class BatchNanoBananaPro:
if num_batches > 1:
print(f"BatchNanoBananaPro: 任务数 {total_tasks} 超过并发上限 {max_concurrent},将分 {num_batches} 批执行")
connector = aiohttp.TCPConnector(limit=0, limit_per_host=0)
connector = aiohttp.TCPConnector(ssl=False, limit=0, limit_per_host=0)
async with aiohttp.ClientSession(connector=connector) as session:
# 分批处理:每批最多10个任务
@@ -761,14 +718,11 @@ class BatchNanoBananaPro:
文件夹7: str,
文件夹8: str,
文件夹9: str,
像素缩放: bool,
分辨率像素: float,
seed: int,
图片配对模式: str,
模型: str,
宽高比: str,
分辨率: str,
跳过错误: bool = False,
保存路径: str = "",
**kwargs
) -> Tuple[torch.Tensor]:
@@ -778,8 +732,6 @@ class BatchNanoBananaPro:
Args:
prompt: 提示词
文件夹1-9: 图片文件夹路径
像素缩放: 是否启用像素缩放
分辨率像素: 目标像素数(百万像素)
seed: 随机种子
保存路径: 输出保存路径
图片配对模式: 1:1 或 1*N
@@ -840,7 +792,6 @@ class BatchNanoBananaPro:
print("BatchNanoBananaPro: 开始加载图片...")
image_lists = self._load_folders(
文件夹1, 文件夹2, 文件夹3, 文件夹4,
像素缩放, 分辨率像素,
文件夹5, 文件夹6, 文件夹7, 文件夹8, 文件夹9
)
@@ -856,10 +807,6 @@ class BatchNanoBananaPro:
if key in kwargs and kwargs[key] is not None:
pil_images = tensor_to_pil(kwargs[key])
for j, img in enumerate(pil_images):
# 如果启用像素缩放,也对参考图进行缩放
if 像素缩放:
img = self.resize_to_megapixels(img, 分辨率像素)
manual_images.append(
ImageInfo(
image=img,
@@ -976,9 +923,9 @@ class BatchNanoBananaPro:
with ThreadPoolExecutor(max_workers=1) as executor:
future = executor.submit(run_async_in_thread)
try:
results = future.result(timeout=3600) # 1小时超时
results = future.result(timeout=900) # 900秒超时
except TimeoutError:
print("BatchNanoBananaPro: 任务执行超时(1小时")
print("BatchNanoBananaPro: 任务执行超时(900秒")
raise RuntimeError("任务执行超时,请减少任务数量或检查网络连接")
except Exception as e:
# 即使失败,也尝试返回部分结果
@@ -1078,24 +1025,12 @@ class BatchNanoBananaPro:
if str(e) == "未授权!":
print("请联系作者授权后方可使用!")
raise ValueError("未授权!") from None
if 跳过错误:
print("BatchNanoBananaPro: ⚠️ 跳过错误已开启,返回占位图继续执行队列")
placeholder = Image.new('RGB', (512, 512), color=(128, 128, 128))
return (pil_to_tensor([placeholder]),)
raise ValueError(str(e)) from None
except RuntimeError as e:
if 跳过错误:
print("BatchNanoBananaPro: ⚠️ 跳过错误已开启,返回占位图继续执行队列")
placeholder = Image.new('RGB', (512, 512), color=(128, 128, 128))
return (pil_to_tensor([placeholder]),)
raise RuntimeError(str(e)) from None
except Exception as e:
if 跳过错误:
print("BatchNanoBananaPro: ⚠️ 跳过错误已开启,返回占位图继续执行队列")
placeholder = Image.new('RGB', (512, 512), color=(128, 128, 128))
return (pil_to_tensor([placeholder]),)
raise type(e)(str(e)) from None
finally: