Update modelscope_image_node.py

This commit is contained in:
hujuying
2025-09-08 04:09:32 +08:00
committed by GitHub
parent 76cb9c4b60
commit cbabf20b93
+56 -35
View File
@@ -91,6 +91,7 @@ def tensor_to_base64_url(image_tensor):
print(f"图像转换失败: {e}")
raise Exception(f"图像格式转换失败: {str(e)}")
class ModelScopeImageNode:
def __init__(self):
pass
@@ -106,15 +107,15 @@ class ModelScopeImageNode:
"default": config.get("default_prompt", "A beautiful landscape")
}),
"api_token": ("STRING", {
"default": "",
"placeholder": "请输入您的魔搭API Token",
"default": "***已保存***" if saved_token else "",
"placeholder": "请输入您的魔搭API Token" if not saved_token else "留空使用已保存的Token",
"multiline": False
}),
},
"optional": {
"model": (config.get("image_models", ["Qwen/Qwen-Image"]), {
"default": config.get("default_model", "Qwen/Qwen-Image")
}),
"model": (config.get("image_models", ["Qwen/Qwen-Image"]), {
"default": config.get("default_model", "Qwen/Qwen-Image")
}),
"negative_prompt": ("STRING", {
"multiline": True,
"default": config.get("default_negative_prompt", "")
@@ -157,16 +158,18 @@ class ModelScopeImageNode:
def generate_image(self, prompt, api_token, model="Qwen/Qwen-Image", negative_prompt="", width=512, height=512, seed=-1, steps=30, guidance=7.5):
config = load_config()
if not api_token or api_token.strip() == "":
if not api_token or api_token.strip() == "" or api_token.strip() == "***已保存***":
api_token = load_api_token()
if not api_token or api_token.strip() == "":
raise Exception("请输入有效的API Token或确保已保存token")
saved_token = load_api_token()
if api_token != saved_token:
if api_token != saved_token and api_token.strip() != "***已保存***":
if save_api_token(api_token):
print("✅ API Token已自动保存")
else:
print("⚠️ API Token保存失败,但不影响当前使用")
elif api_token.strip() == "***已保存***":
api_token = saved_token
try:
url = 'https://api-inference.modelscope.cn/v1/images/generations'
payload = {
@@ -269,6 +272,7 @@ class ModelScopeImageNode:
error_tensor = torch.from_numpy(error_np)[None,]
return (error_tensor,)
class ModelScopeImageEditNode:
def __init__(self):
pass
@@ -277,6 +281,11 @@ class ModelScopeImageEditNode:
def INPUT_TYPES(cls):
config = load_config()
saved_token = load_api_token()
# 获取模型列表
edit_models = config.get("image_edit_models", ["Qwen/Qwen-Image-Edit"])
gen_models = config.get("image_models", ["Qwen/Qwen-Image"])
return {
"required": {
"image": ("IMAGE",),
@@ -285,15 +294,23 @@ class ModelScopeImageEditNode:
"default": "修改图片中的内容"
}),
"api_token": ("STRING", {
"default": "",
"placeholder": "请输入您的魔搭API Token",
"default": "***已保存***" if saved_token else "",
"placeholder": "请输入您的魔搭API Token" if not saved_token else "留空使用已保存的Token",
"multiline": False
}),
"image_gen_mode": ("BOOLEAN", {
"default": False,
"label_on": "图生图模式",
"label_off": "图像编辑模式"
}),
},
"optional": {
"model": (config.get("image_edit_models", ["Qwen/Qwen-Image-Edit"]) + config.get("image_models", []), {
"default": "Qwen/Qwen-Image-Edit"
}),
"gen_model": (gen_models, {
"default": gen_models[0] if gen_models else "Qwen/Qwen-Image"
}),
"edit_model": (edit_models, {
"default": edit_models[0] if edit_models else "Qwen/Qwen-Image-Edit"
}),
"negative_prompt": ("STRING", {
"multiline": True,
"default": ""
@@ -327,12 +344,6 @@ class ModelScopeImageEditNode:
"min": -1,
"max": 2147483647
}),
"denoise": ("FLOAT", {
"default": 0.75,
"min": 0.00,
"max": 1.00,
"step": 0.01
}),
}
}
@@ -341,22 +352,33 @@ class ModelScopeImageEditNode:
FUNCTION = "edit_image"
CATEGORY = "ModelScopeAPI"
def edit_image(self, image, prompt, api_token, model="Qwen/Qwen-Image-Edit", negative_prompt="",
width=512, height=512, steps=30, guidance=3.5, seed=-1, denoise=0.75):
def edit_image(self, image, prompt, api_token, image_gen_mode=False, gen_model="Qwen/Qwen-Image",
edit_model="Qwen/Qwen-Image-Edit", negative_prompt="",
width=512, height=512, steps=30, guidance=3.5, seed=-1):
config = load_config()
if not api_token or api_token.strip() == "":
if not api_token or api_token.strip() == "" or api_token.strip() == "***已保存***":
api_token = load_api_token()
if not api_token or api_token.strip() == "":
raise Exception("请输入有效的API Token或确保已保存token")
else:
saved_token = load_api_token()
if api_token != saved_token:
if save_api_token(api_token):
print("✅ API Token已自动保存")
else:
print("⚠️ API Token保存失败,但不影响当前使用")
saved_token = load_api_token()
if api_token != saved_token and api_token.strip() != "***已保存***":
if save_api_token(api_token):
print("✅ API Token已自动保存")
else:
print("⚠️ API Token保存失败,但不影响当前使用")
elif api_token.strip() == "***已保存***":
api_token = saved_token
try:
# 根据开关选择使用的模型
if image_gen_mode:
model = gen_model
mode_name = "图生图"
mode_type = "image_generation"
else:
model = edit_model
mode_name = "图像编辑"
mode_type = "image_edit"
# 将图像转换为临时文件并上传获取URL
temp_img_path = None
image_url = None
@@ -432,10 +454,6 @@ class ModelScopeImageEditNode:
if seed != -1:
payload['seed'] = seed
print(f"🎲 随机种子: {seed}")
if denoise != 0.75:
payload['denoise'] = denoise
print(f"🎚️ 降噪强度: {denoise}")
headers = {
'Authorization': f'Bearer {api_token}',
@@ -443,8 +461,9 @@ class ModelScopeImageEditNode:
'X-ModelScope-Async-Mode': 'true'
}
print(f"🖼️ 开始编辑图片...")
print(f"🖼️ 开始{mode_name}...")
print(f"✏️ 编辑提示: {prompt}")
print(f"🧠 使用模型: {model}")
url = 'https://api-inference.modelscope.cn/v1/images/generations'
submission_response = requests.post(
@@ -520,7 +539,7 @@ class ModelScopeImageEditNode:
except:
pass
print(f"🎉 图片编辑完成!")
print(f"🎉 {mode_name}完成!")
return (image_tensor,)
except Exception as e:
@@ -528,6 +547,8 @@ class ModelScopeImageEditNode:
# 返回原图像作为错误回退
return (image.unsqueeze(0),)
# 节点映射
NODE_CLASS_MAPPINGS = {
"ModelScopeImageNode": ModelScopeImageNode,
"ModelScopeImageEditNode": ModelScopeImageEditNode