Дата публикации: 20 мая 2025 г. Последнее обновление: 21 октября 2026 г.
| Объяснение | Веб | Расширения | Статус Chrome | Намерение |
|---|---|---|---|---|
| GitHub | Открыть | Intent to Ship | ||
| GitHub | Открыть | Intent to Experiment |
Prompt API позволяет отправлять запросы на естественном языке к базовой модели в Chrome.
Prompt API можно использовать по-разному. Например, вы можете создать:
- Поиск на основе искусственного интеллекта. Отвечайте на вопросы, используя контент веб-страницы.
- Персонализированная версия новостей: Создайте ленту, которая динамически классифицирует статьи по категориям и позволяет пользователям фильтровать контент.
- Специальные фильтры контента. Анализируйте новостные статьи и автоматически размывайте или скрывайте контент на основе заданных пользователем тем.
- Создание мероприятий в календаре. Разработайте расширение Chrome, которое автоматически извлекает сведения о мероприятиях с веб-страниц, чтобы пользователи могли создавать записи календаря всего за несколько шагов.
- Простое извлечение контактов. Создайте расширение, которое извлекает контактную информацию с сайтов, чтобы пользователям было проще связаться с компанией или добавить данные в список контактов.
Это лишь несколько примеров. Нам не терпится увидеть, что у вас получится.
Требования к оборудованию
Ниже перечислены требования к разработчикам и пользователям, которые работают с функциями, использующими эти API в Chrome. Для других браузеров могут действовать другие требования.
Language Detector API и Translator API работают в Chrome на компьютерах. Эти API не работают на мобильных устройствах.
Prompt API, Summarizer API, Writer API, Rewriter API и Proofreader API работают в Chrome, если выполняются следующие условия:
- Операционная система: Windows 10 или 11; macOS 13+ (Ventura и более поздние версии); Linux; ChromeOS (начиная с версии 16389.0.0) на устройствах Chromebook Plus. Chrome для Android, iOS и ChromeOS на устройствах, отличных от Chromebook Plus, пока не поддерживается API, использующими базовые модели.
- Хранилище. Не менее 22 ГБ свободного места на томе, где находится ваш профиль Chrome.
- Графический или центральный процессор. Встроенные модели могут работать на графическом процессоре или ЦП.
- Графический процессор: строго больше 4 ГБ видеопамяти.
- ЦП: не менее 16 ГБ ОЗУ и не менее 4 ядер ЦП.
- Примечание. Для работы Prompt API с аудиовводом требуется графический процессор.
- Сеть. Безлимитный интернет или подключение без тарификации трафика.
Точный размер Gemini Nano может меняться по мере обновления модели браузером. Чтобы узнать текущий размер, перейдите на страницу chrome://on-device-internals.
Как использовать Prompt API
Prompt API использует модель Gemini Nano в Chrome. Хотя API встроен в Chrome, модель скачивается отдельно, когда источник впервые использует API.
Чтобы определить, готова ли модель к использованию, вызовите LanguageModel.availability().
const availability = await LanguageModel.availability({
// The same options in `prompt()` or `promptStreaming()`
});
Чтобы запустить скачивание и создать экземпляр языковой модели, проверьте действия пользователя. Затем вызовите функцию create().
const session = await LanguageModel.create({
monitor(m) {
m.addEventListener('downloadprogress', (e) => {
console.log(`Downloaded ${e.loaded * 100}%`);
});
},
});
Если ответ на availability() был downloading, отслеживайте ход скачивания и сообщайте о нем пользователю, так как скачивание может занять некоторое время.
Как создать сеанс
Когда Prompt API будет готов к работе, создайте сеанс с помощью функции create().
const session = await LanguageModel.create();
Необязательный объект options функции create() принимает поле signal, которое позволяет передать AbortSignal для завершения сеанса.
const controller = new AbortController();
stopButton.onclick = () => controller.abort();
const session = await LanguageModel.create({
signal: controller.signal,
});
Параметры выборки
Управляя выборкой, вы можете настраивать, насколько предсказуемыми (детерминированными) или креативными (разнообразными) будут ответы модели. Доступность параметров выборки различается для веб-платформы и расширений Chrome:
- Веб. Используйте параметр
samplingMode, который использует описательные значения перечисления, а не необработанные числа, чтобы настроить предсказуемость выходных данных. - Расширения Chrome. Поддерживаются устаревшие числовые параметры (
topK,temperature) и методLanguageModel.params().
Режим выборки для сайтов
Передайте параметр samplingMode в LanguageModel.create() (или LanguageModel.availability()).
Поддерживаемые значения перечисления samplingMode:
"most-predictable"– самый высокий уровень детерминизма и предсказуемости."predictable"– более предсказуемый результат с минимальными вариациями."slightly-predictable"– немного предсказуемый результат."balanced"– баланс между предсказуемостью и креативностью (типичный режим работы по умолчанию)."slightly-creative"– немного разнообразные и креативные результаты."creative"– креативные и разнообразные результаты."most-creative"– максимальная вариативность и креативность.
// Available on the web with the Sampling Parameters Origin Trial enabled
const session = await LanguageModel.create({
samplingMode: 'creative',
});
// The configured sampling mode is exposed on the session instance
console.log(session.samplingMode);
// "creative"
Параметры выборки для расширений Chrome
При использовании Prompt API в расширениях Chrome каждый сеанс можно настроить с помощью topK и temperature, используя объект options.
Статическая функция LanguageModel.params() сообщает о стандартных и максимальных ограничениях параметров языковой модели:
defaultTopK– значение top-K по умолчанию.maxTopK– максимальное значение top-K.defaultTemperature– температура по умолчанию.maxTemperature– максимальная температура.
// Only available in Chrome Extensions
const params = await LanguageModel.params();
// {defaultTopK: 3, maxTopK: 128, defaultTemperature: 1, maxTemperature: 2}
// Initializing a new session in extensions must either specify both `topK` and
// `temperature` or neither of them.
const slightlyHighTemperatureSession = await LanguageModel.create({
temperature: Math.min(params.defaultTemperature * 1.2, params.maxTemperature),
topK: params.defaultTopK,
});
console.log(slightlyHighTemperatureSession.temperature);
console.log(slightlyHighTemperatureSession.topK);
Добавьте контекст с помощью начальных запросов
С помощью начальных подсказок вы можете предоставить языковой модели контекст о предыдущих взаимодействиях, например, чтобы позволить пользователю возобновить сохраненный сеанс после перезапуска браузера.
const session = await LanguageModel.create({
initialPrompts: [
{ role: 'system', content: 'You are a helpful and friendly assistant.' },
{ role: 'user', content: 'What is the capital of Italy?' },
{ role: 'assistant', content: 'The capital of Italy is Rome.' },
{ role: 'user', content: 'What language is spoken there?' },
{
role: 'assistant',
content: 'The official language of Italy is Italian. [...]',
},
],
});
Как ограничить ответы с помощью префикса
Вы можете добавить роль "assistant" в дополнение к предыдущим ролям, чтобы уточнить предыдущие ответы модели. Пример:
const followup = await session.prompt([
{
role: "user",
content: "I'm nervous about my presentation tomorrow"
},
{
role: "assistant",
content: "Presentations are tough!"
}
]);
В некоторых случаях вместо того, чтобы запрашивать новый ответ, вы можете предварительно заполнить часть ответного сообщения роли "assistant". Это может быть полезно, чтобы направить языковую модель на использование определенного формата ответа. Для этого добавьте prefix: true в конец сообщения с ролью "assistant". Пример:
const characterSheet = await session.prompt([
{
role: 'user',
content: 'Create a TOML character sheet for a gnome barbarian',
},
{
role: 'assistant',
content: '```toml\n',
prefix: true,
},
]);
Добавьте ожидаемые входные и выходные данные
Prompt API обладает мультимодальными возможностями и поддерживает несколько языков. При создании сеанса задайте модальности и языки expectedInputs и expectedOutputs.
type: ожидается модальность.- Для
expectedInputsэто может бытьtext,imageилиaudio. - Для
expectedOutputsPrompt API разрешает толькоtext.
- Для
languages: массив для настройки ожидаемого языка или языков. Prompt API принимает"en","ja","es","de"и"fr". Поддержка других языков находится в разработке.- Для
expectedInputsзадайте язык системного запроса и один или несколько языков ожидаемых запросов пользователя. - Укажите один или несколько языков
expectedOutputs.
- Для
const session = await LanguageModel.create({
expectedInputs: [
{ type: "text", languages: ["en" /* system prompt */, "ja" /* user prompt */] }
],
expectedOutputs: [
{ type: "text", languages: ["ja"] }
]
});
Если модель обнаружит неподдерживаемые входные или выходные данные, может возникнуть ошибка "NotSupportedError" DOMException.
Мультимодальные возможности
С помощью этих возможностей вы можете:
- Разрешить пользователям расшифровывать звуковые сообщения, отправленные в приложении для чата.
- Опишите изображение, загруженное на ваш сайт, чтобы использовать его в подписи или альтернативном тексте.
Посмотрите демоверсии Mediarecorder Audio Prompt и Canvas Image Prompt, чтобы узнать, как использовать Prompt API с аудио- и графическими входными данными.
Prompt API поддерживает следующие типы входных данных:
- Аудио:
- Визуальный ряд:
HTMLImageElementSVGImageElementHTMLVideoElement(используется кадр видео в текущей позиции)HTMLCanvasElementImageBitmapOffscreenCanvasVideoFrameBlobImageData
Этот фрагмент кода показывает мультимодальный сеанс, в котором сначала обрабатываются два визуальных объекта (одно изображение Blob и одно HTMLCanvasElement), а ИИ сравнивает их, а затем позволяет пользователю ответить аудиозаписью (в виде AudioBuffer).
const session = await LanguageModel.create({
expectedInputs: [
{ type: "text", languages: ["en"] },
{ type: "audio" },
{ type: "image" },
],
expectedOutputs: [{ type: "text", languages: ["en"] }],
});
const referenceImage = await (await fetch("reference-image.jpeg")).blob();
const userDrawnImage = document.querySelector("canvas");
const response1 = await session.prompt([
{
role: "user",
content: [
{
type: "text",
value:
"Give a helpful artistic critique of how well the second image matches the first:",
},
{ type: "image", value: referenceImage },
{ type: "image", value: userDrawnImage },
],
},
]);
console.log(response1);
const audioBuffer = await captureMicrophoneInput({ seconds: 10 });
const response2 = await session.prompt([
{
role: "user",
content: [
{ type: "text", value: "My response to your critique:" },
{ type: "audio", value: audioBuffer },
],
},
]);
console.log(response2);
Добавление сообщений
Инференс может занять некоторое время, особенно при создании запросов с мультимодальными входными данными. Вы можете заранее отправить определенные запросы, чтобы заполнить сеанс и дать модели возможность начать обработку.
Хотя initialPrompts полезны при создании сеанса, метод append() можно использовать в дополнение к методам prompt() или promptStreaming(), чтобы предоставлять дополнительные контекстные подсказки после создания сеанса.
Пример:
const session = await LanguageModel.create({
initialPrompts: [
{
role: 'system',
content:
'You are a skilled analyst who correlates patterns across multiple images.',
},
],
expectedInputs: [{ type: 'image' }],
});
fileUpload.onchange = async () => {
await session.append([
{
role: 'user',
content: [
{
type: 'text',
value: `Here's one image. Notes: ${fileNotesInput.value}`,
},
{ type: 'image', value: fileUpload.files[0] },
],
},
]);
};
analyzeButton.onclick = async (e) => {
analysisResult.textContent = await session.prompt(userQuestionInput.value);
};
Обещание, возвращенное append(), выполняется после того, как запрос будет проверен, обработан и добавлен в сеанс. Если запрос не удается добавить, объект возвращает отказ.
Передача схемы JSON
Добавьте поле responseConstraint в метод prompt() или promptStreaming(), чтобы передать схему JSON в качестве значения. Затем вы можете использовать структурированные выходные данные с Prompt API.
В примере ниже схема JSON гарантирует, что модель ответит true или false, чтобы классифицировать, относится ли сообщение к гончарному делу.
const session = await LanguageModel.create();
const schema = {
"type": "boolean"
};
const post = "Mugs and ramen bowls, both a bit smaller than intended, but that
happens with reclaim. Glaze crawled the first time around, but pretty happy
with it after refiring.";
const result = await session.prompt(
`Is this post about pottery?\n\n${post}`,
{
responseConstraint: schema,
}
);
console.log(JSON.parse(result));
// true
Ваша реализация может включать схему JSON или регулярное выражение как часть сообщения, отправляемого модели. Для этого используется часть окна контекста. Вы можете измерить, какую часть окна контекста он будет использовать, передав параметр responseConstraint в session.measureContextUsage().
Чтобы этого избежать, используйте параметр omitResponseConstraintInput. Если вы решите это сделать, рекомендуем включить в запрос некоторые рекомендации:
const result = await session.prompt(`
Summarize this feedback into a rating between 0-5. Only output a JSON
object { rating }, with a single property whose value is a number:
The food was delicious, service was excellent, will recommend.
`, { responseConstraint: schema, omitResponseConstraintInput: true });
Как отправить запрос модели
Вы можете отправить запрос модели с помощью функции prompt() или promptStreaming().
Вывод на основе запроса
Если вы ожидаете короткий результат, можно использовать функцию prompt(), которая возвращает ответ, как только он становится доступен.
// Start by checking if it's possible to create a session based on the
// availability of the model, and the characteristics of the device.
const available = await LanguageModel.availability({
expectedInputs: [{type: 'text', languages: ['en']}],
expectedOutputs: [{type: 'text', languages: ['en']}],
});
if (available !== 'unavailable') {
const session = await LanguageModel.create();
// Prompt the model and wait for the whole result to come back.
const result = await session.prompt('Write me a poem!');
console.log(result);
}
Потоковый вывод
Если вы ожидаете длинный ответ, используйте функцию promptStreaming(), которая позволяет показывать частичные результаты по мере их поступления от модели. Функция promptStreaming() возвращает ReadableStream.
const available = await LanguageModel.availability({
expectedInputs: [{type: 'text', languages: ['en']}],
expectedOutputs: [{type: 'text', languages: ['en']}],
});
if (available !== 'unavailable') {
const session = await LanguageModel.create();
// Prompt the model and stream the result:
const stream = session.promptStreaming('Write me an extra-long poem!');
for await (const chunk of stream) {
console.log(chunk);
}
}
Отключить подсказки
Обе функции, prompt() и promptStreaming(), принимают необязательный второй параметр с полем signal, которое позволяет остановить выполнение запросов.
const controller = new AbortController();
stopButton.onclick = () => controller.abort();
const result = await session.prompt('Write me a poem!', {
signal: controller.signal,
});
Управление сеансами
В каждом сеансе сохраняется контекст разговора. Предыдущие взаимодействия учитываются при последующих, пока не заполнится окно контекста сеанса.
Для каждого сеанса установлено максимальное количество токенов, которое можно обработать. Чтобы узнать, сколько у вас осталось, выполните следующие действия:
console.log(`${session.contextUsage}/${session.contextWindow}`);
Если запрос слишком большой, окно контекста может переполниться. В таких случаях начальные части разговора с языковой моделью будут удаляться по одной паре "запрос – ответ", пока не освободится достаточно токенов для обработки нового запроса. Исключение – системный запрос, который никогда не удаляется.
Такие переполнения можно обнаружить, прослушивая событие contextoverflow в сеансе:
session.addEventListener("contextoverflow", () => {
console.log("We've gone past the context window, and some inputs will be dropped!");
});
Если из истории чата невозможно удалить достаточное количество токенов для обработки нового запроса, то вызов prompt() или promptStreaming() завершится ошибкой с исключением QuotaExceededError и ничего не будет удалено. QuotaExceededError имеет следующие свойства:
requested– количество токенов во входных данных;contextWindow– сколько токенов было доступно;
Подробнее об управлении сеансами…
Как клонировать сеанс
Чтобы сохранить ресурсы, вы можете скопировать существующий сеанс с помощью функции clone(). При этом создается ответвление чата, в котором сохраняются контекст и исходный запрос.
Функция clone() принимает необязательный объект options с полем signal, которое позволяет передать AbortSignal для удаления клонированного сеанса.
const controller = new AbortController();
stopButton.onclick = () => controller.abort();
const clonedSession = await session.clone({
signal: controller.signal,
});
Как завершить сеанс
Если сеанс больше не нужен, вызовите destroy(), чтобы освободить ресурсы. После удаления сеанса его больше нельзя использовать, а все текущие процессы прерываются. Если вы планируете часто отправлять запросы к модели, то можете сохранить сеанс, поскольку его создание может занять некоторое время.
await session.prompt(
"You are a friendly, helpful assistant specialized in clothing choices."
);
session.destroy();
// The promise is rejected with an error explaining that
// the session is destroyed.
await session.prompt(
"What should I wear today? It is sunny, and I am choosing between a t-shirt
and a polo."
);
Деморолики
Мы создали несколько демоверсий, чтобы показать, как можно использовать Prompt API. Следующие демонстрационные версии являются веб-приложениями:
Чтобы протестировать Prompt API в расширениях Chrome, установите демоверсию расширения. Исходный код расширения доступен на GitHub.
Стратегия, нацеленная на эффективность
Prompt API для веб-страниц все ещё находится в разработке. Пока мы разрабатываем этот API, ознакомьтесь с нашими рекомендациями по управлению сеансами для оптимальной производительности.
Правила в отношении разрешений, iframe и веб-воркеры
По умолчанию Prompt API доступен только окнам верхнего уровня и их iframe из того же источника. Доступ к API можно делегировать междоменным фреймам iframe с помощью атрибута Permission Policy allow="":
<!--
The hosting site at https://main.example.com can grant a cross-origin iframe
at https://cross-origin.example.com/ access to the Prompt API by
setting the `allow="language-model"` attribute.
-->
<iframe src="https://cross-origin.example.com/" allow="language-model"></iframe>
Prompt API пока недоступен в веб-воркерах, поскольку для каждого воркера сложно создать ответственный документ, чтобы проверить соответствие правилам.
Участвуйте в тестировании и делитесь отзывами
Ваши отзывы могут напрямую повлиять на то, как мы будем создавать и внедрять будущие версии этого API и всех встроенных ИИ API.
- Чтобы оставить отзыв о реализации в Chrome, отправьте отчет об ошибке или запрос на добавление функции.
- Поделитесь своим мнением о структуре API, оставив комментарий к существующей проблеме или создав новую в репозитории Prompt API на GitHub.
- Присоединитесь к программе предварительного доступа.