159 lines
5.2 KiB
JavaScript
159 lines
5.2 KiB
JavaScript
import {
|
|
getOllamaModels,
|
|
getLMStudioModels,
|
|
updatePromptModelList,
|
|
} from "./gtUIUtils.js";
|
|
import { commentWidget } from "./utils.js";
|
|
|
|
export function setupConfigurationNodes(nodeType, nodeData, app) {
|
|
if (
|
|
nodeData.name.includes("Griptape Agent Config") ||
|
|
nodeData.name.includes("Griptape Util: Remove Ollama Model") ||
|
|
nodeData.name.includes("Griptape Util: Create Agent Modelfile") ||
|
|
nodeData.name.includes("Griptape Embedding Driver") ||
|
|
nodeData.name.includes("Griptape Prompt Driver")
|
|
) {
|
|
const onNodeCreated = nodeType.prototype.onNodeCreated;
|
|
|
|
nodeType.prototype.onNodeCreated = async function () {
|
|
onNodeCreated?.apply(this, arguments);
|
|
|
|
// Ensure this.widgets exists before trying to filter it
|
|
if (this.widgets && Array.isArray(this.widgets)) {
|
|
// Find widgets you want to turn into comments
|
|
const commentWidgets = this.widgets.filter((w) =>
|
|
w.name.toLowerCase().includes("comment")
|
|
);
|
|
commentWidgets.forEach((widget) => commentWidget(this, widget));
|
|
} else {
|
|
// If widgets aren't available yet, set up a timeout to check again
|
|
setTimeout(() => {
|
|
if (this.widgets && Array.isArray(this.widgets)) {
|
|
const commentWidgets = this.widgets.filter((w) =>
|
|
w.name.toLowerCase().includes("comment")
|
|
);
|
|
commentWidgets.forEach((widget) => commentWidget(this, widget));
|
|
} else {
|
|
// console.warn('Widgets not available for node:', this.title);
|
|
}
|
|
}, 100); // Wait 100ms and try again
|
|
}
|
|
|
|
let engine = null;
|
|
if (
|
|
nodeData.name.includes("Ollama") ||
|
|
nodeData.name.includes("Griptape Util: Create Agent Modelfile")
|
|
) {
|
|
engine = "ollama";
|
|
}
|
|
if (nodeData.name.includes("LM Studio")) {
|
|
// engine="lmstudio"
|
|
}
|
|
if (engine) {
|
|
if (this.widgets) {
|
|
const modelWidgets = this.widgets.filter((w) =>
|
|
["model", "prompt_model", "embedding_model", "base_model"].includes(
|
|
w.name
|
|
)
|
|
);
|
|
const baseIpWidget = this.widgets.find((w) => w.name === "base_url");
|
|
const portWidget = this.widgets.find((w) => w.name === "port");
|
|
const fetchModels = async (engine, baseIp, port) => {
|
|
try {
|
|
const response = await fetch("/Griptape/get_models", {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
body: JSON.stringify({
|
|
engine: engine,
|
|
base_ip: baseIp,
|
|
port: port,
|
|
}),
|
|
});
|
|
|
|
if (response.ok) {
|
|
const models = await response.json();
|
|
return models;
|
|
} else {
|
|
console.error(`Failed to fetch models: ${response.status}`);
|
|
return [];
|
|
}
|
|
} catch (error) {
|
|
console.error(
|
|
`Error fetching models for engine ${engine}:`,
|
|
error
|
|
);
|
|
return [];
|
|
}
|
|
};
|
|
const updateModels = async () => {
|
|
let engine = "ollama";
|
|
if (nodeData.name.includes("LM Studio")) {
|
|
engine = "lmstudio";
|
|
}
|
|
|
|
const baseIp = baseIpWidget.value;
|
|
const port = portWidget.value;
|
|
|
|
const allModels = await fetchModels(engine, baseIp, port);
|
|
|
|
// Update each modelWidget's options and value
|
|
modelWidgets.forEach((modelWidget) => {
|
|
let filteredModels;
|
|
if (modelWidget.name.includes("embed")) {
|
|
filteredModels = allModels.filter((model) =>
|
|
model.toLowerCase().includes("embed")
|
|
);
|
|
} else {
|
|
filteredModels = allModels.filter(
|
|
(model) => !model.toLowerCase().includes("embed")
|
|
);
|
|
}
|
|
|
|
modelWidget.options.values = filteredModels;
|
|
|
|
if (filteredModels.includes(modelWidget.value)) {
|
|
modelWidget.value = modelWidget.value;
|
|
} else if (filteredModels.length > 0) {
|
|
modelWidget.value = filteredModels[0];
|
|
} else {
|
|
modelWidget.value = "";
|
|
}
|
|
});
|
|
|
|
this.triggerSlot(0);
|
|
};
|
|
|
|
baseIpWidget.callback = updateModels;
|
|
portWidget.callback = updateModels;
|
|
|
|
// Initial update
|
|
await updateModels();
|
|
fetchModels(engine, baseIpWidget.value, portWidget.value);
|
|
}
|
|
}
|
|
setFixedRandomization(this);
|
|
// console.log("original size: ", this.size);
|
|
// setTimeout(() =>{
|
|
// this.onResize?.(this.size);
|
|
// this.graph.setDirtyCanvas(true, true);
|
|
|
|
// },100)
|
|
};
|
|
}
|
|
}
|
|
|
|
function setFixedRandomization(node) {
|
|
if (node.widgets) {
|
|
const controlWidget = node.widgets.find(
|
|
(w) => w.name === "control_after_generate"
|
|
);
|
|
if (controlWidget) {
|
|
controlWidget.value = "fixed";
|
|
} else {
|
|
// console.warn("Control widget not found for setting fixed randomization");
|
|
}
|
|
}
|
|
}
|