Add files via upload
This commit is contained in:
@@ -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]}...")
|
||||
|
||||
Reference in New Issue
Block a user