Экспериментальный полифил для API Prompt.

Опубликовано: 14 мая 2026 г.

С помощью API Prompt в Chrome можно взаимодействовать с языковой моделью (LLM), используя высокоуровневый API браузера, основанный на window.LanguageModel . Однако поддержка этой функции пока ограничена, а её реализация — сложный процесс.

Браузер Поддерживаемые ОС Неподдерживаемая ОС Позиция
Хром Windows, macOS, Linux, ChromeOS (Chromebook Plus) Android, iOS ✅ Поддерживается
Край Windows, macOS Android, iOS ✅ Поддерживается
Сафари 📋 Позиция определена
Firefox 📋 Позиция определена

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

Решение

Именно поэтому мы выпускаем экспериментальный полифил для Prompt API, соответствующий спецификации ( исходный код можно посмотреть на GitHub), который точно реализует Prompt API как на основе настраиваемых облачных бэкенд-провайдеров, так и на основе локального бэкенд-провайдера в виде Transformers.js .

Используйте полифил.

Для использования полифила выполните следующие действия:

  1. Скачайте полифилл из npm :

    npm install prompt-api-polyfill
    
  2. Выберите, хотите ли вы использовать облачного или локального поставщика серверной части:

    • Облачный бэкэнд-провайдер: Данные пользователя отправляются в облако для удаленной обработки, но вам не нужно ждать, пока станет доступна локальная модель. Вы несете ответственность за любые понесенные расходы в соответствии с ценовой политикой вашего облачного провайдера.
    • Локальный бэкэнд-провайдер: данные пользователя остаются в браузере и обрабатываются локально, но вам необходимо загрузить модель, которая, в отличие от настоящего API Prompt, не может быть использована в разных местах. Локальная обработка не влечет за собой никаких затрат.

Облачная серверная часть

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

Получив ключ API, введите его данные в файл конфигурации .env.json . Если вы не укажете modelName , полифилл будет использовать модель по умолчанию для каждого бэкенда, но если вы укажете modelName, вы сможете выбрать одну из поддерживаемых моделей каждого бэкенда.

{
  "apiKey": "y0ur-Api-k3Y",
  "modelName": "model-name"
}

Локальный бэкэнд

Если вы решите использовать локальный бэкенд-провайдер на основе Transformers.js, вам понадобится только фиктивный API-ключ. Однако вы можете настроить, какое устройство должен использовать Transformers.js. Выберите "webgpu" для максимальной производительности и "wasm" для максимальной совместимости. При желании вы можете изменить настройки по умолчанию. Выберите другую модель из каталога совместимых моделей Hugging Face . Для некоторых моделей вы можете выбрать различные варианты квантования, используя параметр dtype .

{
  "apiKey": "dummy",
  "device": "webgpu",
  "dtype": "q4f16",
  "modelName": "onnx-community/gemma-3-1b-it-ONNX-GQA"
};

Настройте свой полифил

После того, как файл конфигурации будет готов, вы можете начать использовать полифилл в своем приложении.

  1. Импортируйте файл конфигурации и присвойте его глобальной переменной с соответствующим именем, где $BACKEND — это выбранный вами бэкенд: window.$BACKEND_CONFIG .
  2. Используйте динамический импорт, чтобы загружать полифилл только в том случае, если используемый браузер его не поддерживает.
  3. Вызовите функции API Prompt .
import config from './.env.json' with { type: 'json' };

// Set $BACKEND_CONFIG to select a backend
window.$BACKEND_CONFIG = config;

if (!('LanguageModel' in window)) {
  await import('prompt-api-polyfill');
}

const session = await LanguageModel.create({
  expectedInputs: [{type: 'text', languages: ['en']}],
  expectedOutputs: [{type: 'text', languages: ['en']}],
});
await session.prompt('Tell me a joke!');

Полифил поддерживает структурированный вывод (за исключением бэкенда Transformers.js), обрабатывает многомодальный ввод (за исключением бэкенда OpenAI, который не поддерживает аудио и изображения одновременно, а только по отдельности) и протестирован с использованием полного набора тестов веб-платформы для LanguageModel .

Более подробную информацию об использовании, а также исходный код можно найти в файле README в репозитории GitHub .

Отличие от API подсказок браузера

Если полифил использует облачные модели, некоторые преимущества работы на стороне клиента перестают действовать. В частности, вы больше не можете гарантировать локальную обработку конфиденциальных данных, хотя политика конфиденциальности вашего бэкэнд-провайдера по-прежнему применяется. Ваше приложение также больше не сможет использовать ИИ, когда пользователь находится в автономном режиме. Чтобы узнать, подключены вы к сети или нет, вы можете отслеживать соответствующие события.

window.addEventListener("offline", (e) => {
  console.log("offline");
});

window.addEventListener("online", (e) => {
  console.log("online");
});

Если вывод ИИ выполняется на основе модели в облаке, локальной модели для загрузки нет. Полифил имитирует события downloadprogress , поэтому для вашего приложения будет казаться, что встроенная модель уже загружена, а это значит, что будет два события: одно со loaded 0 , а другое — 1 , что и требуется спецификацией.

В отличие от вывода данных на устройстве, при использовании облачных сервисов вывода информации могут возникать дополнительные затраты при вызове API от выбранного вами бэкэнд-провайдера. Проверьте информацию о ценах, например, для API Gemini . Если вам известна стоимость за токен, вы можете использовать информацию contextUsage из API Prompt для расчета стоимости.

const COST_PER_TOKEN = 123;
const COST_LIMIT = 456;

let costSoFar = 0;

const session = await LanguageModel.create(options);

/…/

if (costSoFar < COST_LIMIT) {
  await session.prompt('Tell me a joke.');
  costSoFar = session.contextUsage * COST_PER_TOKEN;
} else {
  // Show premium AI plan promo.
}

При прямом вызове облачного API из мобильного или веб-приложения (например, API, предоставляющие доступ к моделям генеративного ИИ) ключ API уязвим для злоупотреблений со стороны неавторизованных клиентов. Для защиты таких API, если вы используете Firebase AI Logic Hybrid SDK, следует использовать Firebase App Check , чтобы убедиться, что все входящие вызовы API поступают из вашего приложения. У некоторых облачных провайдеров, таких как Google, также можно применять строгие проверки источника, чтобы гарантировать, что API могут использовать только разрешенные веб-сайты .

Например, ограничения API Prompt в отношении contextWindow сессии применяются не к параметрам, а к параметрам бэкэнд-провайдера. Для contextWindow эти ограничения, как правило, намного выше, чем на устройстве, и в облаке можно обрабатывать большие объемы данных, поэтому, хотя вы должны знать об этой разнице, на практике у вас, скорее всего, не возникнет проблем.

Создайте собственную серверную часть.

Чтобы добавить собственный бэкэнд-провайдер, выполните следующие шаги:

Расширьте базовый класс бэкэнда.

Создайте новый файл в каталоге backends/ , например, backends/custom-backend.js . Вам необходимо расширить класс PolyfillBackend и реализовать основные методы, удовлетворяющие ожидаемому интерфейсу.

import PolyfillBackend from './base.js';
import { DEFAULT_MODELS } from './defaults.js';

export default class CustomBackend extends PolyfillBackend {
  constructor(config) {
    // config typically comes from a window global (e.g., window.CUSTOM_CONFIG)
    super(config.modelName || DEFAULT_MODELS.custom.modelName);
  }

  // Check if the backend is configured (e.g., API key is present), if given
  // combinations of modelName and options are supported, or, for local model,
  // if the model is available.
  static availability(options) {
    return window.CUSTOM_CONFIG?.apiKey ? 'available' : 'unavailable';
  }

  // Initialize the underlying SDK or API client. With local models, use
  // monitorTarget to report model download progress to the polyfill.
  createSession(options, sessionParams, monitorTarget) {
    // Return the initialized session or client instance
  }

  // Non-streaming prompt execution
  async generateContent(contents) {
    // contents: Array of { role: 'user'|'model', parts: [{ text: string }] }
    // Return: { text: string, usage: number }
  }

  // Streaming prompt execution
  async generateContentStream(contents) {
    // Return: AsyncIterable yielding chunks
  }

  // Token counting for quota/usage tracking
  async countTokens(contents) {
    // Return: total token count (number)
  }
}

Зарегистрируйте свой бэкэнд

Полифил использует стратегию "Приоритет первого совпадения", основанную на глобальной конфигурации. Вам необходимо зарегистрировать свой бэкенд в файле prompt-api-polyfill.js , добавив его в статический массив #backends :

// prompt-api-polyfill.js
static #backends = [
  // ... existing backends
  {
    config: 'CUSTOM_CONFIG', // The global object to look for on `window`
    path: './backends/custom-backend.js',
  },
];

Установить модель по умолчанию

Задайте резервный идентификатор модели в backends/defaults.js . Это используется, когда пользователь инициализирует сессию, не указывая конкретное modelName .

// backends/defaults.js
export const DEFAULT_MODELS = {
  // ...
  custom: 'custom-model-pro-v1',
};

Обеспечьте локальную разработку и тестирование.

В проекте используется скрипт обнаружения ( scripts/list-backends.js ) для генерации тестовых матриц. Чтобы включить ваш новый бэкенд в средство запуска тестов, создайте файл .env-[name].json (например, .env-custom.json ) в корневом каталоге:

{
  "apiKey": "your-api-key-here",
  "modelName": "custom-model-pro-v1"
}

Проверьте с помощью тестов веб-платформы (WPT).

Последний шаг — обеспечение соответствия требованиям. Поскольку полифилл основан на спецификации, любой новый бэкенд должен пройти официальные (или предварительные) тесты веб-платформы:

npm run test:wpt

Этот этап проверки гарантирует, что ваш бэкэнд обрабатывает такие вещи, как AbortSignal , системные подсказки и форматирование истории, точно так, как ожидает спецификация Prompt API.

Заключение

Полифил позволяет использовать API Prompt на всех платформах и устройствах. Используя хорошо определенный API Prompt, вы становитесь более независимыми от облачных провайдеров и остаетесь максимально близки к платформе.

На устройствах, поддерживающих API Prompt, полифил даже не загружается, поэтому вы избавляете пользователей от необходимости скачивать код, который они не будут выполнять. Если у вас есть отзывы или вы обнаружили ошибку, создайте заявку на GitHub. Удачных запросов!

См. также

Экспериментальные полифилы для встроенных API задач ИИ.