214 lines
6.5 KiB
Python
214 lines
6.5 KiB
Python
import os
|
|
import random
|
|
import string
|
|
from dashscope import Generation, MultiModalConversation
|
|
import torchvision.transforms as transforms
|
|
|
|
|
|
def generate_random_image_name():
|
|
random_number = "".join(random.choices(string.ascii_letters + string.digits, k=10))
|
|
return f"image_{random_number}.png"
|
|
|
|
|
|
def get_image_url(image):
|
|
image = image.squeeze(0)
|
|
image = image.permute(2, 0, 1)
|
|
image = transforms.ToPILImage()(image)
|
|
|
|
image_name = generate_random_image_name()
|
|
image.save(image_name)
|
|
return image_name
|
|
|
|
|
|
class DashscopeLLMLoader:
|
|
def __init__(self):
|
|
pass
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
return {
|
|
"required": {
|
|
"model_type": (
|
|
["qwen_max", "qwen_plus", "qwen_turbo", "qwen_long"],
|
|
{"default": "qwen_max"},
|
|
),
|
|
"qwen_max": (
|
|
[
|
|
"qwen-max",
|
|
"qwen-max-latest",
|
|
"qwen-max-2024-09-19",
|
|
"qwen-max-2024-04-28",
|
|
"qwen-max-2024-04-03",
|
|
"qwen-max-2024-01-07",
|
|
],
|
|
{"default": "qwen-max-latest"},
|
|
),
|
|
"qwen_plus": (
|
|
[
|
|
"qwen-plus",
|
|
"qwen-plus-latest",
|
|
"qwen-plus-2024-11-27",
|
|
"qwen-plus-2024-11-25",
|
|
"qwen-plus-2024-09-19",
|
|
"qwen-plus-2024-08-06",
|
|
"qwen-plus-2024-07-23",
|
|
"qwen-plus-2024-06-24",
|
|
"qwen-plus-2024-02-06",
|
|
],
|
|
{"default": "qwen-plus-latest"},
|
|
),
|
|
"qwen_turbo": (
|
|
[
|
|
"qwen-turbo",
|
|
"qwen-turbo-latest",
|
|
"qwen-turbo-2024-11-01",
|
|
"qwen-turbo-2024-09-19",
|
|
"qwen-turbo-2024-06-24",
|
|
"qwen-turbo-2024-02-06",
|
|
],
|
|
{"default": "qwen-turbo-latest"},
|
|
),
|
|
"qwen_long": (["qwen_long"], {"default": "qwen_long"}),
|
|
}
|
|
}
|
|
|
|
FUNCTION = "select_model"
|
|
OUTPUT_NODE = True
|
|
RETURN_TYPES = ("STRING",)
|
|
|
|
CATEGORY = "dashscope"
|
|
|
|
def select_model(self, model_type, qwen_max, qwen_plus, qwen_turbo, qwen_long):
|
|
if model_type == "qwen_max":
|
|
model_version = qwen_max
|
|
elif model_type == "qwen_plus":
|
|
model_version = qwen_plus
|
|
elif model_type == "qwen_turbo":
|
|
model_version = qwen_turbo
|
|
elif model_type == "qwen_long":
|
|
model_version = qwen_long
|
|
else:
|
|
raise ValueError(f"Invalid model type: {model_type}")
|
|
|
|
return model_version
|
|
|
|
|
|
class DashscopeVLMLoader:
|
|
def __init__(self):
|
|
pass
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
return {
|
|
"required": {
|
|
"model_type": (
|
|
["qwen-vl-max", "qwen-vl-plus"],
|
|
{"default": "qwen-vl-max"},
|
|
),
|
|
"qwen-vl-max": (
|
|
[
|
|
"qwen-vl-max",
|
|
"qwen-vl-max-latest",
|
|
"qwen-vl-max-2024-11-19",
|
|
"qwen-vl-max-2024-10-30",
|
|
"qwen-vl-max-2024-08-09",
|
|
"qwen-vl-max-2024-02-01",
|
|
],
|
|
{"default": "qwen-vl-max-latest"},
|
|
),
|
|
"qwen-vl-plus": (
|
|
[
|
|
"qwen-vl-plus",
|
|
"qwen-vl-plus-latest",
|
|
"qwen-vl-plus-2024-08-09",
|
|
"qwen-vl-plus-2023-12-01",
|
|
],
|
|
{"default": "qwen-vl-plus-latest"},
|
|
),
|
|
}
|
|
}
|
|
|
|
FUNCTION = "select_model"
|
|
OUTPUT_NODE = True
|
|
RETURN_TYPES = ("STRING",)
|
|
|
|
CATEGORY = "dashscope"
|
|
|
|
def select_model(self, model_type, qwen_vl_max, qwen_vl_plus):
|
|
if model_type == "qwen-vl-max":
|
|
model_version = qwen_vl_max
|
|
elif model_type == "qwen-vl-plus":
|
|
model_version = qwen_vl_plus
|
|
else:
|
|
raise ValueError(f"Invalid model type: {model_type}")
|
|
|
|
return model_version
|
|
|
|
|
|
class DashscopeModelCaller:
|
|
def __init__(self):
|
|
pass
|
|
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
return {
|
|
"required": {
|
|
"model_version": ("STRING", {"default": None}),
|
|
"system_prompt": (
|
|
"STRING",
|
|
{"default": "You are a helpful assistant."},
|
|
),
|
|
"user_prompt": ("STRING", {"default": ""}),
|
|
},
|
|
"optional": {
|
|
"image": ("IMAGE", {"default": None}),
|
|
},
|
|
}
|
|
|
|
FUNCTION = "call_model"
|
|
OUTPUT_NODE = True
|
|
RETURN_TYPES = ("STRING",)
|
|
|
|
CATEGORY = "dashscope"
|
|
|
|
def call_model(self, model_version, system_prompt, user_prompt, image):
|
|
if not model_version:
|
|
raise ValueError("Model version cannot be empty")
|
|
if not system_prompt:
|
|
raise ValueError("System prompt cannot be empty")
|
|
if not user_prompt:
|
|
raise ValueError("User prompt cannot be empty")
|
|
|
|
if image == None:
|
|
messages = [
|
|
{"role": "system", "content": system_prompt},
|
|
{"role": "user", "content": user_prompt},
|
|
]
|
|
response = Generation.call(
|
|
api_key=os.getenv("DASHSCOPE_API_KEY"),
|
|
model=model_version,
|
|
messages=messages,
|
|
result_format="message",
|
|
)
|
|
else:
|
|
image_url = get_image_url(image)
|
|
messages = [
|
|
{"role": "system", "content": system_prompt},
|
|
{
|
|
"role": "user",
|
|
"content": [
|
|
{"image": image_url},
|
|
{"text": user_prompt},
|
|
],
|
|
},
|
|
]
|
|
response = MultiModalConversation.call(
|
|
api_key=os.getenv("DASHSCOPE_API_KEY"),
|
|
model=model_version,
|
|
messages=messages,
|
|
result_format="message",
|
|
)
|
|
|
|
message_content = response["output"]["choices"][0]["message"]["content"]
|
|
return message_content
|