名称: web-ai-prompt-api 描述: Chrome内置Prompt API实现指南。在浏览器本地使用Gemini Nano实现AI功能 - 会话管理、多模态输入、结构化输出、流式传输、Chrome扩展。所有Prompt API开发的参考文档。
Chrome Prompt API 参考文档
使用Gemini Nano实现Chrome内置Prompt API的完整实施指南。
硬件与操作系统要求
操作系统: Windows 10/11, macOS 13+ (Ventura及以上), Linux, ChromeOS (平台版本16389.0.0+) 在Chromebook Plus上 存储空间: 22 GB可用空间(模型单独下载) GPU: >4 GB显存 或 CPU: 16 GB内存 + 4核心 网络: 无限流量连接用于下载 Chrome版本: 138+(扩展功能在稳定版中,Web功能在原始试用中)
不支持: 移动设备(Android, iOS),非Chromebook Plus的ChromeOS
检查模型大小: chrome://on-device-internals
如果下载后存储空间<10 GB,模型将被移除。
语言支持
从Chrome 140开始: 英语、西班牙语、日语(输入/输出)
可用性检查
const availability = await LanguageModel.availability();
// 返回: "unavailable" | "downloadable" | "downloading" | "available"
关键: 始终将相同的选项传递给availability()和create()。某些模型不支持特定的模态/语言。
模型参数
await LanguageModel.params();
// { defaultTopK: 3, maxTopK: 128, defaultTemperature: 1, maxTemperature: 2 }
会话创建
基础会话
const session = await LanguageModel.create();
使用自定义参数
const params = await LanguageModel.params();
const session = await LanguageModel.create({
temperature: Math.min(params.defaultTemperature * 1.2, 2.0),
topK: params.defaultTopK
});
使用下载监控
const session = await LanguageModel.create({
monitor(m) {
m.addEventListener('downloadprogress', (e) => {
console.log(`已下载 ${e.loaded * 100}%`);
});
}
});
使用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: '你是一个乐于助人的助手。' },
{ role: 'user', content: '意大利的首都是什么?' },
{ role: 'assistant', content: '意大利的首都是罗马。' },
{ role: 'user', content: '那里说什么语言?' },
{ role: 'assistant', content: '官方语言是意大利语。' }
]
});
使用场景:
- 浏览器重启后恢复存储的会话
- N-shot提示
- 设置助手个性/语气
- 提供对话历史
多模态输入(原始试用)
expectedInputs & expectedOutputs
const session = await LanguageModel.create({
expectedInputs: [
{
type: "text", // 或 "image", "audio"
languages: ["en" /* 系统 */, "ja" /* 用户提示 */]
}
],
expectedOutputs: [
{ type: "text", languages: ["ja"] }
]
});
输入类型: 文本、图像、音频 输出类型: 仅文本
如果模态不支持,抛出NotSupportedError。
使用图像/音频
const session = await LanguageModel.create({
initialPrompts: [{
role: 'system',
content: '分析图像中的模式。'
}],
expectedInputs: [{ type: 'image' }]
});
// 附加图像
await session.append([{
role: 'user',
content: [
{ type: 'text', value: '分析这张图像' },
{ type: 'image', value: fileInput.files[0] }
]
}]);
提示方法
非流式(短响应)
const result = await session.prompt('给我写一首俳句!');
console.log(result);
流式(长响应)
const stream = session.promptStreaming('给我写一首长诗!');
for await (const chunk of stream) {
console.log(chunk); // 部分结果实时到达
}
使用AbortSignal
const controller = new AbortController();
stopButton.onclick = () => controller.abort();
const result = await session.prompt('写一首诗', {
signal: controller.signal
});
响应约束(结构化输出)
传递JSON Schema以获得可预测的JSON响应:
const schema = {
type: "object",
properties: {
hashtags: {
type: "array",
maxItems: 3,
items: {
type: "string",
pattern: "^#[^\\s#]+$"
}
}
},
required: ["hashtags"],
additionalProperties: false
};
const result = await session.prompt(
`为以下内容生成标签: ${post}`,
{ responseConstraint: schema }
);
const data = JSON.parse(result); // 保证有效的JSON
简单布尔值示例:
const schema = { "type": "boolean" };
const result = await session.prompt(
`这是关于陶器的吗?
${text}`,
{ responseConstraint: schema }
);
console.log(JSON.parse(result)); // true 或 false
测量输入配额使用情况:
const usage = session.measureInputUsage({ responseConstraint: schema });
从输入配额中省略schema:
const result = await session.prompt(
`以JSON { rating } 格式总结,使用0-5数字:`,
{
responseConstraint: schema,
omitResponseConstraintInput: true
}
);
响应前缀
通过预填充助手响应来指导模型输出格式:
const result = await session.prompt([
{ role: 'user', content: '创建一个TOML角色表' },
{ role: 'assistant', content: '```toml
', prefix: true }
]);
// 模型从"```toml
"继续
append() 方法
向会话添加消息而不立即响应(对多模态有用):
await session.append([
{
role: 'user',
content: [
{ type: 'text', value: '第一个上下文消息' },
{ type: 'image', value: imageFile }
]
}
]);
// 稍后,使用累积的上下文进行提示
const result = await session.prompt('分析这些图像');
Promise在验证和附加完成后履行。
会话管理
检查配额
console.log(`${session.inputUsage}/${session.inputQuota}`);
const remaining = session.inputQuota - session.inputUsage;
当配额超出时,最旧的消息将从上下文中丢失。
克隆会话
克隆继承参数、初始提示和历史记录:
const mainSession = await LanguageModel.create({
initialPrompts: [{ role: 'system', content: '像海盗一样说话' }]
});
const clone1 = await mainSession.clone();
const clone2 = await mainSession.clone({ signal: controller.signal });
// 具有相同设置的独立对话
await clone1.prompt('给我讲一个关于鹦鹉的笑话');
await clone2.prompt('给我讲一个关于宝藏的笑话');
用于: 并行对话、"假设"场景、资源效率
从localStorage恢复会话
let sessionData = getFromLocalStorage(uuid) || {
initialPrompts: [],
topK: (await LanguageModel.params()).defaultTopK,
temperature: (await LanguageModel.params()).defaultTemperature
};
const session = await LanguageModel.create(sessionData);
// 跟踪对话
const stream = session.promptStreaming(prompt);
let result = '';
for await (const chunk of stream) {
result = chunk;
}
sessionData.initialPrompts.push(
{ role: 'user', content: prompt },
{ role: 'assistant', content: result }
);
localStorage.setItem(uuid, JSON.stringify(sessionData));
销毁会话
session.destroy();
// 释放资源,中止正在进行的执行
// 销毁后会话不可用
最佳实践: 保持一个空会话活动以保持模型加载。仅在真正完成时销毁。
用户激活要求
模型下载需要用户交互:
if (navigator.userActivation.isActive) {
const session = await LanguageModel.create();
}
粘性激活事件: 点击、轻触、按键按下、鼠标按下
权限策略与iframe
默认: 仅顶级窗口 + 同源iframe
授予跨源iframe访问权限:
<iframe src="https://cross-origin.example.com/"
allow="language-model">
</iframe>
Web Workers中不可用(权限策略复杂性)
本地开发(localhost)
- 前往
chrome://flags/#prompt-api-for-gemini-nano-multimodal-input - 选择 已启用
- 重新启动Chrome
- 打开开发者工具,输入:
await LanguageModel.availability(); - 应返回
"available"
故障排除:
- 重启Chrome
- 检查
chrome://on-device-internals→ 模型状态标签页 - 等待模型下载完成
Chrome扩展
在Chrome 138+稳定版中可用于扩展。
移除过期的原始试用权限:
{
"permissions": ["aiLanguageModelOriginTrial"] // 移除此行
}
如果需要,注册当前原始试用。
最佳实践
会话管理:
- 克隆会话以保留初始提示
- 使用AbortController让用户停止响应
- 跟踪inputUsage以在配额超出前警告
- 销毁未使用的会话以释放内存
- 保持一个空会话活动以保持模型就绪
性能:
- 对长响应使用流式传输
- 为多模态提前append()消息
- 监控下载进度,通知用户
- 在创建会话前检查可用性
结构化输出:
- 使用JSON Schema获得可预测的响应
- LLM擅长从描述生成schema
- 使用JSON Schema验证器验证
- 使用前缀进行格式指导
上下文保留:
- 将会话存储在localStorage中以供恢复
- 使用initialPrompts设置会话上下文
- 克隆以实现具有相同上下文的并行对话
错误处理
try {
const session = await LanguageModel.create();
const result = await session.prompt('你好');
} catch (err) {
if (err.name === 'AbortError') {
// 用户停止生成
} else if (err.name === 'NotSupportedError') {
// 不支持的模态/语言
} else {
console.error(err.name, err.message);
}
}
关键限制
- 仅限桌面(无移动设备)
- 需要22 GB存储空间
- 下载需要无限流量网络
- 不支持Web Workers
- 输出仅为文本(输入可以是多模态)
- 上下文窗口有令牌限制
- 如果下载后存储空间<10 GB,模型将被移除
使用场景
- 基于AI的页面内容搜索
- 内容分类/过滤
- 从页面提取事件
- 联系信息提取
- 具有对话记忆的聊天机器人
- 离线AI功能
- 隐私敏感数据处理
- 内容摘要
- 翻译辅助
- 图像/音频分析(多模态)