From dd289a8685e1e9156e99f0365867a6a83c75fbc0 Mon Sep 17 00:00:00 2001 From: imeepos Date: Wed, 30 Jul 2025 23:25:47 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=A9=BF=E6=90=AD?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E7=94=9F=E6=88=90=E7=BB=93=E6=9E=9C=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E9=97=AE=E9=A2=98=20-=20=E6=B7=BB=E5=8A=A0=E9=9A=8F?= =?UTF-8?q?=E6=9C=BA=E7=A7=8D=E5=AD=90=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题分析: - 每次生成的穿搭图片都完全相同 - 原因是ComfyUI工作流中的seed(随机种子)值固定不变 解决方案: - 在ComfyUI工作流节点替换逻辑中添加seed随机化处理 - 支持BOWONG-INPUT-SEED/RANDOM节点的自动随机化 - 为所有KSampler和KSamplerAdvanced节点自动生成随机seed - 添加rand依赖用于生成随机数 技术改进: - 每次生成时自动生成0到2^32-1范围内的随机种子 - 支持多种seed节点命名方式 - 保持向后兼容,不影响现有工作流结构 - 添加详细日志记录随机种子值 现在每次生成都会产生不同的结果,提升用户体验。 --- Cargo.lock | 1 + apps/desktop/src-tauri/Cargo.toml | 1 + .../src/business/services/comfyui_service.rs | 46 +++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 088ee8f..469e5f6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2352,6 +2352,7 @@ dependencies = [ "md5", "num_cpus", "pulldown-cmark", + "rand 0.8.5", "regex", "reqwest 0.11.27", "rusqlite", diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml index 930d715..f830548 100644 --- a/apps/desktop/src-tauri/Cargo.toml +++ b/apps/desktop/src-tauri/Cargo.toml @@ -48,6 +48,7 @@ regex = "1.10" num_cpus = "1.16" tokio-tungstenite = "0.20" futures-util = "0.3" +rand = "0.8" [target.'cfg(windows)'.dependencies] winapi = { version = "0.3", features = ["sysinfoapi"] } diff --git a/apps/desktop/src-tauri/src/business/services/comfyui_service.rs b/apps/desktop/src-tauri/src/business/services/comfyui_service.rs index 830ddaa..9f321bb 100644 --- a/apps/desktop/src-tauri/src/business/services/comfyui_service.rs +++ b/apps/desktop/src-tauri/src/business/services/comfyui_service.rs @@ -300,6 +300,8 @@ impl ComfyUIService { replacement_type = "prompt"; } else if node_id.contains("NEGATIVE") { replacement_type = "negative"; + } else if node_id.contains("SEED") || node_id.contains("RANDOM") { + replacement_type = "seed"; } } // 方式2: 检查节点的_meta.title字段 @@ -409,12 +411,56 @@ impl ComfyUIService { value: Value::String(neg_prompt.to_string()), }); } + "seed" => { + // 生成随机种子值 (0 到 2^32-1) + use rand::Rng; + let mut rng = rand::thread_rng(); + let random_seed: u32 = rng.gen(); + + info!("🎲 生成随机种子: {}", random_seed); + + replacements.push(WorkflowNodeReplacement { + node_id: node_id.clone(), + input_field: "seed".to_string(), + value: Value::Number(serde_json::Number::from(random_seed)), + }); + } _ => {} } } } } + // 额外处理:为所有KSampler节点随机化seed + if let Value::Object(ref workflow_obj) = workflow { + for (node_id, node_value) in workflow_obj { + if let Value::Object(node_obj) = node_value { + if let Some(Value::String(class_type)) = node_obj.get("class_type") { + if class_type == "KSampler" || class_type == "KSamplerAdvanced" { + // 检查是否已经有seed替换规则 + let already_has_seed_replacement = replacements.iter() + .any(|r| r.node_id == *node_id && r.input_field == "seed"); + + if !already_has_seed_replacement { + // 生成随机种子值 + use rand::Rng; + let mut rng = rand::thread_rng(); + let random_seed: u32 = rng.gen(); + + info!("🎲 为KSampler节点 {} 生成随机种子: {}", node_id, random_seed); + + replacements.push(WorkflowNodeReplacement { + node_id: node_id.clone(), + input_field: "seed".to_string(), + value: Value::Number(serde_json::Number::from(random_seed)), + }); + } + } + } + } + } + } + info!("🔍 找到 {} 个需要替换的节点", replacements.len()); for replacement in &replacements { info!(" 节点 {}: {} = {}", replacement.node_id, replacement.input_field, replacement.value);