Ngày xuất bản: 14 tháng 5 năm 2026
Với Prompt API trong Chrome, bạn có thể tương tác với một mô hình ngôn ngữ lớn (LLM) bằng cách sử dụng API trình duyệt cấp cao trên window.LanguageModel. Tuy nhiên, API này vẫn có khả năng hỗ trợ hạn chế và việc triển khai là một quá trình phức tạp.
| Trình duyệt | Hệ điều hành được hỗ trợ | Hệ điều hành không được hỗ trợ | Vị trí |
|---|---|---|---|
| Chrome | Windows, macOS, Linux, ChromeOS (Chromebook Plus) | Android, iOS | ✅ Được hỗ trợ |
| Edge | Windows, macOS | Android, iOS | ✅ Được hỗ trợ |
| Safari | — | — | 📋 Đã quyết định vị trí |
| Firefox | — | — | 📋 Đã quyết định vị trí |
Đồng thời, các nhà phát triển trong chương trình xem trước sớm đã chia sẻ sự nhiệt tình của họ đối với Prompt API. Việc cung cấp API này sẽ gây ra thách thức về khả năng tương thích trong tương lai gần.
Giải pháp
Đó là lý do chúng tôi phát hành một polyfill tuân thủ theo thông số kỹ định Prompt API thử nghiệm (xem mã nguồn trên GitHub) triển khai chính xác Prompt API trên các nhà cung cấp phụ trợ đám mây có thể định cấu hình và trên một nhà cung cấp phụ trợ cục bộ ở dạng Transformers.js.
Sử dụng polyfill
Để sử dụng polyfill, hãy làm như sau:
-
npm install prompt-api-polyfill Chọn xem bạn muốn sử dụng nhà cung cấp phụ trợ đám mây hay nhà cung cấp phụ trợ cục bộ:
- Nhà cung cấp phụ trợ đám mây: Dữ liệu người dùng được gửi lên đám mây để xử lý từ xa, nhưng bạn không phải đợi mô hình cục bộ có sẵn. Bạn chịu trách nhiệm cho mọi chi phí phát sinh theo thông tin giá của nhà cung cấp dịch vụ đám mây.
- Nhà cung cấp phụ trợ cục bộ: Dữ liệu người dùng vẫn ở trong trình duyệt và được xử lý cục bộ, nhưng bạn cần tải một mô hình xuống. Mô hình này không thể chia sẻ trên nhiều nguồn gốc, không giống như Prompt API thực. Không có chi phí liên quan đến việc xử lý cục bộ.
Phụ trợ đám mây
Chọn giữa bất kỳ phụ trợ đám mây nào và nhận khoá API (cũng như mọi thông tin đăng nhập bổ sung) cho nhà cung cấp phụ trợ của bạn.
Sau khi có khoá API, hãy nhập thông tin chi tiết vào tệp cấu hình .env.json. Nếu bạn không chỉ định modelName, polyfill sẽ sử dụng mô hình mặc định của từng phụ trợ. Tuy nhiên, nếu bạn chỉ định, bạn có thể chọn một trong các mô hình được hỗ trợ của từng phụ trợ.
{
"apiKey": "y0ur-Api-k3Y",
"modelName": "model-name"
}
Phụ trợ cục bộ
Nếu quyết định sử dụng nhà cung cấp phụ trợ cục bộ dựa trên Transformers.js, bạn chỉ cần một khoá API giả. Tuy nhiên, bạn có thể định cấu hình thiết bị mà Transformers.js nên sử dụng. Chọn "webgpu" để có hiệu suất tối đa và "wasm" để có khả năng tương thích tối đa. Bạn có thể tuỳ ý thay đổi chế độ cài đặt mặc định. Chọn một mô hình khác trong danh mục mô hình tương thích của Hugging Face. Đối với một số mô hình, bạn có thể chọn trong số các lượng tử hoá khác nhau bằng cách sử dụng tham số dtype.
{
"apiKey": "dummy",
"device": "webgpu",
"dtype": "q4f16",
"modelName": "onnx-community/gemma-3-1b-it-ONNX-GQA"
};
Định cấu hình polyfill
Sau khi có tệp cấu hình, bạn có thể bắt đầu sử dụng polyfill trong ứng dụng của mình.
- Nhập tệp cấu hình và gán tệp đó cho một biến toàn cục có tên phù hợp, trong đó
$BACKENDlà phụ trợ bạn đã chọn:window.$BACKEND_CONFIG. - Sử dụng tính năng nhập động để chỉ tải polyfill khi trình duyệt cơ bản không hỗ trợ.
- Gọi các hàm Prompt API.
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!');
Polyfill hỗ trợ đầu ra có cấu trúc (ngoại trừ phụ trợ Transformers.js), xử lý dữ liệu đầu vào đa phương thức (ngoại trừ phụ trợ OpenAI không hỗ trợ âm thanh và hình ảnh cùng nhau, chỉ hỗ trợ riêng biệt) và được kiểm thử dựa trên bộ kiểm thử nền tảng web hoàn chỉnh cho LanguageModel.
Để biết thêm thông tin cơ bản và thông tin chi tiết về cách sử dụng cũng như mã nguồn, hãy xem tệp README trong kho lưu trữ GitHub.
Sự khác biệt so với Prompt API của trình duyệt
Nếu polyfill được hỗ trợ bởi các mô hình đám mây, thì một số lợi ích của việc chạy phía máy khách sẽ không còn áp dụng nữa. Cụ thể là bạn không còn có thể đảm bảo việc xử lý cục bộ dữ liệu nhạy cảm, mặc dù các chính sách quyền riêng tư của nhà cung cấp phụ trợ vẫn áp dụng. Ứng dụng của bạn cũng không còn có thể sử dụng AI khi người dùng ở chế độ ngoại tuyến. Để biết bạn đang ở chế độ trực tuyến hay ngoại tuyến, bạn có thể theo dõi các sự kiện tương ứng.
window.addEventListener("offline", (e) => {
console.log("offline");
});
window.addEventListener("online", (e) => {
console.log("online");
});
Nếu suy luận AI chạy dựa trên một mô hình trên đám mây, thì sẽ không có mô hình cục bộ nào để tải xuống. Polyfill giả mạo các sự kiện downloadprogress, vì vậy, đối với ứng dụng của bạn, sẽ có vẻ như mô hình tích hợp đã được tải xuống. Điều này có nghĩa là sẽ có 2 sự kiện, một sự kiện có giá trị loaded là 0 và một sự kiện có giá trị 1. Đây là yêu cầu của thông số kỹ thuật.
Với suy luận dựa trên đám mây, không giống như suy luận trên thiết bị, có thể phát sinh chi phí khi gọi API từ nhà cung cấp phụ trợ mà bạn chọn. Hãy xem thông tin giá, chẳng hạn như thông tin giá cho Gemini API. Nếu biết chi phí cho mỗi mã thông báo, bạn có thể sử dụng thông tin contextUsage của Prompt API để tính chi phí.
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.
}
Khi bạn gọi trực tiếp một API đám mây từ ứng dụng di động hoặc ứng dụng web (ví dụ: các API cho phép truy cập vào các mô hình AI tạo sinh), khoá API sẽ dễ bị các ứng dụng trái phép lạm dụng. Để giúp bảo vệ các API này, nếu bạn sử dụng SDK Firebase AI Logic Hybrid, bạn nên sử dụng Kiểm tra ứng dụng Firebase để xác minh rằng tất cả các lệnh gọi API đến đều đến từ ứng dụng thực của bạn. Với một số nhà cung cấp dịch vụ đám mây như Google, bạn cũng có thể thực thi các lượt kiểm tra nguồn gốc nghiêm ngặt để đảm bảo chỉ những trang web được phép mới có thể sử dụng API.
Thay vì các giới hạn của Prompt API, ví dụ: liên quan đến contextWindow của phiên, các giới hạn của nhà cung cấp phụ trợ sẽ được áp dụng. Đối với contextWindow, các giới hạn này thường cao hơn nhiều so với trên thiết bị và bạn có thể xử lý lượng dữ liệu lớn hơn trên đám mây. Vì vậy, mặc dù bạn nên biết về sự khác biệt này, nhưng trên thực tế, bạn có thể sẽ không gặp phải vấn đề này.
Tạo phụ trợ của riêng bạn
Để thêm nhà cung cấp phụ trợ của riêng bạn, hãy làm theo các bước sau:
Mở rộng lớp phụ trợ cơ sở
Tạo một tệp mới trong thư mục backends/, ví dụ: backends/custom-backend.js. Bạn cần mở rộng lớp PolyfillBackend và triển khai các phương thức cốt lõi đáp ứng giao diện dự kiến.
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)
}
}
Đăng ký phụ trợ
Polyfill sử dụng chiến lược "Ưu tiên kết quả trùng khớp đầu tiên" dựa trên cấu hình chung. Bạn cần đăng ký phụ trợ trong tệp prompt-api-polyfill.js bằng cách thêm phụ trợ đó vào mảng #backends tĩnh:
// prompt-api-polyfill.js
static #backends = [
// ... existing backends
{
config: 'CUSTOM_CONFIG', // The global object to look for on `window`
path: './backends/custom-backend.js',
},
];
Đặt mô hình mặc định
Xác định danh tính mô hình dự phòng trong backends/defaults.js. Mô hình này được sử dụng khi người dùng khởi chạy một phiên mà không chỉ định modelName cụ thể.
// backends/defaults.js
export const DEFAULT_MODELS = {
// ...
custom: 'custom-model-pro-v1',
};
Bật tính năng phát triển và kiểm thử cục bộ
Dự án này sử dụng một tập lệnh khám phá (scripts/list-backends.js) để tạo ma trận kiểm thử. Để đưa phụ trợ mới vào trình chạy kiểm thử, hãy tạo tệp .env-[name].json (ví dụ: .env-custom.json) trong thư mục gốc:
{
"apiKey": "your-api-key-here",
"modelName": "custom-model-pro-v1"
}
Xác minh bằng Bộ kiểm thử nền tảng web (WPT)
Bước cuối cùng là đảm bảo tuân thủ. Vì polyfill được điều khiển theo thông số kỹ thuật, nên mọi phụ trợ mới đều phải vượt qua Bộ kiểm thử nền tảng web chính thức (hoặc dự kiến):
npm run test:wpt
Bước xác minh này đảm bảo rằng phụ trợ của bạn xử lý các nội dung như AbortSignal, lời nhắc hệ thống và định dạng nhật ký chính xác như thông số kỹ thuật của Prompt API.
Kết luận
Polyfill giúp bạn sử dụng Prompt API trên mọi nền tảng và thiết bị. Bằng cách viết mã dựa trên API được xác định rõ ràng của Prompt API, bạn sẽ trở nên độc lập hơn với các nhà cung cấp đám mây và duy trì càng gần nền tảng càng tốt.
Trên các thiết bị có khả năng hỗ trợ Prompt API, polyfill thậm chí còn không được tải, vì vậy, bạn sẽ không phải tải mã mà người dùng sẽ không thực thi. Nếu bạn có ý kiến phản hồi hoặc gặp lỗi, hãy mở một Vấn đề trên GitHub. Chúc bạn sử dụng lời nhắc hiệu quả!