fix: 修复穿搭图片生成结果重复问题 - 添加随机种子支持

问题分析:
- 每次生成的穿搭图片都完全相同
- 原因是ComfyUI工作流中的seed(随机种子)值固定不变

解决方案:
- 在ComfyUI工作流节点替换逻辑中添加seed随机化处理
- 支持BOWONG-INPUT-SEED/RANDOM节点的自动随机化
- 为所有KSampler和KSamplerAdvanced节点自动生成随机seed
- 添加rand依赖用于生成随机数

技术改进:
- 每次生成时自动生成0到2^32-1范围内的随机种子
- 支持多种seed节点命名方式
- 保持向后兼容,不影响现有工作流结构
- 添加详细日志记录随机种子值

现在每次生成都会产生不同的结果,提升用户体验。
This commit is contained in:
imeepos 2025-07-30 23:25:47 +08:00
parent a477999445
commit dd289a8685
3 changed files with 48 additions and 0 deletions

1
Cargo.lock generated
View File

@ -2352,6 +2352,7 @@ dependencies = [
"md5",
"num_cpus",
"pulldown-cmark",
"rand 0.8.5",
"regex",
"reqwest 0.11.27",
"rusqlite",

View File

@ -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"] }

View File

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