Commit ·
d256fda
1
Parent(s): f1440ce
Sanitize streamed local model output
Browse filesCo-authored-by: Codex <codex@openai.com>
- static/engine.js +8 -4
- static/ui.js +9 -2
static/engine.js
CHANGED
|
@@ -33,6 +33,7 @@ export async function loadModel(onProgress) {
|
|
| 33 |
|
| 34 |
export async function generateCode(prompt, language, onToken, onComplete) {
|
| 35 |
if (!generator) throw new Error("Model not loaded");
|
|
|
|
| 36 |
|
| 37 |
const messages = [
|
| 38 |
{
|
|
@@ -54,20 +55,23 @@ export async function generateCode(prompt, language, onToken, onComplete) {
|
|
| 54 |
|
| 55 |
const streamer = new TextStreamer(generator.tokenizer, {
|
| 56 |
skip_prompt: true,
|
| 57 |
-
callback_function:
|
|
|
|
|
|
|
|
|
|
| 58 |
});
|
| 59 |
|
| 60 |
const result = await generator(messages, {
|
| 61 |
max_new_tokens: 1024,
|
| 62 |
-
|
| 63 |
-
do_sample: true,
|
| 64 |
streamer,
|
| 65 |
});
|
| 66 |
|
| 67 |
const generated = result?.[0]?.generated_text;
|
| 68 |
-
const
|
| 69 |
? generated.at(-1).content
|
| 70 |
: String(generated || "");
|
|
|
|
| 71 |
const fullCode = stripMarkdownCodeFence(fullCodeRaw);
|
| 72 |
onComplete(fullCode);
|
| 73 |
return fullCode;
|
|
|
|
| 33 |
|
| 34 |
export async function generateCode(prompt, language, onToken, onComplete) {
|
| 35 |
if (!generator) throw new Error("Model not loaded");
|
| 36 |
+
let streamedText = "";
|
| 37 |
|
| 38 |
const messages = [
|
| 39 |
{
|
|
|
|
| 55 |
|
| 56 |
const streamer = new TextStreamer(generator.tokenizer, {
|
| 57 |
skip_prompt: true,
|
| 58 |
+
callback_function: (token) => {
|
| 59 |
+
streamedText += token;
|
| 60 |
+
onToken(token);
|
| 61 |
+
},
|
| 62 |
});
|
| 63 |
|
| 64 |
const result = await generator(messages, {
|
| 65 |
max_new_tokens: 1024,
|
| 66 |
+
do_sample: false,
|
|
|
|
| 67 |
streamer,
|
| 68 |
});
|
| 69 |
|
| 70 |
const generated = result?.[0]?.generated_text;
|
| 71 |
+
const resultText = Array.isArray(generated)
|
| 72 |
? generated.at(-1).content
|
| 73 |
: String(generated || "");
|
| 74 |
+
const fullCodeRaw = resultText && resultText.trim() ? resultText : streamedText;
|
| 75 |
const fullCode = stripMarkdownCodeFence(fullCodeRaw);
|
| 76 |
onComplete(fullCode);
|
| 77 |
return fullCode;
|
static/ui.js
CHANGED
|
@@ -7,7 +7,7 @@ export function appendToken(token) {
|
|
| 7 |
|
| 8 |
const display = document.getElementById("stream-display");
|
| 9 |
if (display) {
|
| 10 |
-
display.textContent = streamBuffer;
|
| 11 |
display.scrollTop = display.scrollHeight;
|
| 12 |
}
|
| 13 |
}
|
|
@@ -67,7 +67,7 @@ export async function rollbackAndReplace(correctedCode, reason, verdict = "FIX")
|
|
| 67 |
}
|
| 68 |
|
| 69 |
export function getCurrentCode() {
|
| 70 |
-
return streamBuffer;
|
| 71 |
}
|
| 72 |
|
| 73 |
export function setCode(code) {
|
|
@@ -96,6 +96,13 @@ function sleep(ms) {
|
|
| 96 |
return new Promise((resolve) => setTimeout(resolve, ms));
|
| 97 |
}
|
| 98 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 99 |
Object.assign(window, {
|
| 100 |
appendToken,
|
| 101 |
setStatus,
|
|
|
|
| 7 |
|
| 8 |
const display = document.getElementById("stream-display");
|
| 9 |
if (display) {
|
| 10 |
+
display.textContent = cleanVisibleStream(streamBuffer);
|
| 11 |
display.scrollTop = display.scrollHeight;
|
| 12 |
}
|
| 13 |
}
|
|
|
|
| 67 |
}
|
| 68 |
|
| 69 |
export function getCurrentCode() {
|
| 70 |
+
return cleanVisibleStream(streamBuffer);
|
| 71 |
}
|
| 72 |
|
| 73 |
export function setCode(code) {
|
|
|
|
| 96 |
return new Promise((resolve) => setTimeout(resolve, ms));
|
| 97 |
}
|
| 98 |
|
| 99 |
+
function cleanVisibleStream(code) {
|
| 100 |
+
if (typeof window.stripMarkdownCodeFence === "function") {
|
| 101 |
+
return window.stripMarkdownCodeFence(code);
|
| 102 |
+
}
|
| 103 |
+
return code;
|
| 104 |
+
}
|
| 105 |
+
|
| 106 |
Object.assign(window, {
|
| 107 |
appendToken,
|
| 108 |
setStatus,
|