141 lines
5.8 KiB
JavaScript
141 lines
5.8 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");
|
|
}
|
|
}
|
|
}
|
|
|
|
|