API искусственного интеллекта в браузере: как использовать Built-in AI в Chrome в реальном вебе¶
Браузерный ИИ уже вышел из стадии "интересной демонстрации". В Chrome появились встроенные API, которые позволяют делать перевод, определение языка, суммаризацию и генерацию текста локально на устройстве пользователя — без собственного сервера вывода модели.
Это не означает "заменяем весь сервер на LLM". Практический сценарий другой: добавить функции ИИ туда, где важны приватность, низкая задержка и офлайн-работа, а для остальных случаев оставить серверный резервный путь.
В этой статье разберем:
- как устроен Built-in AI в Chrome;
- какие API уже можно использовать;
- какие ограничения критичны для продакшена;
- как реализовать корректный резервный путь;
- и как писать код, который не развалится на первом же устройстве без поддержки.
Что такое Built-in AI в Chrome¶
Built-in AI — это набор Web API, которые Chrome предоставляет поверх локальных моделей (включая Gemini Nano и специализированные модели для задач вроде перевода).
Ключевая идея: моделью управляет браузер, а не ваше приложение.
Вы:
- не хостите модель сами;
- не управляете обновлениями весов;
- не переносите среду выполнения вывода модели в клиент вручную;
- работаете через нативные API с проверкой доступности возможностей.
Это дает три ключевых эффекта:
- Задержка: нет сетевого обхода до сервера ИИ для каждого запроса.
- Приватность: чувствительный текст можно обработать локально.
- Контроль затрат: часть частых сценариев уходит с дорогого серверного вывода модели.
Статус API: что уже доступно¶
По данным Chrome Docs, экосистема сейчас выглядит так:
- Стабильно в Chrome 138+ (Web + Extensions):
LanguageDetector APITranslator APISummarizer API- Prompt API:
- в Extensions — доступен раньше (Chrome 138+);
- в Web — rollout в более поздних версиях (указан Chrome 148 в статус-таблице).
- Writer/Rewriter/Proofreader — в ранних стадиях (developer trial / origin trial).
Практический вывод: в обычных веб-приложениях сейчас безопаснее всего опираться на LanguageDetector, Translator, Summarizer, а генеративные сценарии строить по гибридной схеме (локально, если доступно; иначе сервер).
Ограничения, которые нужно принять сразу¶
1) Это в первую очередь настольная платформа¶
Для части API (особенно связанных с Gemini Nano) мобильные платформы пока не являются основным окружением выполнения.
2) Есть требования к железу¶
Для API на Gemini Nano у Chrome заявлены условия вроде:
- свободное место на диске (в документации фигурирует 22GB для профиля Chrome);
- достаточная RAM/CPU или GPU VRAM;
- немеренная сеть для начальной загрузки модели.
Важно: после загрузки многие сценарии могут работать офлайн.
3) availability() — не опциональная проверка¶
Перед использованием API проверяйте состояние:
unavailabledownloadabledownloadingavailable
И не забывайте, что create() часто должен вызываться только после явного действия пользователя.
Базовый шаблон интеграции (обязательный)¶
Почти для всех Built-in AI API работает одна и та же схема:
- Проверка доступности API (
'Summarizer' in selfи т.д.). availability()с нужными параметрами.- Проверка
navigator.userActivation.isActiveпередcreate(). - Подписка на
downloadprogressи индикация прогресса в интерфейсе. - Запуск пакетных или потоковых вызовов.
- Переход на серверный API при
unavailableили ошибках.
Этот шаблон лучше вынести в общий служебный слой, а не дублировать по компонентам.
Матрица решений: какой API выбрать под задачу¶
Чтобы не "стрелять LLM по воробьям", удобно держать в голове простую матрицу:
| Задача | API | Почему | Когда сразу переходить на сервер |
|---|---|---|---|
| Определить язык пользовательского текста | LanguageDetector | Быстро и недорого на клиенте | Очень короткие фразы, низкая уверенность |
| Перевести сообщение/комментарий | Translator | Локально, приватно, с минимальной задержкой | Неподдерживаемая языковая пара |
| Сжать длинную статью/тикет | Summarizer | Готовые режимы суммаризации, потоковый вывод | Нет поддержки API или ограничений устройства |
| Преобразовать свободный текст в JSON | Prompt API + responseConstraint | Контролируемый формат для логики интерфейса | Веб-окружение без поддержки Prompt API |
| Сложные рассуждения и длинные цепочки анализа | Серверный LLM | Полный контроль модели, токенов и инструментов | Почти всегда, если критично качество |
Практическое правило: локальный ИИ используем как ускоренный путь, серверный ИИ — как гарантированный путь выполнения.
Пример 1: language detection + translation¶
Классический сценарий: пользователь пишет в чат поддержки на любом языке, а оператор работает на русском.
Что важно в этом примере:
- используем confidence threshold у
LanguageDetector; - проверяем конкретную языковую пару;
- резервный переход на сервер обязателен;
- действие пользователя учитываем до
create().
Если сообщений много (например, чат), добавьте очередь, иначе длинные переводы будут блокировать следующие.
Пример 2: Summarizer API для длинных страниц¶
Полезно для документации, тикетов, журналов изменений и длинных переписок.
Практический совет: Summarizer особенно полезен как "первый проход", когда нужно быстро сократить входной объем, а затем отправить укороченную версию в серверную обработку.
Также полезно добавить ограничения на размер входа, чтобы не превращать суммаризацию в неконтролируемую операцию:
Пример 3: Prompt API со структурированным JSON-ответом¶
Этот шаблон нужен, когда требуется не "просто текст", а контролируемые данные для логики интерфейса.
Что это дает:
- меньше "болтливости" модели;
- стабильный контракт между AI-ответом и фронтендом;
- проще валидировать и логировать качество.
Для длинных ответов используйте потоковый вывод и AbortController, чтобы интерфейс не зависал:
Пример 4: служебный адаптер с корректным резервным переходом¶
Если нужен поддерживаемый код, оберните API в адаптер:
И используйте так:
Именно такие адаптеры превращают "демонстрацию API" в промышленную возможность.
Пример 5: React-хук для безопасной инициализации Summarizer¶
В реальном SPA часто нужно централизовать инициализацию, чтобы не создавать объект при каждом повторном рендеринге.
Преимущество такого хука: единая точка, где можно включить телеметрию, повторы и резервный переход.
Пример 6: маршрутизация резервного выполнения¶
Не все ошибки одинаковы. Иногда нужно сразу переходить на сервер, иногда стоит повторить локально.
Этот слой лучше держать в инфраструктурном модуле, а не в компонентах интерфейса.
Пример 7: сессии Prompt API без смешивания контекста¶
Частая ошибка: использовать одну и ту же сессию для разных предметных задач.
Так вы не смешиваете, например, "классификацию отзывов" и "генерацию писем" в одном контекстном окне.
Пример 8: интеграционный тест резервного перехода¶
В модульных тестах важно проверять не только успешный сценарий, но и переключение на сервер.
Наблюдаемость: что логировать, кроме задержки¶
Задержка — только верхушка айсберга. Для промышленной эксплуатации обычно нужны еще:
availability_state_distribution(сколько устройств вavailable/downloadable/unavailable);fallback_reason_top(какие ошибки чаще всего);prompt_response_parse_error_rate(для JSON-ответов);stream_cancel_rate(как часто пользователь прерывает генерацию);model_download_dropoff(сколько пользователей ушли во время скачивания модели).
Если эти метрики не собирать, команда не поймет, почему возможность "формально есть", но ей мало кто пользуется.
Безопасность и приватность: практический минимум¶
Built-in AI помогает приватности, но не заменяет проектирование с учетом безопасности:
- не отправляйте в локальный запрос данные, которые вообще не должны покидать защищенный контур интерфейса;
- редактируйте/маскируйте PII до вызова любого AI (и локального, и серверного);
- логируйте только технические данные (задержка/ошибка/состояние), а не полные пользовательские тексты;
- добавьте понятное пользовательское описание: "обработка может выполняться локально на устройстве".
Анти-паттерны, которые ломают качество¶
1) Один резервный сценарий "на все случаи"¶
Правильнее различать:
- неподдерживаемая возможность;
- временная ошибка окружения выполнения;
- некорректные входные данные.
2) Слишком короткие тексты для LanguageDetector¶
Одно-два слова дают шумную вероятность. Добавляйте порог уверенности и состояние "unknown".
3) Смешивание HTML и контента¶
innerHTML при суммаризации и переводе обычно ухудшает результат. Предпочитайте innerText или очищенный текст.
4) Отсутствие понятной индикации при скачивании модели¶
Если пользователь не понимает, почему операция "подвисла", он закрывает экран раньше, чем API станет полезным.
Рекомендации по интерфейсу и архитектуре¶
Показывайте, что происходит¶
Если модель скачивается, пользователь должен видеть прогресс и понимать, зачем это нужно.
Не скрывайте резервный переход¶
Локальный ИИ — это ускоренный путь, а не единственный путь выполнения.
Не переиспользуйте одну сессию для несвязанных задач¶
Для Prompt API держите сессии по предметной логике (классификация, генерация заголовков, извлечение данных), иначе получите шум в контексте.
Ограничивайте вход¶
Удаляйте HTML-разметку, служебные токены и "мусорный" текст до вызова API.
Логируйте режим выполнения¶
Минимум метрик:
local_vs_server_ratio;download_time;error_rate_by_api;p95_latency_localvsp95_latency_server.
Без этого вы не поймете, дает ли Built-in AI реальную пользу вашему продукту.
Где Built-in AI особенно хорошо окупается¶
- перевод пользовательского контента "на лету" в поддержке и чатах;
- краткая суммаризация статей, тикетов, журналов и отзывов;
- легковесная классификация и извлечение данных прямо в интерфейсе;
- офлайн-сценарии во внутренних корпоративных инструментах.
Чеклист перед выкатом в прод¶
- [ ] Есть проверка доступности для каждого API.
- [ ] Есть
availability()и обработка всех состояний. - [ ] Учитывается
userActivation. - [ ] Есть явный резервный переход на сервер.
- [ ] Добавлена индикация загрузки модели.
- [ ] Есть ограничения по размеру входа.
- [ ] Есть защита от смешивания сессий между разными доменами задач.
- [ ] Есть тесты на резервный переход и ошибки разбора ответа.
- [ ] Есть телеметрия по локальному и серверному режимам.
- [ ] Учтены ограниченные платформы (browser/os/hardware).
Вывод¶
Built-in AI в браузере — это не "замена серверной части", а новый слой оптимизации интерфейса и затрат.
Наиболее практичный путь сейчас:
- Внедрить
LanguageDetector + TranslatorилиSummarizerв узком флоу. - Добавить надежный резервный переход на сервер.
- Снимать метрики и сравнивать фактическую задержку и стоимость.
- Постепенно расширять область локального AI там, где это действительно окупается.
Так вы получите измеримую ценность, а не просто "галочку, что у нас есть AI".



