Chrome 内置 AI(Prompt API、Summarizer、Translator)能做什么?怎样检测可用性并降级?
Chrome 内置 AI 让网页调用浏览器自带的模型做摘要、翻译、语言检测和通用提示。Summarizer、Translator、Language Detector 从 Chrome 138 起在网页中稳定可用;Prompt API 在扩展中从 Chrome 138 起可用,网页版在 Chrome 148 列为可用;Writer、Rewriter、Proofreader 仍在试验阶段。使用前先检测全局对象,再用 availability() 判断状态,create() 要在用户操作后调用,不可用时回退到服务端。
简答
文章页上加一个“生成摘要”按钮,或者评论区加一个“翻译成中文”,以前要调云端接口,现在桌面版 Chrome 可以直接用浏览器自带的模型完成。Chrome 把这类能力做成了几组专用 API:Summarizer 做摘要,Translator 做翻译,Language Detector 识别语言,Prompt API 可以像聊天一样向模型发自然语言请求。
它们的状态不一样。按 Chrome 官方的状态表,Summarizer、Translator 和 Language Detector 从 Chrome 138 起在网页里稳定可用;Prompt API 在 Chrome 扩展里从 138 起可用,网页里在 Chrome 148 列为可用;Writer、Rewriter 和 Proofreader 还在试验阶段。MDN 把这些 API 都标为非 Baseline,Firefox 和 Safari 不支持,Mozilla 和 Apple 对 Prompt API 的标准立场是反对。
用之前分三步检测:先看
'Summarizer' in self这样的全局对象在不在,再调用availability(),它会返回unavailable、downloadable、downloading或available;状态是要下载时,create()必须在用户点击之类的操作之后调用,并通过monitor显示下载进度。降级是必须做的。模型只在满足要求的桌面设备上运行,比如基于基础模型的 API 要求至少 22 GB 可用磁盘空间、显存大于 4 GB 或者 16 GB 内存加 4 核 CPU,手机上都不支持。所以任何一步不满足,都要回退到服务端接口或者隐藏这个功能。
这些 API 各能做什么
Chrome 的内置 AI 不是一个大接口,而是按任务拆成几个专用 API,加一个通用的 Prompt API。
Summarizer 把一段长文本变成摘要。创建时可以选 type(key-points、tldr、teaser、headline,默认 key-points)、format(markdown 或 plain-text,默认 markdown)和 length(short、medium、long,默认 short)。Chrome 文档说明,实例创建后这些选项就不能改了,要换设置就重新创建一个。
Translator 在两种语言之间翻译,创建时必须给出 sourceLanguage 和 targetLanguage。翻译按语言包工作,用到哪对语言就下载哪对。Chrome 文档还提到,翻译请求是按顺序处理的,前面一个大请求没完成,后面的都要等着。
Language Detector 识别一段文字是什么语言,返回一组 { detectedLanguage, confidence },按可能性从高到低排,confidence 在 0 到 1 之间。Chrome 文档提醒,很短的短语和单个词识别准确率低,置信度太低时应该当作“未知语言”处理。
Prompt API 用 LanguageModel 创建一个会话,然后用 prompt() 拿完整回答,或者用 promptStreaming() 流式拿到结果。会话可以用 initialPrompts 设置系统提示,用完调用 destroy() 释放资源。MDN 说明它只在安全上下文(HTTPS)里可用。
哪些已经稳定,哪些还在试验
这部分变化快,下面以 Chrome 官方 Built-in AI APIs 页面的状态表为准:
| API | 网页 | Chrome 扩展 |
|---|---|---|
| Translator | Chrome 138 | Chrome 138 |
| Language Detector | Chrome 138 | Chrome 138 |
| Summarizer | Chrome 138 | Chrome 138 |
| Prompt | Chrome 148 | Chrome 138 |
| Writer、Rewriter | 开发者试用 | 开发者试用 |
| Proofreader | 开发者试用 | 开发者试用 |
Prompt API 的情况要多说一句。它在扩展里从 Chrome 138 起就稳定了;网页里,状态表列为 Chrome 148,但采样参数仍不一样:网页里用 samplingMode 选预设值,这部分还在 origin trial,topK、temperature 和 LanguageModel.params() 只在扩展里可用。
Chrome 之外,Chrome 文档的兼容表显示 Edge 也支持 Summarizer(138 起)和 Translator、Language Detector(148 起)。所以写代码时不能按浏览器品牌判断,只能按能力检测。
设备要求决定了很多用户用不上
即使浏览器版本够,设备不满足也用不了。Chrome 文档列出的要求是:
- 系统:Windows 10 或 11、macOS 13 及以上、Linux,或者 Chromebook Plus 上的 ChromeOS。Android、iOS 和其他 ChromeOS 设备不支持,Language Detector 和 Translator 也只在桌面版 Chrome 上工作。
- 磁盘:Prompt、Summarizer、Writer、Rewriter、Proofreader 这几个依赖基础模型的 API,要求 Chrome 用户数据所在的磁盘至少有 22 GB 可用空间;下载后可用空间低于 10 GB,Chrome 会删掉模型。
- 显卡或 CPU:显存严格大于 4 GB;或者用 CPU,要 16 GB 以上内存和 4 核以上。
- 网络:第一次下载模型需要不限流量的网络。
所以这是一个“有就用、没有也不影响”的增强功能,不能当作核心路径。
怎样检测可用性
检测分三层。先判断全局对象在不在,不在说明浏览器根本没有这个 API;再调用 availability(),它反映的是当前设备和选项能不能用;最后才 create()。
availability() 的四个返回值,MDN 和 Chrome 文档的说法一致:
unavailable:设备或请求的选项不支持。downloadable:支持,但要先下载模型或数据。downloading:正在下载,要等下载完。available:可以直接创建。
传给 availability() 的选项要和之后实际使用的一致,比如翻译要带上语言对,Prompt API 要带上 expectedInputs 和 expectedOutputs,因为模型不一定支持所有语言和输入类型。Chrome 文档还提到,出于隐私考虑,Translator 在网站真正创建某个语言对之前,会把所有语言对都报告成 downloadable。
把这套判断写成一个纯函数,可以单独验证它在各种情况下给出的决定:
function planSummary({ hasApi, availability, userActivated }) {
if (!hasApi) return 'server';
if (availability === 'unavailable') return 'server';
if (availability === 'available') return 'local';
if (!userActivated) return 'wait-for-click';
return 'local-with-progress';
}
console.log(planSummary({ hasApi: false })); // server
console.log(planSummary({ hasApi: true, availability: 'unavailable' })); // server
console.log(planSummary({ hasApi: true, availability: 'available' })); // local
console.log(planSummary({ hasApi: true, availability: 'downloadable', userActivated: false })); // wait-for-click
console.log(planSummary({ hasApi: true, availability: 'downloading', userActivated: true })); // local-with-progress
available 时可以直接在本地处理。downloadable 和 downloading 时还要看有没有用户激活,因为 Chrome 文档规定,这两种状态下用户必须先和页面有实际交互(点击、按键、触摸等),代码才能调用 create();没有的话就先显示一个按钮,等用户点。
把检测、下载和降级接到按钮上
下面是浏览器里的完整写法。summarizeOnServer 是假设的服务端回退函数:
summaryButton.addEventListener('click', async () => {
if (!('Summarizer' in self)) {
output.textContent = await summarizeOnServer(articleText);
return;
}
const availability = await Summarizer.availability();
if (availability === 'unavailable') {
output.textContent = await summarizeOnServer(articleText);
return;
}
const summarizer = await Summarizer.create({
type: 'tldr',
format: 'plain-text',
length: 'short',
monitor(m) {
m.addEventListener('downloadprogress', (e) => {
progress.value = e.loaded;
});
},
});
output.textContent = await summarizer.summarize(articleText);
summarizer.destroy();
});
为什么把 create() 放在点击回调里?因为它可能触发模型下载,Chrome 文档要求在用户激活之后调用;MDN 也写明,按规范创建 Summarizer、Translator、LanguageModel 对象都需要临时用户激活。downloadprogress 事件里的 e.loaded 是 0 到 1 之间的进度,可以直接给进度条用。
这里用 textContent 显示结果。如果用的是 format: 'markdown',要先经过 Markdown 渲染和清洗再插入页面,不能把模型输出直接交给 innerHTML,原因见《AI 生成的 Markdown 应该怎样安全地渲染?》。
用完调用 destroy()。MDN 的建议是,这些实例会占用大量资源,用完就释放。如果想中途取消,可以给 create() 或 summarize() 传一个 AbortController 的 signal。
Prompt API 的基本用法
Prompt API 是通用接口,用法接近聊天模型:
const session = await LanguageModel.create({
initialPrompts: [
{ role: 'system', content: '你是一个简洁的写作助手。' },
],
});
const answer = await session.prompt('用一句话解释什么是闭包');
for await (const chunk of session.promptStreaming('再举一个例子')) {
output.append(chunk);
}
session.destroy();
会话有上下文窗口的限制。MDN 列出了 contextWindow(总大小)、contextUsage(已用多少)和 measureContextUsage()(一段输入会占多少),超出时会触发 contextoverflow 事件。会话也可以用 clone() 复制一份,带着已有的上下文继续用。
权限策略和 iframe
这些 API 都受 Permissions Policy 控制,对应的指令分别是 summarizer、translator、language-detector 和 language-model。MDN 说明,策略禁止时,Translator、LanguageDetector、LanguageModel 的 availability() 会返回 unavailable,其他方法会抛出 NotAllowedError。所以嵌在 iframe 里的页面拿到 unavailable,不一定是设备不支持,也可能是外层页面没有放行。
和其他浏览器端推理方案怎么选
内置 AI 的好处是不用自己下载和管理模型。如果需要跨浏览器,或者要用特定的模型,就要用 ONNX Runtime Web、Transformers.js 这类方案自己加载模型,代价和检测方式见《哪些 AI 能力可以直接在浏览器中运行?》。两者可以组合:先用内置 API,不可用时再回退到自带模型或服务端。
常见追问
availability() 返回 downloadable,可以在页面加载时就 create() 吗?
不可以。Chrome 文档规定,状态是
downloadable或downloading时,用户必须先和页面有实际交互,才能调用create()。可以用navigator.userActivation.isActive判断,一般直接把create()放在按钮点击回调里,同时用monitor的downloadprogress事件告诉用户下载进度。
为什么检测了全局对象还要调 availability()?
全局对象在,只说明浏览器实现了这个 API。设备够不够、请求的语言和选项支不支持、模型下没下载、权限策略有没有禁止,都要靠
availability()判断。比如一台磁盘空间不够的电脑,Summarizer对象存在,availability()会返回unavailable。
在本地运行就意味着完全不联网吗?
推理本身在设备上做,Chrome 文档说明使用模型时不会把数据发给 Google 或第三方。但第一次要联网下载模型,翻译还会按语言对下载语言包,Chrome 也可能在磁盘空间不足时删掉模型,之后要重新下载。所以“离线可用”只在模型已经下载好、还没被删的前提下成立。