feat: dynamically load character slugs

This commit is contained in:
Drac
2025-06-16 18:22:25 +02:00
parent 8ccb2ae5cc
commit 36a0d1012c
4 changed files with 58 additions and 41 deletions
+1 -1
View File
@@ -3,7 +3,7 @@ import importlib.util
from .pyserver import (
get_key_from_jssetting, # noqa: F401
# update_characters,
update_characters,
update_models, # noqa: F401
update_styles, # noqa: F401
)
+45 -32
View File
@@ -115,41 +115,51 @@ app.registerExtension({
alert(`(VeniceAI.NodeSpawn) Failed to fetch text models:\n${error}`);
}
}
// Find the character_slug widget // TODO: move this to a separate node depending on how character slugs are used (if model dependent eg)
// const characterSlugWidget = this.widgets.find(w => w.name === "model");
// if (characterSlugWidget) {
// try {
// console.log("(VeniceAI.NodeSpawn) Trying to fetch character slugs...");
// const response = await api.fetchApi("/veniceai/get_characters_list");
// if (!response.ok) {
// throw new Error(`HTTP error: ${response.status} ${response.statusText}`);
// }
// const rawText = await response.text();
// let data;
// try {
// data = JSON.parse(rawText);
// } catch (jsonError) {
// throw new Error(`Failed to parse JSON: ${jsonError.message}. Raw response: ${rawText}`);
// }
// characterSlugWidget.options.values = data.characters; // todo: implement on python side
// if (characterSlugWidget.onChange) {
// characterSlugWidget.onChange();
// }
// this.setDirtyCanvas(true);
// } catch (error) {
// console.error("(VeniceAI.NodeSpawn) Failed to fetch character slugs:", error);
// alert(`(VeniceAI.NodeSpawn) Failed to fetch character slugs:\n${error}`);
// }
// }
};
}
if (nodeData.name === "GenerateTextVeniceParameters_VENICE") {
const originalOnNodeCreated = nodeType.prototype.onNodeCreated;
nodeType.prototype.onNodeCreated = async function () {
if (originalOnNodeCreated) {
originalOnNodeCreated.apply(this);
}
// Find the widget
const characterSlugWidget = this.widgets.find(w => w.name === "character_slug");
if (characterSlugWidget) {
try {
console.log("(VeniceAI.NodeSpawn) Trying to fetch character slugs...");
const response = await api.fetchApi("/veniceai/get_characters_list");
if (!response.ok) {
throw new Error(`HTTP error: ${response.status} ${response.statusText}`);
}
const rawText = await response.text();
let data;
try {
data = JSON.parse(rawText);
} catch (jsonError) {
throw new Error(`Failed to parse JSON: ${jsonError.message}. Raw response: ${rawText}`);
}
console.log("(VeniceAI.NodeSpawn) Fetched character slugs:", data.characters);
characterSlugWidget.options.values = data.characters;
if (characterSlugWidget.onChange) {
characterSlugWidget.onChange();
}
this.setDirtyCanvas(true);
} catch (error) {
console.error("(VeniceAI.NodeSpawn) Failed to fetch character slugs:", error);
alert(`(VeniceAI.NodeSpawn) Failed to fetch character slugs:\n${error}`);
}
}
};
}
if (nodeData.name === "GenerateSpeech_VENICE") {
const originalOnNodeCreated = nodeType.prototype.onNodeCreated;
nodeType.prototype.onNodeCreated = async function () {
@@ -177,6 +187,7 @@ app.registerExtension({
throw new Error(`Failed to parse JSON: ${jsonError.message}. Raw response: ${rawText}`);
}
console.log("(VeniceAI.NodeSpawn) Fetched tts models:", data.tts_models);
modelWidget.options.values = data.tts_models;
if (modelWidget.onChange) {
modelWidget.onChange();
@@ -220,5 +231,7 @@ app.registerExtension({
}
}
}
}
});
+3 -3
View File
@@ -15,9 +15,9 @@ class GenerateTextVeniceParameters:
return {
"required": {
"character_slug": (
"STRING",
"COMBO",
{
"default": "cslug",
"default": "strawberry-the-cat",
"tooltip": "",
},
),
@@ -67,7 +67,7 @@ class GenerateTextVeniceParameters:
}
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("response",)
RETURN_NAMES = ("venice_parameters",)
FUNCTION = "pass_on_params"
CATEGORY = "venice.ai"
+9 -5
View File
@@ -5,7 +5,7 @@ from pathlib import Path
import requests
from aiohttp import web
from server import PromptServer # type: ignore
from server import PromptServer # type: ignore
from ..globals import API_ENDPOINTS, VENICEAI_BASE_URL
@@ -33,8 +33,7 @@ async def update_characters_list_server(request):
# remove "object" key from response_data
response_data.pop("object", None)
response_data["data"] = sorted(response_data.get("data", []), key=lambda item: item.get("name", ""))
response_data["data"].insert(0, "none")
response_data["data"] = sorted(response_data.get("data", []), key=lambda item: item.get("slug", ""))
with open(characters_list_path, "w") as f:
json.dump(response_data, f, indent=4)
@@ -47,8 +46,13 @@ async def update_characters_list_server(request):
@routes.get("/veniceai/get_characters_list")
async def get_local_characters_list(requests):
async def get_local_characters_list(request):
with open(characters_list_path, "r") as f:
characters_list_json = json.load(f)
return web.json_response(characters_list_json)
characters = []
for item in characters_list_json.get("data", []):
if isinstance(item, dict) and item.get("slug"):
characters.append(item.get("slug"))
return web.json_response({"characters": characters})