Подсказка API

Опубликовано: 11 ноября 2024 г., Последнее обновление: 20 мая 2025 г.

Объяснитель Веб Расширения Статус Хрома Намерение
GitHub Экспериментальный В ЕПП Chrome бета Chrome 137 бета Вид Намерение экспериментировать

С помощью API Prompt вы можете отправлять запросы на естественном языке в Gemini Nano через браузер.

Существует множество способов использования Prompt API в расширениях Chrome. Например:

  • Мгновенные события календаря . Разработайте расширение Chrome, которое автоматически извлекает сведения о событиях с веб-страниц, чтобы пользователи могли создавать записи календаря всего за несколько шагов.
  • Бесперебойное извлечение контактов . Создайте расширение, которое извлекает контактную информацию с веб-сайтов, упрощая для пользователей возможность связаться с компанией или добавить данные в свой список контактов.
  • Динамическая фильтрация контента . Создайте расширение Chrome, которое анализирует новостные статьи и автоматически размывает или скрывает контент на основе заданных пользователем тем.

Это всего лишь несколько вариантов, но нам не терпится увидеть, что вы создадите.

Используйте Prompt API в расширениях

В пространстве имен LanguageModel вам доступны две функции расширения:

  • availability() для проверки возможностей модели и ее доступности.
  • create() для запуска сеанса языковой модели.

Модель скачать

Prompt API использует модель Gemini Nano в Chrome. Хотя API встроен в Chrome, модель загружается отдельно при первом использовании API расширением.

Чтобы определить, готова ли модель к использованию, вызовите асинхронную функцию LanguageModel.availability() . Это должно вернуть один из следующих ответов:

  • 'no' : Браузер поддерживает Prompt API, но в данный момент его нельзя использовать. Это может быть вызвано рядом причин, например, нехваткой свободного места на диске для загрузки модели.
  • 'readily' : браузер поддерживает Prompt API, и его можно использовать сразу же.
  • 'after-download' : браузер поддерживает Prompt API, но сначала ему необходимо загрузить модель.

Чтобы запустить загрузку модели и создать сеанс языковой модели, вызовите асинхронную функцию LanguageModel.availability() . Если ответ на availability() был 'after-download' , лучше всего прослушивать ход загрузки. Таким образом, вы можете информировать пользователя, если загрузка займет время.

const session = await LanguageModel.create({
  monitor(m) {
    m.addEventListener("downloadprogress", (e) => {
      console.log(`Downloaded ${e.loaded} of ${e.total} bytes.`);
    });
  },
});

Возможности модели

Функция availability() также информирует вас о возможностях языковой модели. Помимо available , объект также имеет следующие поля:

await LanguageModel.availability();
// {available: 'readily', defaultTopK: 3, maxTopK: 8, defaultTemperature: 1}

Создать сессию

Как только API Prompt может быть запущен, вы создаете сеанс с помощью функции create() . Вы можете вызвать модель с помощью функции prompt() или promptStreaming() .

Настройте свой сеанс

Каждый сеанс может быть настроен с помощью topK и temperature с использованием необязательного объекта параметров. Значения по умолчанию для этих параметров возвращаются из LanguageModel.availability() .

const capabilities = await LanguageModel.availability();
// Initializing a new session must either specify both `topK` and
// `temperature` or neither of them.
const slightlyHighTemperatureSession = await LanguageModel.create({
  temperature: Math.max(availability.defaultTemperature * 1.2, 2.0),
  topK: capabilities.defaultTopK,
});

Необязательный объект параметров функции create() также принимает поле signal , которое позволяет передать AbortSignal для уничтожения сеанса.

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

const session = await LanguageModel.create({
  signal: controller.signal,
})

Первоначальные подсказки

С помощью первоначальных подсказок вы можете предоставить языковой модели контекст о предыдущих взаимодействиях, например, чтобы позволить пользователю возобновить сохраненный сеанс после перезапуска браузера.

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. [...]' }
  ]
});

Ограничения сеанса

У данной языковой модели сеанса есть максимальное количество токенов, которые он может обработать. Вы можете проверить использование и прогресс в достижении этого предела, используя следующие свойства объекта сеанса:

console.log(`${session.tokensSoFar}/${session.maxTokens}
(${session.tokensLeft} left)`);

Устойчивость сеанса

Каждая сессия отслеживает контекст разговора. Предыдущие взаимодействия учитываются для будущих взаимодействий, пока окно контекста сессии не заполнится.

const session = await LanguageModel.create({
  initialPrompts: [{
    role: "system",
    content: "You are a friendly, helpful assistant specialized in clothing choices."
  }]
});

const result1 = await session.prompt(
  "What should I wear today? It is sunny. I am unsure between a t-shirt and a polo."
);
console.log(result1);

const result2 = await session.prompt(
  "That sounds great, but oh no, it is actually going to rain! New advice?"
);
console.log(result2);

Клонировать сессию

Чтобы сохранить ресурсы, вы можете клонировать существующий сеанс с помощью функции clone() . Контекст разговора сбрасывается, но начальный запрос остается нетронутым. Функция clone() принимает необязательный объект параметров с полем signal , который позволяет вам передать AbortSignal для уничтожения клонированного сеанса.

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

const clonedSession = await session.clone({
  signal: controller.signal,
});

Подскажите модель

Вы можете вызвать модель с помощью функции 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, defaultTemperature, defaultTopK, maxTopK } =
  await LanguageModel.availability();

if (available !== 'no') {
  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() , которая позволяет отображать частичные результаты по мере их поступления от модели.

const {available, defaultTemperature, defaultTopK, maxTopK } =
  await LanguageModel.availability();

if (available !== 'no') {
  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);
  }
}

promptStreaming() возвращает ReadableStream , фрагменты которого последовательно строятся друг на друге. Например, "Hello," , "Hello world," , "Hello world I am," , "Hello world I am an AI." . Это не предполагаемое поведение. Мы намерены согласовать его с другими потоковыми API на платформе, где фрагменты являются последовательными частями одного длинного потока. Это означает, что вывод будет представлять собой последовательность типа "Hello" , " world" , " I am" , " an AI" .

На данный момент, чтобы достичь желаемого поведения, вы можете реализовать следующее. Это работает как со стандартным, так и с нестандартным поведением.

let result = '';
let previousChunk = '';

for await (const chunk of stream) {
  const newChunk = chunk.startsWith(previousChunk)
      ? chunk.slice(previousChunk.length) : chunk;
  console.log(newChunk);
  result += newChunk;
  previousChunk = chunk;
}
console.log(result);

Остановить выполнение приглашения

Оба prompt() и promptStreaming() принимают необязательный второй параметр с полем signal , который позволяет остановить выполнение подсказок.

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

const result = await session.prompt(
  'Write me a poem!',
  { 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 unsure between a
  t-shirt and a polo."
);

Демо

Чтобы протестировать Prompt API в расширениях Chrome, установите демонстрационное расширение. Исходный код расширения доступен на GitHub.

Демонстрационный интерфейс для Prompt API

Участвуйте и делитесь отзывами

Ваш вклад может напрямую повлиять на то, как мы создаем и реализуем будущие версии этого API, а также всех встроенных API ИИ.

,

Опубликовано: 11 ноября 2024 г., Последнее обновление: 20 мая 2025 г.

Объяснитель Веб Расширения Статус Хрома Намерение
GitHub Экспериментальный В ЕПП Chrome бета Chrome 137 бета Вид Намерение экспериментировать

С помощью API Prompt вы можете отправлять запросы на естественном языке в Gemini Nano через браузер.

Существует множество способов использования Prompt API в расширениях Chrome. Например:

  • Мгновенные события календаря . Разработайте расширение Chrome, которое автоматически извлекает сведения о событиях с веб-страниц, чтобы пользователи могли создавать записи календаря всего за несколько шагов.
  • Бесперебойное извлечение контактов . Создайте расширение, которое извлекает контактную информацию с веб-сайтов, упрощая для пользователей возможность связаться с компанией или добавить данные в свой список контактов.
  • Динамическая фильтрация контента . Создайте расширение Chrome, которое анализирует новостные статьи и автоматически размывает или скрывает контент на основе заданных пользователем тем.

Это всего лишь несколько вариантов, но нам не терпится увидеть, что вы создадите.

Используйте Prompt API в расширениях

В пространстве имен LanguageModel вам доступны две функции расширения:

  • availability() для проверки возможностей модели и ее доступности.
  • create() для запуска сеанса языковой модели.

Модель скачать

Prompt API использует модель Gemini Nano в Chrome. Хотя API встроен в Chrome, модель загружается отдельно при первом использовании API расширением.

Чтобы определить, готова ли модель к использованию, вызовите асинхронную функцию LanguageModel.availability() . Это должно вернуть один из следующих ответов:

  • 'no' : Браузер поддерживает Prompt API, но в данный момент его нельзя использовать. Это может быть вызвано рядом причин, например, нехваткой свободного места на диске для загрузки модели.
  • 'readily' : браузер поддерживает Prompt API, и его можно использовать сразу же.
  • 'after-download' : браузер поддерживает Prompt API, но сначала ему необходимо загрузить модель.

Чтобы запустить загрузку модели и создать сеанс языковой модели, вызовите асинхронную функцию LanguageModel.availability() . Если ответ на availability() был 'after-download' , лучше всего прослушивать ход загрузки. Таким образом, вы можете информировать пользователя, если загрузка займет время.

const session = await LanguageModel.create({
  monitor(m) {
    m.addEventListener("downloadprogress", (e) => {
      console.log(`Downloaded ${e.loaded} of ${e.total} bytes.`);
    });
  },
});

Возможности модели

Функция availability() также информирует вас о возможностях языковой модели. Помимо available , объект также имеет следующие поля:

await LanguageModel.availability();
// {available: 'readily', defaultTopK: 3, maxTopK: 8, defaultTemperature: 1}

Создать сессию

Как только API Prompt может быть запущен, вы создаете сеанс с помощью функции create() . Вы можете вызвать модель с помощью функции prompt() или promptStreaming() .

Настройте свой сеанс

Каждый сеанс может быть настроен с помощью topK и temperature с использованием необязательного объекта параметров. Значения по умолчанию для этих параметров возвращаются из LanguageModel.availability() .

const capabilities = await LanguageModel.availability();
// Initializing a new session must either specify both `topK` and
// `temperature` or neither of them.
const slightlyHighTemperatureSession = await LanguageModel.create({
  temperature: Math.max(availability.defaultTemperature * 1.2, 2.0),
  topK: capabilities.defaultTopK,
});

Необязательный объект параметров функции create() также принимает поле signal , которое позволяет передать AbortSignal для уничтожения сеанса.

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

const session = await LanguageModel.create({
  signal: controller.signal,
})

Первоначальные подсказки

С помощью первоначальных подсказок вы можете предоставить языковой модели контекст о предыдущих взаимодействиях, например, чтобы позволить пользователю возобновить сохраненный сеанс после перезапуска браузера.

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. [...]' }
  ]
});

Ограничения сеанса

У данной языковой модели сеанса есть максимальное количество токенов, которые он может обработать. Вы можете проверить использование и прогресс в достижении этого предела, используя следующие свойства объекта сеанса:

console.log(`${session.tokensSoFar}/${session.maxTokens}
(${session.tokensLeft} left)`);

Устойчивость сеанса

Каждая сессия отслеживает контекст разговора. Предыдущие взаимодействия учитываются для будущих взаимодействий, пока окно контекста сессии не заполнится.

const session = await LanguageModel.create({
  initialPrompts: [{
    role: "system",
    content: "You are a friendly, helpful assistant specialized in clothing choices."
  }]
});

const result1 = await session.prompt(
  "What should I wear today? It is sunny. I am unsure between a t-shirt and a polo."
);
console.log(result1);

const result2 = await session.prompt(
  "That sounds great, but oh no, it is actually going to rain! New advice?"
);
console.log(result2);

Клонировать сессию

Чтобы сохранить ресурсы, вы можете клонировать существующий сеанс с помощью функции clone() . Контекст разговора сбрасывается, но начальный запрос остается нетронутым. Функция clone() принимает необязательный объект параметров с полем signal , который позволяет вам передать AbortSignal для уничтожения клонированного сеанса.

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

const clonedSession = await session.clone({
  signal: controller.signal,
});

Подскажите модель

Вы можете вызвать модель с помощью функции 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, defaultTemperature, defaultTopK, maxTopK } =
  await LanguageModel.availability();

if (available !== 'no') {
  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() , которая позволяет отображать частичные результаты по мере их поступления от модели.

const {available, defaultTemperature, defaultTopK, maxTopK } =
  await LanguageModel.availability();

if (available !== 'no') {
  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);
  }
}

promptStreaming() возвращает ReadableStream , фрагменты которого последовательно строятся друг на друге. Например, "Hello," , "Hello world," , "Hello world I am," , "Hello world I am an AI." . Это не предполагаемое поведение. Мы намерены согласовать его с другими потоковыми API на платформе, где фрагменты являются последовательными частями одного длинного потока. Это означает, что вывод будет представлять собой последовательность типа "Hello" , " world" , " I am" , " an AI" .

На данный момент, чтобы достичь желаемого поведения, вы можете реализовать следующее. Это работает как со стандартным, так и с нестандартным поведением.

let result = '';
let previousChunk = '';

for await (const chunk of stream) {
  const newChunk = chunk.startsWith(previousChunk)
      ? chunk.slice(previousChunk.length) : chunk;
  console.log(newChunk);
  result += newChunk;
  previousChunk = chunk;
}
console.log(result);

Остановить выполнение приглашения

Оба prompt() и promptStreaming() принимают необязательный второй параметр с полем signal , который позволяет остановить выполнение подсказок.

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

const result = await session.prompt(
  'Write me a poem!',
  { 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 unsure between a
  t-shirt and a polo."
);

Демо

Чтобы протестировать Prompt API в расширениях Chrome, установите демонстрационное расширение. Исходный код расширения доступен на GitHub.

Демонстрационный интерфейс для Prompt API

Участвуйте и делитесь отзывами

Ваш вклад может напрямую повлиять на то, как мы создаем и реализуем будущие версии этого API, а также всех встроенных API ИИ.