Merge pull request #70 from LlamaEnjoyer/qol_tweaks

Add auto session naming and context tracking qol features.
This commit is contained in:
turboderp
2025-01-24 20:25:08 +01:00
committed by GitHub
5 changed files with 77 additions and 6 deletions

View File

@@ -188,6 +188,31 @@ class Session:
self.save()
def _create_session_name_from_text(self, text, max_length=30):
"""Creates a session name from the first message text.
Args:
text: The message text to create name from
max_length: Maximum length of generated name
Returns:
A name string, truncated with ellipsis if needed
"""
if not text:
return "Unnamed session"
processed_text = text.split(": ", 1)[-1].strip() # Cache split result
words = processed_text.split()
name = ""
for word in words:
if len(name) + len(word) + 4 <= max_length: # +4 for "..." and space
name += word + " "
else:
name = name.strip() + "..."
break
return name.strip() or "Unnamed session"
def user_input(self, data):
prompt_format = prompt_formats[self.settings["prompt_format"]]()
input_text = data["user_input_text"]
@@ -197,6 +222,13 @@ class Session:
if prompt_format.is_instruct(): prefix = ""
else: prefix = self.settings["roles"][0] + ": "
new_block["text"] = prefix + input_text
# Auto-rename session if this is the first message
if len(self.history) == 0:
self.name = self._create_session_name_from_text(input_text)
if session_list is not None and self.session_uuid in session_list:
session_list[self.session_uuid] = (self.name, session_list[self.session_uuid][1])
self.history.append(new_block)
self.save()
return new_block
@@ -659,6 +691,8 @@ class Session:
meta["gen_speed"] = generated_tokens / (mt.stages["gen"] + 1e-8)
meta["overflow"] = max_new_tokens if generated_tokens == max_new_tokens else 0
meta["canceled"] = abort_event.is_set()
meta["context_tokens"] = context_ids.shape[-1] + save_tokens.shape[-1] # Total tokens in context
meta["max_seq_len"] = model.config.max_seq_len # Maximum sequence length
new_block["meta"] = meta
# Save response block
@@ -720,4 +754,3 @@ class Session:
self.history[i] = block
break
self.save()

View File

@@ -688,9 +688,12 @@ class ChatBlock {
let ptps = this.block.meta.prompt_speed.toFixed(2)
if (this.block.meta.prompt_speed > 50000) ptps = "∞";
let html = "prompt: " + this.block.meta.prompt_tokens.toFixed(0) + " tokens, " + ptps + " tokens/s";
let contextPercent = (this.block.meta.context_tokens / this.block.meta.max_seq_len * 100).toFixed(0);
let html = "prompt: " + this.block.meta.prompt_tokens.toFixed(0) + " tokens, " + ptps + " tokens/s ";
html += "";
html += "response: " + this.block.meta.gen_tokens.toFixed(0) + " tokens, " + this.block.meta.gen_speed.toFixed(2) + " tokens/s";
html += "response: " + this.block.meta.gen_tokens.toFixed(0) + " tokens, " + this.block.meta.gen_speed.toFixed(2) + " tokens/s ";
html += "";
html += "context: " + contextPercent + "% full";
p.innerHTML = html;
this.textBlock.appendChild(p);
}
@@ -855,4 +858,4 @@ class ChatBlock {
block.parent.currentStreamingBlock = block;
block.parent.getModelResponse(block.block.block_uuid, block.block.text);
}
}
}

View File

@@ -442,6 +442,8 @@ export class ModelView {
}
loadModel() {
const controller = new AbortController();
const signal = controller.signal;
overlay.loadingOverlay.setProgress(0, 1);
overlay.pageOverlay.setMode("loading");
@@ -456,10 +458,18 @@ export class ModelView {
}, 10000)
});
overlay.loadingOverlay.onCancel = () => {
controller.abort();
overlay.pageOverlay.setMode();
this.error_message = "Loading cancelled";
this.updateView();
};
let fetchRequest = fetch("/api/load_model", {
method: "POST",
headers: { "Content-Type": "application/json", },
body: JSON.stringify(packet)
body: JSON.stringify(packet),
signal: signal
});
const self = this;

View File

@@ -44,4 +44,8 @@
border-radius: 0px;
text-align: center;
line-height: 30px;
}
}
.overlay .textbutton {
margin-top: 25px;
}

View File

@@ -1,4 +1,6 @@
import * as util from "./util.js";
import * as controls from "./controls.js";
import * as globals from "./globals.js";
class PageOverlay {
constructor() {
@@ -60,6 +62,25 @@ class LoadingOverlay extends Overlay {
this.bar = util.newDiv(null, "progressbar-bar");
this.box.appendChild(this.bar);
this.cancelButton = new controls.Button("✖ Cancel", () => {
// First call the cancel handler to abort the fetch request
if (this.onCancel) this.onCancel();
// Then unload the model to release GPU memory
fetch("/api/unload_model")
.then(response => response.json())
.then(json => {
if (json.result == "ok") {
globals.g.loadedModelUUID = null;
globals.g.failedModelUUID = null;
}
});
});
this.cancelButton.setEnabled(true);
this.element.appendChild(this.cancelButton.element);
this.onCancel = null;
}
setProgress(a, b) {