واجهة برمجة التطبيقات Prompt API في إضافات Chrome

تاريخ النشر: 11 تشرين الثاني (نوفمبر) 2024

تتوفّر واجهة برمجة التطبيقات Prompt API لإضافة ميزات الذكاء الاصطناعي في الإضافات الآن في مرحلة التجربة والتقييم، ما يتيح لك إنشاء إضافات Chrome التي تستخدِم Gemini Nano، وهو نموذج اللغة الأكثر كفاءة في المتصفّح.

هناك العديد من حالات استخدام واجهة برمجة التطبيقات Prompt API مع إضافات Chrome. في ما يلي بعض الأمثلة:

  • أحداث التقويم الفورية: يمكنك تطوير إضافة Chrome لاستخراج تفاصيل الأحداث تلقائيًا من صفحات الويب، ما يتيح للمستخدمين إنشاء إدخالات في التقويم ببضع خطوات فقط.
  • استخراج جهات الاتصال بسلاسة: أنشئ إضافة تستخرج معلومات الاتصال من المواقع الإلكترونية، ما يسهّل على المستخدمين التواصل مع نشاط تجاري أو إضافة تفاصيل إلى قائمة جهات الاتصال.
  • فلترة المحتوى الديناميكي: أنشئ إضافة Chrome تحلِّل المقالات الإخبارية وتمويه المحتوى أو إخفائه تلقائيًا استنادًا إلى مواضيع يحدّدها المستخدم

هذه ليست سوى بعض الأفكار، ولكننا متحمّسون لرؤية ابتكاراتك.

مدى التوفّر

  • يمكنك الانضمام إلى الإصدار التجريبي من واجهة برمجة التطبيقات Prompt API، الذي يعمل في الإصدارات من Chrome 131 إلى 136، لإنشاء إضافات باستخدام واجهة برمجة التطبيقات هذه. إذا كنت جديدًا في الإصدارات التجريبية من الإصدارات الأصلية، هذه هي البرامج التي تُتاح لفترة محدودة لجميع المطوّرين، وتوفّر إمكانية استخدام ميزات النظام الأساسي التجريبية قبل إطلاقها. يمكن للمطوّرين اختبار الإصدارات وجمع ملاحظات المستخدمين وإجراء تكرارات من أجل إطلاق الإصدار في المستقبل.
    • على الرغم من أنّه قد تكون هناك حدود لاستخدام هذه الميزات، يمكنك دمجها في الاختبار المباشر وجمع ملاحظات المستخدمين. والهدف من ذلك هو الاستفادة من هذه الملاحظات في الإصدارات المستقبلية لواجهة برمجة التطبيقات هذه، بينما نعمل على إتاحة هذه الميزة على نطاق أوسع.
  • انضم إلى برنامج المعاينة المبكّرة للاطّلاع مبكرًا على واجهات برمجة التطبيقات الجديدة المدمجة للذكاء الاصطناعي والمشاركة في المناقشات على القائمة البريدية.

المشاركة في الفترة التجريبية لإصدار التطبيق الأصلي

لاستخدام Prompt API في إضافات Chrome، أضِف إذن "aiLanguageModelOriginTrial" إلى ملف manifest.json وفقًا للمقتطف التالي، بالإضافة إلى أي أذونات أخرى قد تحتاجها إضافتك.

لتسجيل إضافة Chrome في الفترة التجريبية للمصدر، استخدِم عنوان URL chrome-extension://YOUR_EXTENSION_ID كـ مصدر الويب. على سبيل المثال، chrome-extension://ljjhjaakmncibonnjpaoglbhcjeolhkk.

الاشتراك في الإصدار التجريبي من Chrome Origin

يتم إنشاء معرّف الإضافة ديناميكيًا. بعد تحديد رقم التعريف، يمكنك إجباره على البقاء ثابتًا من خلال إضافة السمة key إلى البيان.

بعد الاشتراك في الفترة التجريبية الأصلية، ستتلقّى رمز ترويجي تم إنشاؤه، وعليك تمريره في صفيف كقيمة لحقل trial_tokens في البيان.

{
  "manifest_version": 3,
  "name": "YOUR_EXTENSION_NAME",
  "permissions": ["aiLanguageModelOriginTrial"],
  "trial_tokens": ["GENERATED_TOKEN"],
}

إضافة إمكانية استخدام localhost

للوصول إلى Prompt API على localhost أثناء مرحلة التجربة والتقييم، يجب تحديث Chrome إلى أحدث إصدار. ثم اتبع الخطوات التالية:

  1. افتح Chrome على أحد الأنظمة الأساسية التالية: Windows أو Mac أو Linux.
  2. الانتقال إلى chrome://flags/#optimization-guide-on-device-model
  3. اختَر Enabled BypassPerfRequirement (تم تفعيل BypassPerfRequirement).
    • يؤدي ذلك إلى تخطّي عمليات التحقّق من الأداء التي قد تمنعك من تنزيل Gemini Nano على جهازك.
  4. انقر على إعادة التشغيل أو أعِد تشغيل Chrome.

استخدام Prompt API

بعد طلب الإذن لاستخدام Prompt API، يمكنك إنشاء الإضافة. تتوفّر لك دالتَا إضافة جديدتَين في مساحة الاسم chrome.aiOriginTrial.languageModel:

  • capabilities() للاطّلاع على الميزات المتوفّرة في الطراز ومعرفة ما إذا كان متاحًا.
  • create() لبدء جلسة نموذج لغوي.

تنزيل النموذج

تستخدِم واجهة برمجة التطبيقات Prompt API نموذج Gemini Nano في Chrome. على الرغم من أنّ واجهة برمجة التطبيقات مدمجة في Chrome، يتم تنزيل النموذج بشكل منفصل في المرة الأولى التي تستخدم فيها إحدى الإضافات واجهة برمجة التطبيقات.

لتحديد ما إذا كان النموذج جاهزًا للاستخدام، استخدِم الدالة غير المتزامنة chrome.aiOriginTrial.languageModel.capabilities(). تعرض هذه الدالة AILanguageModelCapabilities كائنًا يحتوي على حقل available يمكنه استخدام ثلاث قيم محتملة:

  • 'no': يتيح المتصفّح الحالي استخدام Prompt API، ولكن لا يمكن استخدامه في الوقت الحالي. وقد يرجع ذلك لعدد من الأسباب، مثل عدم توفّر مساحة كافية على القرص لتنزيل النموذج.
  • 'readily': يتيح المتصفّح الحالي استخدام Prompt API، ويمكن استخدامه على الفور.
  • 'after-download': يتيح المتصفّح الحالي استخدام Prompt API، ولكن يجب أولاً تنزيل النموذج.

لبدء تنزيل النموذج وإنشاء جلسة النموذج اللغوي، استخدِم الدالة chrome.aiOriginTrial.languageModel.create() غير المتزامنة. إذا كان الردّ على capabilities() هو 'after-download'، من أفضل الممارسات الاستماع إلى مستوى تقدّم التنزيل. بهذه الطريقة، يمكنك إبلاغ المستخدم في حال استغراق عملية التحميل لبعض الوقت.

const session = await chrome.aiOriginTrial.languageModel.create({
  monitor(m) {
    m.addEventListener("downloadprogress", (e) => {
      console.log(`Downloaded ${e.loaded} of ${e.total} bytes.`);
    });
  },
});

إمكانات النموذج

تُعلمك الدالة capabilities() أيضًا بقدرات capabilities() نموذج اللغة. بالإضافة إلى available، يحتوي عنصر AILanguageModelCapabilities الناتج أيضًا على الحقول التالية:

await chrome.aiOriginTrial.languageModel.capabilities();
// {available: 'readily', defaultTopK: 3, maxTopK: 8, defaultTemperature: 1}

إنشاء جلسة

بعد التأكّد من إمكانية تشغيل Prompt API، يمكنك إنشاء جلسة باستخدام الدالة create()، ما يتيح لك بعد ذلك توجيه طلب إلى النموذج باستخدام الدالة prompt() أو الدالةpromptStreaming().

خيارات الجلسة

يمكن تخصيص كل جلسة باستخدام topK وtemperature باستخدام عنصر options اختياري. يتم عرض القيم التلقائية لهذه المَعلمات من chrome.aiOriginTrial.languageModel.capabilities().

const capabilities = await chrome.aiOriginTrial.languageModel.capabilities();
// Initializing a new session must either specify both `topK` and
// `temperature` or neither of them.
const slightlyHighTemperatureSession = await chrome.aiOriginTrial.languageModel.create({
  temperature: Math.max(capabilities.defaultTemperature * 1.2, 2.0),
  topK: capabilities.defaultTopK,
});

يقبل عنصر الخيارات الاختيارية في الدالة create() أيضًا حقل signal، ما يتيح لك تمرير AbortSignal لإلغاء الجلسة.

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

const session = await chrome.aiOriginTrial.languageModel.create({
  signal: controller.signal,
})
طلبات النظام

من خلال طلبات النظام، يمكنك تقديم بعض السياق للنموذج اللغوي.

const session = await chrome.aiOriginTrial.languageModel.create({
  systemPrompt: 'You are a helpful and friendly assistant.',
});
await session.prompt('What is the capital of Italy?');
// 'The capital of Italy is Rome.'

الطلبات الأولية

باستخدام الطلبات الأولية، يمكنك تزويد النموذج اللغوي بسياق حول التفاعلات السابقة، على سبيل المثال، للسماح للمستخدم باستئناف جلسة محفوظة بعد إعادة تشغيل المتصفّح.

const session = await chrome.aiOriginTrial.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. [...]' }
  ]
});

معلومات الجلسة

تحتوي جلسة نموذج لغوي معيّنة على الحد الأقصى لعدد الرموز التي يمكنها معالجتها. يمكنك التحقّق من معدّل الاستخدام والتقدّم نحو هذا الحدّ باستخدام السمات التالية في عنصر الجلسة:

console.log(`${session.tokensSoFar}/${session.maxTokens}
(${session.tokensLeft} left)`);

الاحتفاظ بالجلسة

تتتبّع كل جلسة سياق المحادثة. يتمّ أخذ التفاعلات السابقة في الاعتبار للتفاعلات المستقبلية إلى أن تمتلئ نافذة السياق للجلسة.

const session = await chrome.aiOriginTrial.languageModel.create({
  systemPrompt: 'You are a friendly, helpful assistant specialized in clothing choices.'
});

const result1 = await session.prompt(
  'What should I wear today? It is sunny. I am unsure between a t-shirt and a polo.'
);
console.log(result1);

const result2 = await session.prompt(
  'That sounds great, but oh no, it is actually going to rain! New advice?'
);
console.log(result2);

نسخ جلسة

للحفاظ على الموارد، يمكنك استنساخ جلسة حالية باستخدام الدالة clone(). تتم إعادة ضبط سياق المحادثة، ولكن ستظل المطالبة الأولية أو طلبات النظام سليمة. تأخذ الدالة clone() عنصر options اختياريًا يحتوي على حقل signal، ما يتيح لك تمرير AbortSignal لإتلاف الجلسة التي تم نسخها.

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

const clonedSession = await session.clone({
  signal: controller.signal,
});

توجيه طلب إلى النموذج

يمكنك توجيه النموذج باستخدام دالة 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, defaultTemperature, defaultTopK, maxTopK } =
  await chrome.aiOriginTrial.languageModel.capabilities();

if (available !== 'no') {
  const session = await chrome.aiOriginTrial.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() التي تتيح لك عرض نتائج جزئية عند ورودها من النموذج.

const {available, defaultTemperature, defaultTopK, maxTopK } =
  await chrome.aiOriginTrial.languageModel.capabilities();

if (available !== 'no') {
  const session = await chrome.aiOriginTrial.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);
  }
}

تُعرِض promptStreaming() ReadableStream تكون أجزاؤه متعاقبة تعتمد على بعضها. على سبيل المثال، "Hello," و"Hello world," و"Hello world I am," "Hello world I am an AI.". هذا ليس السلوك المقصود. وننوي المواءمة مع واجهات برمجة تطبيقات البث الأخرى على المنصة، حيث تكون الأجزاء متتالية وتشكل بثًا واحدًا طويلاً. وهذا يعني أنّ الإخراج سيكون تسلسلًا مثل "Hello" و" world" و" I am" و" an AI".

في الوقت الحالي، لتحقيق السلوك المقصود، يمكنك تنفيذ ما يلي: وينطبق ذلك على السلوك العادي وغير العادي.

let result = '';
let previousChunk = '';

for await (const chunk of stream) {
  const newChunk = chunk.startsWith(previousChunk)
      ? chunk.slice(previousChunk.length) : chunk;
  console.log(newChunk);
  result += newChunk;
  previousChunk = chunk;
}
console.log(result);

إيقاف عرض طلب

يقبل كلّ من prompt() وpromptStreaming() مَعلمة ثانية اختيارية باستخدام حقل signal، ما يتيح لك إيقاف عرض طلبات التأكيد.

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

const result = await session.prompt(
  'Write me a poem!',
  { 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 unsure
  between a t-shirt and a polo.'
);

عرض توضيحي

لاختبار Prompt API في إضافات Chrome، ثبِّت إضافة الإصدار التمهيدي. يتوفّر رمز المصدر الخاص بالإضافة على GitHub.

واجهة تجريبية لواجهة Prompt API

المشاركة وتقديم الملاحظات

يمكنك بدء اختبار واجهة برمجة التطبيقات Prompt API الآن في إضافات Chrome من خلال الانضمام إلى الإصدار التجريبي من واجهة برمجة التطبيقات ومشاركة ملاحظاتك. يمكن أن تؤثّر ملاحظاتك مباشرةً في طريقة إنشاء و تنفيذ الإصدارات المستقبلية من واجهة برمجة التطبيقات هذه وجميع واجهات برمجة التطبيقات المضمّنة للذكاء الاصطناعي.