Add files via upload

This commit is contained in:
hujuying
2025-12-11 08:04:54 +08:00
committed by GitHub
parent 1179926a88
commit 0585f47203
8 changed files with 520 additions and 355 deletions
+39 -11
View File
@@ -8,7 +8,7 @@ from io import BytesIO
import os
import base64
import re
from .modelscope_image_node import load_config, load_api_tokens, save_api_tokens, tensor_to_base64_url
from .modelscope_image_node import load_config, save_config, tensor_to_base64_url
# 检查openai库是否可用
try:
@@ -17,6 +17,26 @@ try:
except ImportError:
OPENAI_AVAILABLE = False
# 仅与modelscope_config.json交互的API Token管理函数
def load_api_tokens():
try:
cfg = load_config()
tokens_from_cfg = cfg.get("api_tokens", [])
if tokens_from_cfg and isinstance(tokens_from_cfg, list):
return [token.strip() for token in tokens_from_cfg if token.strip()]
except Exception as e:
print(f"读取config中的tokens失败: {e}")
return []
def save_api_tokens(tokens):
try:
cfg = load_config()
cfg["api_tokens"] = tokens
return save_config(cfg)
except Exception as e:
print(f"保存tokens到config失败: {e}")
return False
class ModelScopeImageCaptionNode:
def __init__(self):
pass
@@ -40,7 +60,6 @@ class ModelScopeImageCaptionNode:
]
return {
"required": {
"image": ("IMAGE",),
"api_tokens": ("STRING", {
"default": f"***已保存{len(saved_tokens)}个Token***" if saved_tokens else "",
"placeholder": "请输入API Token(支持多个,用逗号/换行分隔)",
@@ -48,6 +67,8 @@ class ModelScopeImageCaptionNode:
}),
},
"optional": {
# 关键修改:将image设置为可选输入
"image": ("IMAGE", {"optional": True}),
"prompt1": ("STRING", {
"multiline": True,
"default": "详细描述这张图片的内容,包括主体、背景、颜色、风格等信息"
@@ -56,9 +77,8 @@ class ModelScopeImageCaptionNode:
"multiline": True,
"default": ""
}),
# 添加模型下拉选择
"model": (supported_models, {
"default": "Qwen/Qwen3-VL-8B-Instruct" # 默认选中原模型
"default": "Qwen/Qwen3-VL-8B-Instruct"
}),
"max_tokens": ("INT", {
"default": 1000,
@@ -87,12 +107,24 @@ class ModelScopeImageCaptionNode:
# 支持多种分隔符拆分Token
tokens = re.split(r'[,;\n]+', token_input)
return [token.strip() for token in tokens if token.strip()]
def create_blank_image(self, width=64, height=64):
"""创建空白图像张量(符合ComfyUI的图像格式要求)"""
# 创建白色背景的RGB图像
blank_np = np.ones((height, width, 3), dtype=np.uint8) * 255
# 转换为ComfyUI格式的张量 (batch, height, width, channels)
blank_tensor = torch.from_numpy(blank_np).unsqueeze(0).float() / 255.0
return blank_tensor
# 调整参数顺序,加入新的prompt2参数
def generate_caption(self, image=None, api_tokens="", prompt1="详细描述这张图片的内容", prompt2="", model="Qwen/Qwen3-VL-8B-Instruct", max_tokens=1000, temperature=0.7):
if not OPENAI_AVAILABLE:
return ("请先安装openai库: pip install openai",)
# 关键修改:处理输入图像为空的情况
if image is None:
print("⚠️ 未输入图像,自动生成空白图像作为输入")
image = self.create_blank_image()
# 处理提示词合并
prompt_parts = []
if prompt1.strip():
@@ -100,13 +132,12 @@ class ModelScopeImageCaptionNode:
if prompt2.strip():
prompt_parts.append(prompt2.strip())
# 如果两个提示词都为空,使用默认提示
if not prompt_parts:
prompt = "详细描述这张图片的内容,包括主体、背景、颜色、风格等信息"
else:
prompt = ", ".join(prompt_parts)
# 解析Token列表(支持多个)
# 解析Token列表
tokens = self.parse_api_tokens(api_tokens)
if not tokens:
raise Exception("请提供至少一个有效的API Token")
@@ -122,7 +153,7 @@ class ModelScopeImageCaptionNode:
try:
print(f"🔍 开始生成图像描述...")
print(f"📝 提示词: {prompt}")
print(f"🤖 模型: {model}") # 显示选中的模型
print(f"🤖 模型: {model}")
print(f"🔑 可用Token数量: {len(tokens)}")
# 转换图像为base64格式
@@ -149,13 +180,11 @@ class ModelScopeImageCaptionNode:
try:
print(f"🔄 尝试使用第 {i+1}/{len(tokens)} 个Token...")
# 初始化OpenAI客户端
client = OpenAI(
base_url='https://api-inference.modelscope.cn/v1',
api_key=token
)
# 调用API(使用选中的模型)
response = client.chat.completions.create(
model=model,
messages=messages,
@@ -164,7 +193,6 @@ class ModelScopeImageCaptionNode:
stream=False
)
# 成功获取结果
description = response.choices[0].message.content
print(f"✅ 第 {i+1} 个Token调用成功!")
print(f"📄 结果预览: {description[:100]}...")