mirror of
https://github.com/KoboldAI/KoboldAI-Client.git
synced 2025-06-05 21:59:24 +02:00
And the rest
This commit is contained in:
44
aiserver.py
44
aiserver.py
@@ -9433,41 +9433,65 @@ def UI_2_generate_wi(data):
|
|||||||
field = data["field"]
|
field = data["field"]
|
||||||
existing = data["existing"]
|
existing = data["existing"]
|
||||||
gen_amount = data["genAmount"]
|
gen_amount = data["genAmount"]
|
||||||
print(uid, field)
|
|
||||||
|
|
||||||
with open("data/wi_fewshot.txt", "r") as file:
|
# The template to coax what we want from the model
|
||||||
fewshot_template = file.read()
|
extractor_string = ""
|
||||||
|
|
||||||
if field == "title":
|
if field == "title":
|
||||||
prompt = fewshot_template
|
|
||||||
for thing in ["type", "desc"]:
|
for thing in ["type", "desc"]:
|
||||||
if not existing[thing]:
|
if not existing[thing]:
|
||||||
continue
|
continue
|
||||||
pretty = {"type": "Type", "desc": "Description"}[thing]
|
pretty = {"type": "Type", "desc": "Description"}[thing]
|
||||||
prompt += f"{pretty}: {existing[thing]}\n"
|
extractor_string += f"{pretty}: {existing[thing]}\n"
|
||||||
|
|
||||||
pretty = "Title"
|
pretty = "Title"
|
||||||
if existing["desc"]:
|
if existing["desc"]:
|
||||||
# Don't let the model think we're starting a new entry
|
# Don't let the model think we're starting a new entry
|
||||||
pretty = "Alternate Title"
|
pretty = "Alternate Title"
|
||||||
|
|
||||||
prompt += pretty + ":"
|
extractor_string += pretty + ":"
|
||||||
elif field == "desc":
|
elif field == "desc":
|
||||||
# MUST be title and type
|
# MUST be title and type
|
||||||
assert existing["title"]
|
assert existing["title"]
|
||||||
assert existing["type"]
|
assert existing["type"]
|
||||||
prompt = f"{fewshot_template}Title: {existing['title']}\nType: {existing['type']}\nDescription:"
|
extractor_string = f"Title: {existing['title']}\nType: {existing['type']}\nDescription:"
|
||||||
else:
|
else:
|
||||||
assert False, "What"
|
assert False, "What"
|
||||||
|
|
||||||
|
with open("data/wi_fewshot.txt", "r") as file:
|
||||||
|
fewshot_entries = [x.strip() for x in file.read().split("\n\n") if x]
|
||||||
|
|
||||||
|
# Use user's own WI entries in prompt
|
||||||
|
if koboldai_vars.wigen_use_own_wi:
|
||||||
|
fewshot_entries += koboldai_vars.worldinfo_v2.to_wi_fewshot_format(excluding_uid=uid)
|
||||||
|
|
||||||
logger.info(prompt)
|
# We must have this amount or less in our context.
|
||||||
|
target = koboldai_vars.max_length - gen_amount - len(tokenizer.encode(extractor_string))
|
||||||
|
|
||||||
|
used = []
|
||||||
|
# Walk the entries backwards until we can't cram anymore in
|
||||||
|
for entry in reversed(fewshot_entries):
|
||||||
|
maybe = [entry] + used
|
||||||
|
maybe_str = "\n\n".join(maybe)
|
||||||
|
possible_encoded = tokenizer.encode(maybe_str)
|
||||||
|
if len(possible_encoded) > target:
|
||||||
|
break
|
||||||
|
yes_str = maybe_str
|
||||||
|
used = maybe
|
||||||
|
|
||||||
|
prompt = f"{yes_str}\n\n{extractor_string}"
|
||||||
|
|
||||||
|
# logger.info(prompt)
|
||||||
|
# TODO: Make single_line mode that stops on newline rather than bans it (for title)
|
||||||
out_text = tpool.execute(
|
out_text = tpool.execute(
|
||||||
raw_generate,
|
raw_generate,
|
||||||
prompt,
|
prompt,
|
||||||
max_new=gen_amount,
|
max_new=gen_amount,
|
||||||
single_line=True,
|
single_line=True,
|
||||||
).decoded[0]
|
).decoded[0]
|
||||||
print(f'{out_text}')
|
out_text = utils.trimincompletesentence(out_text.strip())
|
||||||
|
|
||||||
|
socketio.emit("generated_wi", {"uid": uid, "field": field, "out": out_text}, room="UI_2")
|
||||||
|
|
||||||
@app.route("/generate_raw", methods=["GET"])
|
@app.route("/generate_raw", methods=["GET"])
|
||||||
def UI_2_generate_raw():
|
def UI_2_generate_raw():
|
||||||
|
@@ -880,6 +880,20 @@ gensettingstf = [
|
|||||||
"extra_classes": "simple_ui_only var_sync_alt_user_ui_level",
|
"extra_classes": "simple_ui_only var_sync_alt_user_ui_level",
|
||||||
"ui_level": 0
|
"ui_level": 0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"UI_V2_Only": True,
|
||||||
|
"uitype": "toggle",
|
||||||
|
"unit": "bool",
|
||||||
|
"label": "Native WI Gen",
|
||||||
|
"id": "wigen_use_own_wi",
|
||||||
|
"default": False,
|
||||||
|
"tooltip": "Uses your existing applicable (has title, type, content) World Info entries as inspiration for generated ones.",
|
||||||
|
"menu_path": "World Info",
|
||||||
|
"sub_path": "",
|
||||||
|
"classname": "user",
|
||||||
|
"name": "wigen_use_own_wi",
|
||||||
|
"ui_level": 2
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
gensettingsik =[{
|
gensettingsik =[{
|
||||||
|
@@ -1152,6 +1152,7 @@ class user_settings(settings):
|
|||||||
self.img_gen_steps = 30
|
self.img_gen_steps = 30
|
||||||
self.img_gen_cfg_scale = 7.0
|
self.img_gen_cfg_scale = 7.0
|
||||||
self.cluster_requested_models = [] # The models which we allow to generate during cluster mode
|
self.cluster_requested_models = [] # The models which we allow to generate during cluster mode
|
||||||
|
self.wigen_use_own_wi = False
|
||||||
|
|
||||||
|
|
||||||
def __setattr__(self, name, value):
|
def __setattr__(self, name, value):
|
||||||
@@ -2471,6 +2472,38 @@ class KoboldWorldInfo(object):
|
|||||||
|
|
||||||
def get_used_wi(self):
|
def get_used_wi(self):
|
||||||
return [x['content'] for x in self.world_info if x['used_in_game']]
|
return [x['content'] for x in self.world_info if x['used_in_game']]
|
||||||
|
|
||||||
|
def to_wi_fewshot_format(self, excluding_uid: int) -> List[str]:
|
||||||
|
"""
|
||||||
|
Returns a list of strings representing applicable (has title, text, and
|
||||||
|
object type) World Info entries. Intended for feeding into the fewshot
|
||||||
|
generator.
|
||||||
|
"""
|
||||||
|
the_collection = []
|
||||||
|
for entry in self.world_info.values():
|
||||||
|
if entry["uid"] == excluding_uid:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if not (
|
||||||
|
entry["title"]
|
||||||
|
and entry["manual_text"]
|
||||||
|
and entry["object_type"]
|
||||||
|
):
|
||||||
|
continue
|
||||||
|
|
||||||
|
processed_desc = entry["manual_text"].replace("\n", " ")
|
||||||
|
while " " in processed_desc:
|
||||||
|
processed_desc = processed_desc.replace(" ", " ")
|
||||||
|
processed_desc = processed_desc.strip()
|
||||||
|
|
||||||
|
the_collection.append(
|
||||||
|
f"Title: {entry['title']}\n" \
|
||||||
|
f"Type: {entry['object_type']}\n"
|
||||||
|
f"Description: {processed_desc}"
|
||||||
|
)
|
||||||
|
|
||||||
|
return the_collection
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class SavePaths:
|
class SavePaths:
|
||||||
|
@@ -1100,6 +1100,25 @@ td.server_vars {
|
|||||||
.world_info_title {
|
.world_info_title {
|
||||||
user-select: text;
|
user-select: text;
|
||||||
-moz-user-select:text;
|
-moz-user-select:text;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wi-type-leadup {
|
||||||
|
opacity: 0.4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.world_info_item_type {
|
||||||
|
/* Workaround for Firefox bug: https://stackoverflow.com/a/42283543 */
|
||||||
|
padding: 1px;
|
||||||
|
|
||||||
|
outline: none;
|
||||||
|
border-bottom: 1px solid gray;
|
||||||
|
transition: color 200ms, border-bottom-color 200ms;
|
||||||
|
}
|
||||||
|
|
||||||
|
.world_info_item_type.bad-input {
|
||||||
|
color: rgb(255, 103, 103);
|
||||||
|
border-bottom-color: red;
|
||||||
}
|
}
|
||||||
|
|
||||||
.world_info_delete {
|
.world_info_delete {
|
||||||
@@ -1140,6 +1159,24 @@ td.server_vars {
|
|||||||
filter: brightness(90%);
|
filter: brightness(90%);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.world_info_label_container {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin: 1px 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.world_info_label_container > .wi-ui-label {
|
||||||
|
position: relative;
|
||||||
|
top: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.world_info_label_container > .generate-button {
|
||||||
|
opacity: 0.8;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.world_info_label_container > .generate-button:hover { opacity: 1.0; }
|
||||||
|
|
||||||
.tag {
|
.tag {
|
||||||
background-color: var(--wi_tag_color);
|
background-color: var(--wi_tag_color);
|
||||||
color: var(--wi_tag_text_color);
|
color: var(--wi_tag_text_color);
|
||||||
|
@@ -34,6 +34,7 @@ socket.on("log_message", function(data){process_log_message(data);});
|
|||||||
socket.on("debug_message", function(data){console.log(data);});
|
socket.on("debug_message", function(data){console.log(data);});
|
||||||
socket.on("scratchpad_response", recieveScratchpadResponse);
|
socket.on("scratchpad_response", recieveScratchpadResponse);
|
||||||
socket.on("show_error_notification", function(data) { reportError(data.title, data.text) });
|
socket.on("show_error_notification", function(data) { reportError(data.title, data.text) });
|
||||||
|
socket.on("generated_wi", showGeneratedWIData);
|
||||||
//socket.onAny(function(event_name, data) {console.log({"event": event_name, "class": data.classname, "data": data});});
|
//socket.onAny(function(event_name, data) {console.log({"event": event_name, "class": data.classname, "data": data});});
|
||||||
|
|
||||||
// Must be done before any elements are made; we track their changes.
|
// Must be done before any elements are made; we track their changes.
|
||||||
@@ -69,6 +70,7 @@ var setup_wi_toggles = [];
|
|||||||
var scroll_trigger_element = undefined; //undefined means not currently set. If set to null, it's disabled.
|
var scroll_trigger_element = undefined; //undefined means not currently set. If set to null, it's disabled.
|
||||||
var drag_id = null;
|
var drag_id = null;
|
||||||
var story_commentary_characters = {};
|
var story_commentary_characters = {};
|
||||||
|
var generating_summary = false;
|
||||||
const on_colab = $el("#on_colab").textContent == "true";
|
const on_colab = $el("#on_colab").textContent == "true";
|
||||||
|
|
||||||
// Each entry into this array should be an object that looks like:
|
// Each entry into this array should be an object that looks like:
|
||||||
@@ -2248,6 +2250,48 @@ function world_info_entry(data) {
|
|||||||
document.getElementById("world_info_tags_"+data.uid).classList.remove("hidden");
|
document.getElementById("world_info_tags_"+data.uid).classList.remove("hidden");
|
||||||
document.getElementById("world_info_secondtags_"+data.uid).classList.remove("hidden");
|
document.getElementById("world_info_secondtags_"+data.uid).classList.remove("hidden");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const genTypeInput = world_info_card.querySelector(".world_info_item_type");
|
||||||
|
const generateDescButton = world_info_card.querySelector(".wi-lc-text > .generate-button");
|
||||||
|
generateDescButton.addEventListener("click", function() {
|
||||||
|
if (generating_summary) return;
|
||||||
|
let type = genTypeInput.innerText;
|
||||||
|
|
||||||
|
if (!type) {
|
||||||
|
genTypeInput.classList.add("bad-input");
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
genTypeInput.classList.remove("bad-input");
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Make type input element
|
||||||
|
generateWIData(data.uid, "desc", title.innerText, type, null, 80);
|
||||||
|
this.innerText = "autorenew";
|
||||||
|
this.classList.add("spinner");
|
||||||
|
});
|
||||||
|
|
||||||
|
genTypeInput.addEventListener("focus", function() {
|
||||||
|
this.classList.remove("bad-input");
|
||||||
|
});
|
||||||
|
|
||||||
|
genTypeInput.addEventListener("keydown", function(event) {
|
||||||
|
if (event.key === "Enter") {
|
||||||
|
event.preventDefault();
|
||||||
|
this.blur();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
genTypeInput.addEventListener("blur", function() {
|
||||||
|
this.innerText = this.innerText.trim();
|
||||||
|
|
||||||
|
if (this.innerText == this.getAttribute("old-text")) return;
|
||||||
|
this.setAttribute("old-text", this.innerText);
|
||||||
|
|
||||||
|
world_info_data[data.uid].object_type = this.innerText;
|
||||||
|
send_world_info(data.uid);
|
||||||
|
});
|
||||||
|
|
||||||
|
genTypeInput.innerText = data.object_type;
|
||||||
|
|
||||||
//$('#world_info_constant_'+data.uid).bootstrapToggle();
|
//$('#world_info_constant_'+data.uid).bootstrapToggle();
|
||||||
//$('#world_info_wpp_toggle_'+data.uid).bootstrapToggle();
|
//$('#world_info_wpp_toggle_'+data.uid).bootstrapToggle();
|
||||||
@@ -3957,6 +4001,7 @@ function create_new_wi_entry(folder) {
|
|||||||
"selective": false,
|
"selective": false,
|
||||||
"wpp": {'name': "", 'type': "", 'format': 'W++', 'attributes': {}},
|
"wpp": {'name': "", 'type': "", 'format': 'W++', 'attributes': {}},
|
||||||
'use_wpp': false,
|
'use_wpp': false,
|
||||||
|
"object_type": null,
|
||||||
};
|
};
|
||||||
var card = world_info_entry(data);
|
var card = world_info_entry(data);
|
||||||
//card.scrollIntoView(false);
|
//card.scrollIntoView(false);
|
||||||
@@ -6894,10 +6939,30 @@ for (const proxy of document.querySelectorAll("[sync-proxy-host]")) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function generateWIData(uid, field, title=null, type=null, desc=null, genAmount=80) {
|
function generateWIData(uid, field, title=null, type=null, desc=null, genAmount=80) {
|
||||||
|
if (generating_summary) return;
|
||||||
|
generating_summary = true;
|
||||||
|
|
||||||
socket.emit("generate_wi", {
|
socket.emit("generate_wi", {
|
||||||
uid: uid,
|
uid: uid,
|
||||||
field: field,
|
field: field,
|
||||||
genAmount: genAmount || 80,
|
genAmount: genAmount || 80,
|
||||||
existing: {title: title, type: type, desc: desc}
|
existing: {title: title, type: type, desc: desc}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function showGeneratedWIData(data) {
|
||||||
|
generating_summary = false;
|
||||||
|
console.warn(data)
|
||||||
|
const card = $el(`.world_info_card[uid="${data.uid}"]`);
|
||||||
|
|
||||||
|
// Stop spinning!
|
||||||
|
for (const littleRobotFriend of card.querySelectorAll(".generate-button.spinner")) {
|
||||||
|
littleRobotFriend.classList.remove("spinner");
|
||||||
|
littleRobotFriend.innerText = "smart_toy";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.field === "desc") {
|
||||||
|
world_info_data[data.uid].manual_text = data.out;
|
||||||
|
send_world_info(data.uid);
|
||||||
|
}
|
||||||
}
|
}
|
@@ -10,8 +10,22 @@
|
|||||||
>add</span>
|
>add</span>
|
||||||
<img class="world_info_image">
|
<img class="world_info_image">
|
||||||
</div>
|
</div>
|
||||||
<h4 draggable="true" ondragstart="event.preventDefault();event.stopPropagation();" id="world_info_title_"
|
<div>
|
||||||
class="world_info_title" onfocus="this.parentElement.parentElement.setAttribute('draggable', 'false');this.setAttribute('draggable', 'false');"></h4>
|
<h4
|
||||||
|
draggable="true"
|
||||||
|
ondragstart="event.preventDefault();event.stopPropagation();"
|
||||||
|
id="world_info_title_"
|
||||||
|
class="world_info_title"
|
||||||
|
onfocus="this.parentElement.parentElement.setAttribute('draggable', 'false');this.setAttribute('draggable', 'false');"
|
||||||
|
></h4>
|
||||||
|
<span class="wi-type-leadup">is a</span>
|
||||||
|
<span
|
||||||
|
class="world_info_item_type"
|
||||||
|
contenteditable="true"
|
||||||
|
data-placeholder="Person"
|
||||||
|
spellcheck="false"
|
||||||
|
></span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<span id="world_info_delete_" class="world_info_delete">X</span>
|
<span id="world_info_delete_" class="world_info_delete">X</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -61,7 +75,12 @@
|
|||||||
<div class="wpp_attributes_area"></div>
|
<div class="wpp_attributes_area"></div>
|
||||||
</div>
|
</div>
|
||||||
<div id="world_info_basic_text_" class="world_info_basic_text_area">
|
<div id="world_info_basic_text_" class="world_info_basic_text_area">
|
||||||
Text:
|
<div class="world_info_label_container wi-lc-text">
|
||||||
|
<span class="wi-ui-label">Text</span>
|
||||||
|
<span class="material-icons-outlined generate-button" tooltip="Generate Content">
|
||||||
|
smart_toy
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
<textarea draggable="true" ondragstart="event.preventDefault();event.stopPropagation();" id="world_info_entry_text_" class="world_info_text world_info_entry_text fullwidth" oninput="autoResize(this, 60)"
|
<textarea draggable="true" ondragstart="event.preventDefault();event.stopPropagation();" id="world_info_entry_text_" class="world_info_text world_info_entry_text fullwidth" oninput="autoResize(this, 60)"
|
||||||
onfocus="this.parentElement.parentElement.setAttribute('draggable', 'false');this.setAttribute('draggable', 'false');autoResize(this, 60)"
|
onfocus="this.parentElement.parentElement.setAttribute('draggable', 'false');this.setAttribute('draggable', 'false');autoResize(this, 60)"
|
||||||
onblur="this.parentElement.parentElement.setAttribute('draggable', 'true');this.setAttribute('draggable', 'true');this.style.height='60px';"></textarea>
|
onblur="this.parentElement.parentElement.setAttribute('draggable', 'true');this.setAttribute('draggable', 'true');this.style.height='60px';"></textarea>
|
||||||
@@ -81,6 +100,10 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
|
<div class="world_info_label_container wi-lc-comment">
|
||||||
|
<span class="wi-ui-label">Comment</span>
|
||||||
|
<padding></padding>
|
||||||
|
</div>
|
||||||
<textarea draggable="true" ondragstartondragstart="event.preventDefault();event.stopPropagation();" rows=1 id="world_info_comment_"
|
<textarea draggable="true" ondragstartondragstart="event.preventDefault();event.stopPropagation();" rows=1 id="world_info_comment_"
|
||||||
class="world_info_text world_info_comment fullwidth" oninput="autoResize(this, 60)" onfocus="autoResize(this, 60)" onblur="this.style.height='60px';"
|
class="world_info_text world_info_comment fullwidth" oninput="autoResize(this, 60)" onfocus="autoResize(this, 60)" onblur="this.style.height='60px';"
|
||||||
onfocus="this.parentElement.parentElement.setAttribute('draggable', 'false');this.setAttribute('draggable', 'false');;"
|
onfocus="this.parentElement.parentElement.setAttribute('draggable', 'false');this.setAttribute('draggable', 'false');;"
|
||||||
|
Reference in New Issue
Block a user