Files
2026-01-16 13:03:53 +08:00

99 lines
3.6 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { app } from "../../scripts/app.js";
// 这里定义的列表必须和 python 代码中的保持一致
// 方案 C: 前端维护一份模型列表映射,实现下拉菜单联动
const PROVIDER_MODELS = {
"openai": [
"gpt-5.1",
"gpt-4o",
"gpt-5-nano",
"gpt-5-mini",
"gpt-5.2"
],
"anthropic": [
"claude-sonnet-4-5",
"claude-haiku-4-5",
"claude-opus-4-5"
],
"google_gemini": [
"gemini-2.5-pro",
"gemini-3-flash-preview",
"gemini-3-pro-preview"
],
"xai": [
"grok-4-1-fast",
"grok-4-1-fast-reasoning-latest",
"grok-4-1-fast-non-reasoning-latest"
],
"deepseek": [
"deepseek-chat",
"deepseek-reasoner"
],
"qwen": [
"qwen-plus",
"qwen3-max",
"qwen-flash"
]
};
app.registerExtension({
name: "My.PromptOptimizer",
async nodeCreated(node, app) {
// 检查是否是我们的节点
if (node.comfyClass === "PromptOptimizer") {
const providerWidget = node.widgets.find(w => w.name === "provider");
const modelWidget = node.widgets.find(w => w.name === "model");
if (providerWidget && modelWidget) {
const originalCallback = providerWidget.callback;
// 定义更新逻辑
const updateModels = (currentValue) => {
const newOptions = PROVIDER_MODELS[currentValue];
if (newOptions && newOptions.length > 0) {
modelWidget.options.values = newOptions;
// 如果当前选中的模型不在新列表里,重置为第一个
if (!newOptions.includes(modelWidget.value)) {
modelWidget.value = newOptions[0];
}
} else {
modelWidget.options.values = ["default-model"];
}
};
// 绑定到 Widget 回调(用户手动切换时触发)
providerWidget.callback = function (value) {
if (originalCallback) {
originalCallback.apply(this, arguments);
}
updateModels(value);
};
// 初始运行时触发一次
updateModels(providerWidget.value);
}
}
},
// 新增:当工作流加载完成、数值被填充后触发
async loadedGraphNode(node, app) {
if (node.comfyClass === "PromptOptimizer") {
const providerWidget = node.widgets.find(w => w.name === "provider");
const modelWidget = node.widgets.find(w => w.name === "model");
if (providerWidget && modelWidget) {
// 再次强制更新列表,确保它匹配加载进来的 provider
const newOptions = PROVIDER_MODELS[providerWidget.value];
if (newOptions) {
modelWidget.options.values = newOptions;
// 注意:加载模式下,尽量保留原有的 modelWidget.value,
// 只有当原值在列表里完全找不到时才重置,避免覆盖用户保存的特定模型
if (!newOptions.includes(modelWidget.value)) {
// 只有当存的值是非法的时候才为了安全重置
// 但通常我们信任存档,不做操作,只更新列表以便用户下次选择
}
}
}
}
}
});