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);