mirror of
https://github.com/GoogleChrome/chrome-extensions-samples.git
synced 2026-03-26 13:19:49 +07:00
* Partial fixes for sample list generator A number of fixes for the sample list generator: - Removes a comment from one of our manifest files, as we don't currently support JSONC. - Ignores the `node_modules` folder since we have recently added some AI samples with a build step. - Adds the `aiOriginTrial` API to the list of recognised APIs. - Updates `extension-apis.json` with the latest data from the `chrome-types` package. Updating recognised extension APIs still requires access to a non-existent storage bucket, so this does not fully fix the process. * Fix linter issue
138 lines
3.7 KiB
JavaScript
138 lines
3.7 KiB
JavaScript
import DOMPurify from 'dompurify';
|
|
import { marked } from 'marked';
|
|
|
|
const inputPrompt = document.body.querySelector('#input-prompt');
|
|
const buttonPrompt = document.body.querySelector('#button-prompt');
|
|
const buttonReset = document.body.querySelector('#button-reset');
|
|
const elementResponse = document.body.querySelector('#response');
|
|
const elementLoading = document.body.querySelector('#loading');
|
|
const elementError = document.body.querySelector('#error');
|
|
const sliderTemperature = document.body.querySelector('#temperature');
|
|
const sliderTopK = document.body.querySelector('#top-k');
|
|
const labelTemperature = document.body.querySelector('#label-temperature');
|
|
const labelTopK = document.body.querySelector('#label-top-k');
|
|
|
|
let session;
|
|
|
|
async function runPrompt(prompt, params) {
|
|
try {
|
|
if (!session) {
|
|
session = await chrome.aiOriginTrial.languageModel.create(params);
|
|
}
|
|
return session.prompt(prompt);
|
|
} catch (e) {
|
|
console.log('Prompt failed');
|
|
console.error(e);
|
|
console.log('Prompt:', prompt);
|
|
// Reset session
|
|
reset();
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
async function reset() {
|
|
if (session) {
|
|
session.destroy();
|
|
}
|
|
session = null;
|
|
}
|
|
|
|
async function initDefaults() {
|
|
if (!('aiOriginTrial' in chrome)) {
|
|
showResponse('Error: chrome.aiOriginTrial not supported in this browser');
|
|
return;
|
|
}
|
|
const defaults = await chrome.aiOriginTrial.languageModel.params();
|
|
console.log('Model default:', defaults);
|
|
const available = await chrome.aiOriginTrial.languageModel.availability();
|
|
if (available !== 'available') {
|
|
showResponse(`Model not yet available (current state: "${available}")`);
|
|
return;
|
|
}
|
|
sliderTemperature.value = defaults.defaultTemperature;
|
|
// Pending https://issues.chromium.org/issues/367771112.
|
|
// sliderTemperature.max = defaults.maxTemperature;
|
|
if (defaults.defaultTopK > 3) {
|
|
// limit default topK to 3
|
|
sliderTopK.value = 3;
|
|
labelTopK.textContent = 3;
|
|
} else {
|
|
sliderTopK.value = defaults.defaultTopK;
|
|
labelTopK.textContent = defaults.defaultTopK;
|
|
}
|
|
sliderTopK.max = defaults.maxTopK;
|
|
labelTemperature.textContent = defaults.defaultTemperature;
|
|
}
|
|
|
|
initDefaults();
|
|
|
|
buttonReset.addEventListener('click', () => {
|
|
hide(elementLoading);
|
|
hide(elementError);
|
|
hide(elementResponse);
|
|
reset();
|
|
buttonReset.setAttribute('disabled', '');
|
|
});
|
|
|
|
sliderTemperature.addEventListener('input', (event) => {
|
|
labelTemperature.textContent = event.target.value;
|
|
reset();
|
|
});
|
|
|
|
sliderTopK.addEventListener('input', (event) => {
|
|
labelTopK.textContent = event.target.value;
|
|
reset();
|
|
});
|
|
|
|
inputPrompt.addEventListener('input', () => {
|
|
if (inputPrompt.value.trim()) {
|
|
buttonPrompt.removeAttribute('disabled');
|
|
} else {
|
|
buttonPrompt.setAttribute('disabled', '');
|
|
}
|
|
});
|
|
|
|
buttonPrompt.addEventListener('click', async () => {
|
|
const prompt = inputPrompt.value.trim();
|
|
showLoading();
|
|
try {
|
|
const params = {
|
|
systemPrompt: 'You are a helpful and friendly assistant.',
|
|
temperature: sliderTemperature.value,
|
|
topK: sliderTopK.value
|
|
};
|
|
const response = await runPrompt(prompt, params);
|
|
showResponse(response);
|
|
} catch (e) {
|
|
showError(e);
|
|
}
|
|
});
|
|
|
|
function showLoading() {
|
|
buttonReset.removeAttribute('disabled');
|
|
hide(elementResponse);
|
|
hide(elementError);
|
|
show(elementLoading);
|
|
}
|
|
|
|
function showResponse(response) {
|
|
hide(elementLoading);
|
|
show(elementResponse);
|
|
elementResponse.innerHTML = DOMPurify.sanitize(marked.parse(response));
|
|
}
|
|
|
|
function showError(error) {
|
|
show(elementError);
|
|
hide(elementResponse);
|
|
hide(elementLoading);
|
|
elementError.textContent = error;
|
|
}
|
|
|
|
function show(element) {
|
|
element.removeAttribute('hidden');
|
|
}
|
|
|
|
function hide(element) {
|
|
element.setAttribute('hidden', '');
|
|
}
|