تاريخ النشر: 20 مايو 2025، تاريخ آخر تعديل: 21 أكتوبر 2026
| فيديو توضيحي | الويب | الإضافات | حالة Chrome | النيّة بالشراء |
|---|---|---|---|---|
| Github | العرض | Intent to Ship | ||
| Github | العرض | Intent to Experiment |
باستخدام واجهة برمجة التطبيقات Prompt API، يمكنك إرسال طلبات بلغة طبيعية إلى النموذج الأساسي في Chrome.
هناك العديد من الطرق التي يمكنك من خلالها استخدام Prompt API. على سبيل المثال، يمكنك إنشاء:
- البحث المستنِد إلى الذكاء الاصطناعي: يمكنك الإجابة عن الأسئلة استنادًا إلى محتوى صفحة ويب.
- خلاصات الأخبار المخصّصة: يمكنك إنشاء خلاصة تصنّف المقالات ديناميكيًا حسب الفئات وتسمح للمستخدمين بفلترة هذا المحتوى.
- فلاتر المحتوى المخصّصة: تحليل المقالات الإخبارية وتمويه المحتوى أو إخفاؤه تلقائيًا استنادًا إلى مواضيع يحدّدها المستخدم
- إنشاء حدث في التقويم تطوير إضافة Chrome تستخرج تفاصيل الأحداث تلقائيًا من صفحات الويب، ليتمكّن المستخدمون من إنشاء إدخالات في التقويم ببضع خطوات فقط
- استخراج جهات الاتصال بسلاسة: يمكنك إنشاء إضافة تستخرج معلومات الاتصال من المواقع الإلكترونية، ما يسهّل على المستخدمين التواصل مع نشاط تجاري أو إضافة تفاصيل إلى قائمة جهات الاتصال الخاصة بهم.
هذه بعض الاحتمالات فقط، ونحن متحمّسون لرؤية ابتكاراتك.
مراجعة متطلبات الأجهزة
تنطبق المتطلبات التالية على المطوّرين والمستخدمين الذين يشغّلون الميزات باستخدام واجهات برمجة التطبيقات هذه في Chrome. قد تختلف متطلبات التشغيل في المتصفّحات الأخرى.
تعمل واجهتا برمجة التطبيقات Language Detector وTranslator في Chrome على أجهزة الكمبيوتر المكتبي. لا تعمل واجهات برمجة التطبيقات هذه على الأجهزة الجوّالة.
تعمل واجهات برمجة التطبيقات Prompt API وSummarizer API وWriter API وRewriter API وProofreader API في Chrome عند استيفاء الشروط التالية:
- نظام التشغيل: Windows 10 أو 11، أو macOS 13 أو إصدار أحدث (Ventura والإصدارات الأحدث)، أو Linux، أو ChromeOS (من الإصدار 16389.0.0 والإصدارات الأحدث) على أجهزة Chromebook Plus لا تتوافق واجهات برمجة التطبيقات التي تستخدم النماذج الأساسية مع متصفّح Chrome لنظام Android وiOS وChromeOS على الأجهزة غير المزوّدة بميزات Chromebook Plus.
- مساحة التخزين: يجب توفّر مساحة خالية لا تقل عن 22 غيغابايت على وحدة التخزين التي تحتوي على ملفك الشخصي على Chrome.
- وحدة معالجة الرسومات أو وحدة المعالجة المركزية: يمكن تشغيل النماذج المضمّنة باستخدام وحدة معالجة الرسومات أو وحدة المعالجة المركزية.
- وحدة معالجة الرسومات: أكثر من 4 غيغابايت من ذاكرة الوصول العشوائي للفيديو (VRAM)
- وحدة المعالجة المركزية: ذاكرة وصول عشوائي (RAM) بسعة 16 غيغابايت أو أكثر و4 نوى لوحدة المعالجة المركزية أو أكثر
- ملاحظة: تتطلّب واجهة برمجة التطبيقات Prompt API مع الإدخال الصوتي وحدة معالجة رسومات.
- الشبكة: بيانات غير محدودة أو اتصال لا يفرض تكلفة استخدام
قد يختلف حجم Gemini Nano الدقيق عندما يحدّث المتصفّح النموذج. لمعرفة الحجم الحالي، يُرجى الانتقال إلى chrome://on-device-internals.
استخدام Prompt API
تستخدم واجهة برمجة التطبيقات Prompt API نموذج Gemini Nano في Chrome. على الرغم من أنّ واجهة برمجة التطبيقات مدمجة في Chrome، يتم تنزيل النموذج بشكل منفصل في المرة الأولى التي يستخدم فيها مصدر واجهة برمجة التطبيقات.
لتحديد ما إذا كان النموذج جاهزًا للاستخدام، يمكنك استدعاء
LanguageModel.availability().
const availability = await LanguageModel.availability({
// The same options in `prompt()` or `promptStreaming()`
});
لبدء عملية التنزيل وإنشاء مثيل للنموذج اللغوي، تحقَّق من
نشاط المستخدم. بعد ذلك، استدعِ
الدالة create().
const session = await LanguageModel.create({
monitor(m) {
m.addEventListener('downloadprogress', (e) => {
console.log(`Downloaded ${e.loaded * 100}%`);
});
},
});
إذا كان الردّ على "availability()" هو "downloading"، يُرجى الاستماع إلى
مستوى تقدُّم عملية التنزيل وإبلاغ المستخدم،
لأنّ عملية التنزيل قد تستغرق بعض الوقت.
إنشاء جلسة
بعد أن تصبح واجهة Prompt API جاهزة للتشغيل، يمكنك إنشاء جلسة باستخدام الدالة create().
const session = await LanguageModel.create();
تتلقّى دالة create() كائن خيارات اختياريًا يتضمّن حقل signal، ما يتيح لك تمرير AbortSignal لإنهاء الجلسة.
const controller = new AbortController();
stopButton.onclick = () => controller.abort();
const session = await LanguageModel.create({
signal: controller.signal,
});
مَعلَمات اختيار العيّنات
يتيح لك التحكّم في أخذ العينات ضبط مدى قابلية توقّع ردود النموذج (حتمية) أو إبداعها (متنوعة). يختلف مدى توفّر مَعلمات أخذ العينات بين منصة الويب وإضافات Chrome:
- الويب: استخدِم الخيار
samplingModeالذي يستخدم قيم تعداد وصفية بدلاً من الأرقام الأولية لضبط إمكانية توقّع النتائج. - إضافات Chrome: تتوافق مع المَعلمات الرقمية القديمة (
topKوtemperature) والطريقةLanguageModel.params().
وضع جمع العيّنات على الويب
مرِّر الخيار samplingMode إلى LanguageModel.create() (أو
LanguageModel.availability()).
قيم تعداد الخيارات المسموح بها في samplingMode هي:
-
"most-predictable": أعلى مستوى من الحتمية والقدرة على التوقّع -
"predictable": ناتج أكثر قابلية للتوقّع مع الحد الأدنى من التباين. -
"slightly-predictable": ناتج يمكن توقّعه قليلاً -
"balanced": توازن بين القدرة على التوقّع والإبداع (الإعداد التلقائي المعتاد) -
"slightly-creative": ردود متنوعة وإبداعية بعض الشيء -
"creative": ناتج إبداعي ومتنوع -
"most-creative": أقصى قدر من التنوّع والإبداع
// Available on the web with the Sampling Parameters Origin Trial enabled
const session = await LanguageModel.create({
samplingMode: 'creative',
});
// The configured sampling mode is exposed on the session instance
console.log(session.samplingMode);
// "creative"
مَعلَمات اختيار العيّنات لإضافات Chrome
عند استخدام Prompt API في إضافات Chrome، يمكن تخصيص كل جلسة باستخدام topK وtemperature من خلال عنصر الخيارات.
تُعلمك الدالة الثابتة LanguageModel.params() بالحدود التلقائية والقصوى لمعلَمات النموذج اللغوي:
-
defaultTopK: القيمة التلقائية لـ top-K. -
maxTopK: الحد الأقصى لقيمة top-K . -
defaultTemperature: درجة الحرارة التلقائية -
maxTemperature: الحدّ الأقصى لدرجة الحرارة
// Only available in Chrome Extensions
const params = await LanguageModel.params();
// {defaultTopK: 3, maxTopK: 128, defaultTemperature: 1, maxTemperature: 2}
// Initializing a new session in extensions must either specify both `topK` and
// `temperature` or neither of them.
const slightlyHighTemperatureSession = await LanguageModel.create({
temperature: Math.min(params.defaultTemperature * 1.2, params.maxTemperature),
topK: params.defaultTopK,
});
console.log(slightlyHighTemperatureSession.temperature);
console.log(slightlyHighTemperatureSession.topK);
إضافة سياق من خلال الطلبات الأولية
باستخدام الطلبات الأولية، يمكنك تزويد النموذج اللغوي بسياق حول التفاعلات السابقة، على سبيل المثال، للسماح للمستخدم باستئناف جلسة مخزّنة بعد إعادة تشغيل المتصفّح.
const session = await LanguageModel.create({
initialPrompts: [
{ role: 'system', content: 'You are a helpful and friendly assistant.' },
{ role: 'user', content: 'What is the capital of Italy?' },
{ role: 'assistant', content: 'The capital of Italy is Rome.' },
{ role: 'user', content: 'What language is spoken there?' },
{
role: 'assistant',
content: 'The official language of Italy is Italian. [...]',
},
],
});
تقييد الردود باستخدام بادئة
يمكنك إضافة دور "assistant"، بالإضافة إلى الأدوار السابقة، لتوضيح
ردود النموذج السابقة. على سبيل المثال:
const followup = await session.prompt([
{
role: "user",
content: "I'm nervous about my presentation tomorrow"
},
{
role: "assistant",
content: "Presentations are tough!"
}
]);
في بعض الحالات، بدلاً من طلب ردّ جديد، قد تحتاج إلى
ملء جزء من رسالة الردّ الخاصة بدور "assistant" مسبقًا. يمكن أن يكون هذا مفيدًا لتوجيه النموذج اللغوي
لاستخدام تنسيق استجابة محدد. لإجراء ذلك، أضِف
prefix: true إلى رسالة الدور "assistant" اللاحقة. على سبيل المثال:
const characterSheet = await session.prompt([
{
role: 'user',
content: 'Create a TOML character sheet for a gnome barbarian',
},
{
role: 'assistant',
content: '```toml\n',
prefix: true,
},
]);
إضافة الطلب والرد المتوقعَين
تتضمّن واجهة Prompt API إمكانات متعددة الوسائط وتتيح استخدام لغات متعددة. اضبط الوضعَين expectedInputs وexpectedOutputs
واللغات عند إنشاء جلستك.
-
type: يجب إدخال نمط البيانات.- بالنسبة إلى
expectedInputs، يمكن أن تكون هذه القيمةtextأوimageأوaudio. - بالنسبة إلى
expectedOutputs، تتيح واجهة برمجة التطبيقات Prompt API استخدامtextفقط.
- بالنسبة إلى
-
languages: مصفوفة لضبط اللغة أو اللغات المتوقّعة تقبل واجهة برمجة التطبيقات Prompt API المَعلمات"en"و"ja"و"es"و"de"و"fr". ونعمل حاليًا على إتاحة لغات إضافية.- بالنسبة إلى "
expectedInputs"، اضبط لغة طلب النظام ولغة واحدة أو أكثر من لغات طلبات المستخدمين المتوقعة. - اضبط لغة واحدة أو أكثر من لغات
expectedOutputs.
- بالنسبة إلى "
const session = await LanguageModel.create({
expectedInputs: [
{ type: "text", languages: ["en" /* system prompt */, "ja" /* user prompt */] }
],
expectedOutputs: [
{ type: "text", languages: ["ja"] }
]
});
قد يظهر لك استثناء "NotSupportedError" DOMException إذا واجه النموذج
إدخالاً أو إخراجًا غير متوافق.
الإمكانات المتعددة الوسائط
باستخدام هذه الإمكانات، يمكنك:
- يمكنك السماح للمستخدمين بتحويل الرسائل الصوتية المُرسَلة في تطبيق محادثة إلى نص.
- يمكنك وصف صورة تم تحميلها إلى موقعك الإلكتروني لاستخدامها في شرح أو نص بديل.
يمكنك الاطّلاع على العرض التوضيحي Mediarecorder Audio Prompt لاستخدام Prompt API مع الإدخال الصوتي، والعرض التوضيحي Canvas Image Prompt لاستخدام Prompt API مع إدخال الصور.
تتيح واجهة برمجة التطبيقات Prompt API أنواع الإدخال التالية:
- الصوت:
- المرئيات:
HTMLImageElementSVGImageElementHTMLVideoElement(يستخدم إطار الفيديو في موضع الفيديو الحالي)HTMLCanvasElementImageBitmapOffscreenCanvasVideoFrameBlobImageData
يعرض هذا المقتطف جلسة متعددة الوسائط تعالج أولاً عنصرَين مرئيَّين (صورة واحدة Blob وHTMLCanvasElement واحدة) وتطلب من الذكاء الاصطناعي مقارنتهما، ثم تتيح للمستخدم الردّ بتسجيل صوتي (كـ AudioBuffer).
const session = await LanguageModel.create({
expectedInputs: [
{ type: "text", languages: ["en"] },
{ type: "audio" },
{ type: "image" },
],
expectedOutputs: [{ type: "text", languages: ["en"] }],
});
const referenceImage = await (await fetch("reference-image.jpeg")).blob();
const userDrawnImage = document.querySelector("canvas");
const response1 = await session.prompt([
{
role: "user",
content: [
{
type: "text",
value:
"Give a helpful artistic critique of how well the second image matches the first:",
},
{ type: "image", value: referenceImage },
{ type: "image", value: userDrawnImage },
],
},
]);
console.log(response1);
const audioBuffer = await captureMicrophoneInput({ seconds: 10 });
const response2 = await session.prompt([
{
role: "user",
content: [
{ type: "text", value: "My response to your critique:" },
{ type: "audio", value: audioBuffer },
],
},
]);
console.log(response2);
إلحاق الرسائل
قد يستغرق الاستنتاج بعض الوقت، خاصةً عند استخدام طلبات متعددة الوسائط. قد يكون من المفيد إرسال طلبات محدّدة مسبقًا لملء الجلسة، ليتمكّن النموذج من البدء في المعالجة.
While initialPrompts are useful at session creation, the append() method can be
used in addition to the prompt() or promptStreaming() methods, to give additional
additional contextual prompts after the session is created.
على سبيل المثال:
const session = await LanguageModel.create({
initialPrompts: [
{
role: 'system',
content:
'You are a skilled analyst who correlates patterns across multiple images.',
},
],
expectedInputs: [{ type: 'image' }],
});
fileUpload.onchange = async () => {
await session.append([
{
role: 'user',
content: [
{
type: 'text',
value: `Here's one image. Notes: ${fileNotesInput.value}`,
},
{ type: 'image', value: fileUpload.files[0] },
],
},
]);
};
analyzeButton.onclick = async (e) => {
analysisResult.textContent = await session.prompt(userQuestionInput.value);
};
يتم تنفيذ الوعد الذي يعرضه append() بعد التحقّق من صحة الطلب ومعالجته وإضافته إلى الجلسة. يتم رفض الوعد إذا تعذّر إلحاق الطلب.
تمرير مخطّط JSON
أضِف الحقل responseConstraint إلى الطريقة prompt() أو promptStreaming()
لتمرير مخطّط JSON كقيمة. يمكنك بعد ذلك استخدام
النتائج المنظَّمة مع
Prompt API.
في المثال التالي، يضمن مخطط JSON أن يستجيب النموذج بـ
true أو false لتصنيف ما إذا كانت الرسالة المحدّدة تتعلّق بالفخار.
const session = await LanguageModel.create();
const schema = {
"type": "boolean"
};
const post = "Mugs and ramen bowls, both a bit smaller than intended, but that
happens with reclaim. Glaze crawled the first time around, but pretty happy
with it after refiring.";
const result = await session.prompt(
`Is this post about pottery?\n\n${post}`,
{
responseConstraint: schema,
}
);
console.log(JSON.parse(result));
// true
يمكن أن يتضمّن التنفيذ مخطط JSON أو تعبيرًا عاديًا كجزء من
الرسالة المُرسَلة إلى النموذج. يستهلك ذلك جزءًا من
قدرة الاستيعاب. يمكنك قياس مقدار قدرة الاستيعاب
التي سيستخدمها من خلال تمرير الخيار responseConstraint إلى
session.measureContextUsage().
يمكنك تجنُّب هذا السلوك باستخدام الخيار omitResponseConstraintInput. إذا
فعلت ذلك، فنوصيك بتضمين بعض الإرشادات في المطالبة:
const result = await session.prompt(`
Summarize this feedback into a rating between 0-5. Only output a JSON
object { rating }, with a single property whose value is a number:
The food was delicious, service was excellent, will recommend.
`, { responseConstraint: schema, omitResponseConstraintInput: true });
توجيه الطلبات إلى النموذج
يمكنك توجيه النموذج باستخدام الدالة prompt() أو promptStreaming().
النتائج المستندة إلى الطلبات
إذا كنت تتوقّع نتيجة قصيرة، يمكنك استخدام الدالة prompt() التي تعرض
الردّ فور توفّره.
// Start by checking if it's possible to create a session based on the
// availability of the model, and the characteristics of the device.
const available = await LanguageModel.availability({
expectedInputs: [{type: 'text', languages: ['en']}],
expectedOutputs: [{type: 'text', languages: ['en']}],
});
if (available !== 'unavailable') {
const session = await LanguageModel.create();
// Prompt the model and wait for the whole result to come back.
const result = await session.prompt('Write me a poem!');
console.log(result);
}
الناتج المباشر
إذا كنت تتوقّع ردًا أطول، عليك استخدام الدالة promptStreaming() التي تتيح لك عرض نتائج جزئية فور ورودها من النموذج. تُرجع الدالة promptStreaming() القيمة ReadableStream.
const available = await LanguageModel.availability({
expectedInputs: [{type: 'text', languages: ['en']}],
expectedOutputs: [{type: 'text', languages: ['en']}],
});
if (available !== 'unavailable') {
const session = await LanguageModel.create();
// Prompt the model and stream the result:
const stream = session.promptStreaming('Write me an extra-long poem!');
for await (const chunk of stream) {
console.log(chunk);
}
}
إيقاف الطلبات
تقبل كل من prompt() وpromptStreaming() مَعلمة ثانية اختيارية مع حقل signal، ما يتيح لك إيقاف تشغيل الطلبات.
const controller = new AbortController();
stopButton.onclick = () => controller.abort();
const result = await session.prompt('Write me a poem!', {
signal: controller.signal,
});
إدارة الجلسات
وتتتبّع كل جلسة سياق المحادثة. يتم أخذ التفاعلات السابقة في الاعتبار عند إجراء تفاعلات مستقبلية إلى أن تمتلئ نافذة سياق الجلسة.
لكل جلسة حدّ أقصى لعدد الرموز المميّزة التي يمكن معالجتها. يمكنك التحقّق من مدى تقدّمك نحو هذا الحدّ من خلال ما يلي:
console.log(`${session.contextUsage}/${session.contextWindow}`);
من الممكن إرسال طلب يؤدي إلى تجاوز قدرة الاستيعاب. في هذه الحالات، ستتم إزالة الأجزاء الأولية من المحادثة مع النموذج اللغوي، أي طلب واحد وردّ واحد في كل مرة، إلى أن يتوفّر عدد كافٍ من الرموز المميّزة لمعالجة الطلب الجديد. والاستثناء هو طلب النظام الذي لا تتم إزالته أبدًا.
يمكن رصد حالات التجاوز هذه من خلال الاستماع إلى الحدث contextoverflow في الجلسة:
session.addEventListener("contextoverflow", () => {
console.log("We've gone past the context window, and some inputs will be dropped!");
});
إذا لم يكن من الممكن إزالة عدد كافٍ من الرموز المميّزة من سجلّ المحادثة لمعالجة الطلب الجديد،
سيتعذّر تنفيذ طلب prompt() أو promptStreaming() مع ظهور استثناء QuotaExceededError
ولن تتم إزالة أي شيء. تتضمّن السمة QuotaExceededError السمات التالية:
-
requested: عدد الرموز المميّزة التي يتألف منها الإدخال -
contextWindow: عدد الرموز المميّزة التي كانت متاحة
مزيد من المعلومات عن إدارة الجلسات
استنساخ جلسة
للحفاظ على الموارد، يمكنك نسخ جلسة حالية باستخدام الدالة clone(). يؤدي ذلك إلى إنشاء نسخة فرعية من المحادثة، حيث يتم الاحتفاظ بالسياق والطلب الأولي.
تتلقّى الدالة clone() عنصر خيارات اختياريًا مع حقل signal، ما يتيح لك تمرير AbortSignal لإلغاء الجلسة المستنسَخة.
const controller = new AbortController();
stopButton.onclick = () => controller.abort();
const clonedSession = await session.clone({
signal: controller.signal,
});
إنهاء جلسة
يمكنك استدعاء destroy() لإخلاء الموارد إذا لم تعد بحاجة إلى جلسة. عند تدمير جلسة، لا يمكن استخدامها بعد ذلك، ويتم إحباط أي تنفيذ مستمر. قد تحتاج إلى الاحتفاظ بالجلسة إذا كنت تنوي توجيه الطلبات إلى النموذج بشكل متكرر، لأنّ إنشاء جلسة قد يستغرق بعض الوقت.
await session.prompt(
"You are a friendly, helpful assistant specialized in clothing choices."
);
session.destroy();
// The promise is rejected with an error explaining that
// the session is destroyed.
await session.prompt(
"What should I wear today? It is sunny, and I am choosing between a t-shirt
and a polo."
);
العروض التوضيحية
لقد أنشأنا عدة عروض توضيحية لاستكشاف حالات الاستخدام المتعدّدة لواجهة برمجة التطبيقات Prompt API. العروض التوضيحية التالية هي تطبيقات ويب:
لاختبار Prompt API في إضافات Chrome، ثبِّت الإضافة التجريبية. يتوفّر الرمز المصدر للإضافة على GitHub.
استراتيجية الأداء
لا تزال واجهة برمجة التطبيقات Prompt API للويب قيد التطوير. أثناء إنشاء واجهة برمجة التطبيقات هذه، يمكنك الرجوع إلى أفضل الممارسات المتعلّقة بإدارة الجلسات لتحقيق الأداء الأمثل.
سياسة الأذونات وإطارات iframe وWeb Workers
لا تتوفّر واجهة Prompt API تلقائيًا إلا للنوافذ ذات المستوى الأعلى وإطارات iframe من المصدر نفسه. يمكن تفويض الوصول إلى واجهة برمجة التطبيقات إلى إطارات iframe متعدّدة المصادر
باستخدام سمة "سياسة الأذونات" allow="":
<!--
The hosting site at https://main.example.com can grant a cross-origin iframe
at https://cross-origin.example.com/ access to the Prompt API by
setting the `allow="language-model"` attribute.
-->
<iframe src="https://cross-origin.example.com/" allow="language-model"></iframe>
لا تتوفّر واجهة Prompt API في Web Workers في الوقت الحالي، وذلك بسبب تعقيد إنشاء مستند مسؤول لكل عامل من أجل التحقّق من حالة سياسة الأذونات.
المشاركة وتقديم الملاحظات
يمكن أن تؤثر ملاحظاتك بشكل مباشر في كيفية إنشاء وتنفيذ الإصدارات المستقبلية من واجهة برمجة التطبيقات هذه وجميع واجهات برمجة التطبيقات المستنِدة إلى الذكاء الاصطناعي المضمَّن.
- لإرسال ملاحظات حول تنفيذ Chrome، يمكنك إرسال تقرير خطأ أو طلب ميزة.
- يمكنك مشاركة ملاحظاتك حول شكل واجهة برمجة التطبيقات من خلال التعليق على مشكلة حالية أو فتح مشكلة جديدة في مستودع Prompt API على GitHub.
- الانضمام إلى برنامج النسخة المبكرة الحصرية