kr15t3n's picture
Update worker.js
3e0afe7 verified
import {
env,
pipeline,
} from "https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.6.3";
// Skip checking for local models
env.allowLocalModels = false;
// Hold reference to text-generation pipeline
let pipe;
// Listen for messages from the main thread
self.onmessage = async (event) => {
const { type, data } = event.data;
switch (type) {
case "load":
let progressInterval;
try {
console.log("[Worker] Loading model...");
let fakeProgress = 0;
progressInterval = setInterval(() => {
fakeProgress += 10;
if (fakeProgress <= 90) {
self.postMessage({ type: "progress", data: { progress: fakeProgress } });
} else {
clearInterval(progressInterval);
}
}, 500);
pipe = await pipeline("text-generation", "kr15t3n/my-emojigemma-onnx", {
dtype: "q4",
progress_callback: (progress) => {
if (progress.status === "progress" && progress.file?.endsWith?.("onnx_data")) {
clearInterval(progressInterval);
const reportedProgress = Math.floor(Math.min(progress.progress, 99));
self.postMessage({ type: "progress", data: { progress: reportedProgress } });
}
},
});
clearInterval(progressInterval);
console.log("[Worker] Model loaded successfully.");
self.postMessage({ type: "loaded" });
} catch (error) {
clearInterval(progressInterval);
console.error("[Worker] Model loading failed:", error);
self.postMessage({ type: "error", data: error.message });
}
break;
case "generate":
try {
const messages = [
{ "role": "system", "content": "Translate this text to emoji." },
{ "role": "user", "content": data.prompt },
];
const generatedResponses = new Set();
for (let i = 0; i < 3; i++) {
const results = await pipe(messages, {
max_new_tokens: 8,
do_sample: true,
temperature: 0.1,
top_p: 0.9,
num_return_sequences: 1,
repetition_penalty: 1.2,
return_full_text: false
});
let rawResponse = results[0].generated_text;
console.log(`[Worker] Raw model output (Attempt ${i + 1}):`, rawResponse);
let assistantResponse = '';
if (Array.isArray(rawResponse)) {
const lastMessage = rawResponse[rawResponse.length - 1];
if (lastMessage && lastMessage.role === 'assistant' && typeof lastMessage.content === 'string') {
assistantResponse = lastMessage.content;
}
} else if (typeof rawResponse === 'string') {
assistantResponse = rawResponse;
}
if (assistantResponse) {
const cleanResponse = assistantResponse.replace(/[^\p{Emoji}\s]/gu, '').trim();
// Check if the response is new and valid
if (cleanResponse && !generatedResponses.has(cleanResponse)) {
generatedResponses.add(cleanResponse);
// Send the result immediately
self.postMessage({ type: "result", data: cleanResponse });
}
}
}
console.log("[Worker] Generation complete.");
self.postMessage({ type: "complete" });
} catch (error) {
console.error("[Worker] Generation failed:", error);
self.postMessage({ type: "error", data: error.message });
}
break;
}
};