-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathoffscreen.js
More file actions
90 lines (80 loc) · 2.11 KB
/
offscreen.js
File metadata and controls
90 lines (80 loc) · 2.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import {
generateGemmaText,
getGemmaModelStatus,
initializeGemmaModel,
resetGemmaConversationCache,
} from "./lib/gemma/engine.js";
function sendBackgroundMessage(message) {
return chrome.runtime.sendMessage({
target: "gemma-background",
...message,
});
}
function sendProgress(state) {
return sendBackgroundMessage({
type: "gemma-model-progress",
state,
}).catch(() => {
// Background may have restarted; the next request will recreate state.
});
}
async function handleGemmaRequest(message) {
if (message.type === "gemma-model-status") {
return getGemmaModelStatus();
}
if (message.type === "initialize-gemma-model") {
await initializeGemmaModel(({ percentage }) => {
void sendProgress({
status: "downloading",
percentage,
error: "",
});
});
return { ok: true };
}
if (message.type === "gemma-generate-text") {
const payload = message.payload ?? {};
const text = await generateGemmaText(payload.prompt, {
messages: payload.messages,
systemPrompt: payload.systemPrompt,
maxNewTokens: payload.maxNewTokens,
resetCache: payload.resetCache !== false,
tools: payload.tools,
onProgress({ percentage }) {
void sendProgress({
status: "downloading",
percentage,
error: "",
});
},
});
return { text };
}
if (message.type === "reset-gemma-conversation-cache") {
resetGemmaConversationCache();
return { ok: true };
}
throw new Error(`Unknown Gemma offscreen request: ${message.type}`);
}
chrome.runtime.onMessage.addListener((message) => {
if (message?.target !== "gemma-offscreen") {
return false;
}
(async () => {
try {
const result = await handleGemmaRequest(message);
await sendBackgroundMessage({
requestId: message.requestId,
ok: true,
result,
});
} catch (error) {
await sendBackgroundMessage({
requestId: message.requestId,
ok: false,
error: error instanceof Error ? error.message : String(error),
});
}
})();
return false;
});