Files
chrome-extensions-samples/functional-samples/ai.gemini-on-device/sidepanel/index.js
Sebastian Benz 69f946b35e Improve prompt API sample (#1344)
* Improve prompt API sample

* Render response as markdown
* Fix initial maxK and temperature values
* Add privacy statement (for webstore submission)
* Regenerate key and trial token

* fix formatting errors

* Update functional-samples/ai.gemini-on-device/sidepanel/index.js

Update maxTemperature

Co-authored-by: Thomas Steiner <tomac@google.com>

* Update functional-samples/ai.gemini-on-device/sidepanel/index.js

Better string comparison

Co-authored-by: Thomas Steiner <tomac@google.com>

---------

Co-authored-by: Thomas Steiner <tomac@google.com>
2024-11-08 15:35:27 +01:00

132 lines
3.4 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.capabilities();
console.log('Model default:', defaults);
if (defaults.available !== 'readily') {
showResponse(
`Model not yet available (current state: "${defaults.available}")`
);
return;
}
sliderTemperature.value = defaults.defaultTemperature;
// sliderTemperature.max = defaults.maxTemperature;
// Pending https://issues.chromium.org/issues/367771112.
sliderTopK.value = defaults.defaultTopK;
sliderTopK.max = defaults.maxTopK;
labelTopK.textContent = defaults.defaultTopK;
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 = {
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', '');
}