99 lines
3.6 KiB
JavaScript
99 lines
3.6 KiB
JavaScript
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)) {
|
||
// 只有当存的值是非法的时候才为了安全重置
|
||
// 但通常我们信任存档,不做操作,只更新列表以便用户下次选择
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
});
|