1. مقدمة
يوفّر تطوير الويب الحديث بديلاً عن الرحلات المتكرّرة المستندة إلى السحابة الإلكترونية لاستخدام الذكاء الاصطناعي. بدأ Chrome في توفير واجهات برمجة تطبيقات مدمجة للذكاء الاصطناعي تتيح لك استخدام كل شيء بدءًا من النماذج الصغيرة المتخصصة في الترجمة إلى نماذج اللغة الكاملة المقطّرة، وكل ذلك بدون تكاليف الرموز المميزة لك أو للمستخدمين، وبشكل خاص على أجهزتهم.
في الوقت نفسه، توفّر وكلاء الذكاء الاصطناعي طريقة جديدة للمستخدمين للتفاعل مع تطبيقات الويب، ويمكن أن يساعد جعل تجربة الويب متوافقة مع الوكلاء باستخدام WebMCP في تقليل استخدام الرموز المميزة مع تقديم نتائج أكثر دقة من التنشيط التقليدي الذي يتطلّب لقطات شاشة واستخراج DOM.
في هذا الدرس التطبيقي حول الترميز، ستعمل على Mont-Royal Plein Air، وهو موقع إلكتروني للتجارة الإلكترونية خاص بمعدات الأنشطة الخارجية. ستتعرّف على كيفية إنشاء ودمج واجهات برمجة التطبيقات المضمّنة المستندة إلى الذكاء الاصطناعي وWebMCP من أجل:
- استنتاج نية العميل من سجلّ التصفّح وإنشاء اقتراحات له ديناميكيًا باستخدام نماذج على الجهاز فقط
- توفير أدوات يمكن أن تستخدمها برامج الوكلاء ومساعدو المتصفّح للتنقّل في الموقع الإلكتروني وفحص المنتجات والاقتراحات وإدارة سلّة تسوّق المستخدم
- (اختياري) ترجمة موقعك الإلكتروني أثناء التنقّل باستخدام نماذج صغيرة متخصّصة على الجهاز فقط
- (اختياري) تحويل ميزة "البحث الأساسي في الموقع الإلكتروني" إلى وكيل داخل الموقع الإلكتروني يعمل باستخدام الأدوات نفسها التي تستخدمها الوكلاء الخارجيون
أهداف الدورة التعليمية
- كيفية استخدام Prompt API وفرض إخراج JSON منظَّم منه
- كيفية تسجيل أدوات WebMCP واستراتيجيات التفكير في تركيبة الأدوات ومدى دقتها
- (اختياري) كيفية استخدام Translator API لترجمة المحتوى بسرعة باستخدام نموذج خبير على الجهاز فقط
- (اختياري) كيفية استدعاء أدوات WebMCP بنفسك
المتطلبات الأساسية
- حساب Google شخصي وGoogle Cloud
- الإصدار 150 من Google Chrome أو الإصدارات الأحدث، أو قنوات Canary أو Dev أو Beta، مع تفعيل العلامتَين
#enable-webmcp-testingو#devtools-webmcp-support - الإلمام بلغات HTML وCSS وJavaScript وTypeScript
- يجب أن تكون على دراية بمخطط JSON.
2. إعداد المشروع
حساب Google
إذا لم يكن لديك حساب Google شخصي، عليك إنشاء حساب Google.
تسجيل الدخول إلى Google Cloud Console
سجِّل الدخول إلى Google Cloud Console باستخدام حساب Google شخصي.
تفعيل الفوترة
لإعداد حساب فوترة شخصي، فعِّل الفوترة في Cloud Console.
إنشاء مشروع (اختياري)
إذا لم يكن لديك مشروع حالي تريد استخدامه في هذا المختبر، يمكنك إنشاء مشروع جديد هنا.
فتح محرّر Cloud Shell
- انقر على هذا الرابط للانتقال مباشرةً إلى محرّر Cloud Shell.
- إذا طُلب منك منح الإذن في أي وقت اليوم، انقر على تفويض للمتابعة.

- إذا لم تظهر المحطة الطرفية في أسفل الشاشة، افتحها باتّباع الخطوات التالية:
- انقر على عرض.
- انقر على Terminal.

إعداد مشروعك
- في الوحدة الطرفية، اضبط مشروعك باستخدام الأمر التالي:
مثال:gcloud config set project [PROJECT_ID]gcloud config set project lab-project-id-example
- ستظهر لك الرسالة التالية:
Updated property [core/project].
إعداد الحساب المحلي وحساب Workspace
- في نافذة الوحدة الطرفية (أو نافذة Cloud Shell الطرفية)، استنسِخ مستودع المشروع وانتقِل إلى دليل المشروع:
git clone https://github.com/GoogleChromeLabs/codelabs mont-royal cd mont-royal - انتقِل إلى المجلد
ecommerce-ai-enhancements/starter:cd ecommerce-ai-enhancements/starter - ثبِّت التبعيات باستخدام
pnpm:pnpm install - ابدأ خادم التطوير المحلي:
افتح المتصفّح وانتقِل إلىpnpm devhttp://localhost:5173لعرض متجر Mont-Royal Plein Air.
(اختياري) تثبيت إضافة WebMCP inspector
لتسهيل استخدام WebMCP، يمكنك تثبيت أداة فحص سياق النموذج في WebMCP. بعد تثبيت Gemini API، عليك الحصول على مفتاح API لاستخدامه:
- انتقِل إلى AI Studio.
- انقر على الزر إنشاء مفتاح واجهة برمجة تطبيقات لإنشاء مفتاح جديد لواجهة Gemini API مرتبط بالمشروع الذي أعددته في الخطوة السابقة.
- افتح "أداة فحص سياق نموذج WebMCP" (تُفتح في اللوحة الجانبية) وانقر على الزر تعديل مفتاح Gemini API.
- ألصِق مفتاح واجهة برمجة التطبيقات في النافذة المنبثقة واحفظه.
تتضمّن هذه الإضافة برنامجًا أساسيًا يمكنه استخدام WebMCP، ما يتيح لك تجربة موقعك الإلكتروني من خلاله بدلاً من استدعاء أدوات WebMCP مباشرةً من خلال "أدوات مطوّري البرامج".
3- نماذج الذكاء الاصطناعي المضمَّنة على الويب
ما هي Prompt API؟
تتيح واجهة برمجة التطبيقات Prompt API لتطبيقات الويب الوصول مباشرةً إلى نموذج لغوي صغير ومتعدّد الوسائط يعمل بالكامل على جهاز المستخدم. لأنّ الاستنتاج يتم تنفيذه محليًا:
- زمن انتقال معدوم على السحابة الإلكترونية: ما مِن عمليات تبادل بيانات على الشبكة أو وضع في قائمة الانتظار على خادم الخلفية.
- الخصوصية هي الإعداد التلقائي: لا يتم نقل الطلبات وأي سياق يتم تمريره إليها خارج الجهاز.
- بدون تكلفة: يتم تنفيذ الاستنتاج على أجهزة العميل بدون فوترة الرموز المميزة أو نفقات استضافة السحابة الإلكترونية.
- إمكانية العمل بلا إنترنت: يعمل بشكل موثوق حتى بدون اتصال نشط بالإنترنت.
في Chrome، يمكن الوصول إلى Prompt API من خلال واجهة LanguageModel العامة.
// 1. Set your expected inputs and outputs. This is multimodal, so you can
// include other types here, too
const languages = {
expectedInputs: [{type: "text", languages: ["en"]}],
expectedOutputs: [{type: "text", languages: ["en"]}],
}
// 2. Check availability. Always pass in your expected inputs and outputs,
// as some models may only support some inputs and outputs
const availability = await LanguageModel.availability(languages);
// 'available', 'downloading', or 'unavailable'
// 3. Create an isolated session with system prompt and language constraints
const session = await LanguageModel.create({
...languages,
// Optional: add initial context to your session, like a system prompt
initialPrompts: [
{
role: 'system',
content: 'You are an expert outdoors sales assistant...'
}
]
});
// 4. Define your expected output as JSON Schema
const schema = {
//...
}
// 5. Prompt the model (supports plain text or structured models)
const result = await session.prompt('Recommend a 3-season tent footprint.', {
responseConstraint: schema,
});
التمرين 1: الاقتراحات المستندة إلى رحلة المستخدم
تتضمّن مواقع التجارة الإلكترونية عادةً عروضًا دوّارة أو عروضًا ترويجية لسلع "يتم شراؤها معًا بشكل متكرر". بالنسبة إلى موقع إلكتروني مخصّص للأنشطة الخارجية مثلاً، قد يكون من الأفضل إنشاء هذه الاقتراحات استنادًا إلى سجلّ التصفّح.
لتحقيق ذلك، عليك إنشاء مسار توصية من ثلاث مراحل:
- أداة تحديد رحلة المستخدم: باستخدام Prompt API، يمكنك تحليل المخطط الزمني للتصفّح حسب التسلسل الزمني للعميل في محاولة لاستنتاج النية الحقيقية للمستخدم في خوض مغامرة.
- طلب البحث عن المنتج: من هذا الغرض، ستُرسل طلب بيانات من واجهة برمجة التطبيقات إلى خادم خلفي مزيّف للمنتجات للحصول على سلع ذات صلة.
- اقتراح المنتجات: ستعيد هذه المنتجات إلى Product API لترتيبها، ما يؤدي إلى عرض خمسة منتجات متوافقة مع ما يشاهده المستخدم.
المهمة 1.1: بدء استخدام Prompt API
بدلاً من تهيئة Prompt API بشكل فردي في كل مرة تريد استخدامها، يمكنك تجميع الطلبات في ملف واحد، وتخزين عملية الإنشاء حسب طلب النظام لتقليل وقت بدء تشغيل الطلبات المتعددة إلى الوكيل نفسه.
انتقِل إلى الملف src/ai/prompt-api.ts وافحص getPromptSession() في الأسطر من 27 إلى 58:
export async function getPromptSession(
systemPrompt: string = '',
options: { signal?: AbortSignal } = {}
): Promise<LanguageModel>
- إعادة استخدام جلسة أساسية مخزَّنة مؤقتًا تتوفّر حاليًا خريطة ذاكرة تخزين مؤقت في السطر 21،
baseSessions، يتم تحديد مفتاحها من خلال طلب النظام. تؤدي إعادة استخدام النماذج الأساسية بدلاً منclone()نماذج جديدة إلى تقليل وقت بدء التشغيل والاستفادة من الإعداد الأساسي بدون أن تتداخل كل جلسة مع الأخرى. إرجاع النسخة المستنسخة، ويمكن للمتصلين التفاعل معها، بما في ذلكdestroy()ها، بحرية بدون تجاهل قاعدة البيانات الأساسية المخزّنة مؤقتًا - رصد توفّر واجهة برمجة التطبيقات رصد الميزة إذا كانت واجهة برمجة التطبيقات متوفرة، وعرض رسالة خطأ إذا لم تكن متوفرة
- التعريف عن طرق الدفع واللغات يمكن للنماذج المضمّنة معالجة الإدخالات المتعدّدة الوسائط. عليك تحديد الأوضاع التي تحتاج إليها واللغات التي تريد إتاحتها. يجب أن يكون كل المحتوى الذي ترسله إلى النموذج اللغوي الكبير باللغة الإنجليزية.
- تحقَّق من مدى التوفّر قبل إنشاء أي محتوى. حتى إذا كانت واجهة برمجة التطبيقات متوفّرة، قد لا يتوفّر نموذج يستوفي متطلباتك. تحقَّق مما إذا كان هناك حساب. إذا لم يكن كذلك، سيظهر خطأ. إذا لم يتم تنزيلها بعد، أبلِغ عن مستوى التقدّم في عملية التنزيل.
- أنشئ الجلسة. إعداد الخيارات لإنشاء جلسة جديدة في Prompt API، وطلب النظام، إذا كان متضمّنًا
المهمة 1.2: تنفيذ أداة إنشاء ملفات رحلات المستخدمين
انتقِل إلى الملف src/ai/journey-profiler.ts وافحص الدالة المستهدَفة في الأسطر من 42 إلى 100:
export async function inferJourneyProfile(
context: ProfilerInputContext,
catalogMap: ReadonlyMap<string, Product>
): Promise<JourneyProfile>
- استخدِم الدالة من المهمة 1 لإنشاء جلسة طلب جديدة لاستخدامها.
- اطلب من النموذج تنفيذ الطلب باستخدام نص الطلب المقدَّم، واستخدِم
journeyProfileSchemaكـ مخطط JSON للرد المنظَّم. - حلِّل نتائج الطلب وأزِل الفئات المستهدَفة المكرّرة.
- استبدِل السلاسل المرمّزة بثبات بالنتائج الفعلية من طلبك.
- يجب إيقاف الجلسة عند الانتهاء منها لتوفير مساحة في الذاكرة.
المهمة 1.3: تنفيذ أداة إعادة الترتيب المستندة إلى التآزر
انتقِل إلى الملف src/ai/synergy-reranker.ts وافحص الدالة المستهدَفة في الأسطر من 30 إلى 71:
export async function rankComplementaryGear(
profile: JourneyProfile,
candidates: readonly Product[],
currentProduct?: Product | null,
cartProducts?: readonly Product[],
limit: number = 5
): Promise<readonly RecommendedItem[]>
- استخدِم الدالة من المهمة 1 لإنشاء جلسة طلب جديدة لاستخدامها.
- قدِّم للنموذج نص الطلب والمخطط الذي تم إنشاؤه.
- حلِّل ناتج الطلب.
- إرجاع قائمة الاقتراحات المجمّعة باستخدام
assembleRecommendations - يجب إيقاف الجلسة عند الانتهاء منها لتوفير مساحة في الذاكرة.
التحقّق من مسار الاقتراحات
- افتح Chrome
http://localhost:5173/catalog/tent-mont-tremblant-3p. - انتقِل للأسفل إلى قسم محتوى يهمّك.
- لاحظ كيف يتم تعديل البطاقات الخمس المصاحبة لعرض مجموعات الأدوات الذكية (مثل آثار الأقدام على الأرض، ووسادات النوم، والأوتاد الخفيفة) بدلاً من المنتجات العشوائية.
- افتح "وحدة تحكّم أدوات مطوّري البرامج في Chrome" لفحص مدة التنفيذ في الوقت الفعلي لكلتا خطوتَي الاستنتاج.
(اختياري) المهمة 1.4: استكشاف المزيد من نماذج الذكاء الاصطناعي المضمَّنة
تتوفّر العديد من نماذج الذكاء الاصطناعي المضمّنة الأخرى، بما في ذلك نموذج الخبراء Translator API. إنّ المكوّنات في قاعدة الرموز البرمجية هذه مرتبطة بخدمة تستمع إلى التغييرات في اللغة الحالية وتطلب ترجمتها، وعليك ربط كل ذلك.
انتقِل إلى الملف: src/ai/translator.ts
افحص الدالة المستهدَفة createTranslator في الأسطر من 29 إلى 45:
export async function createTranslator(
targetLang: SupportedLanguage
): Promise<Translator | null>
- تحقَّق من توفّر واجهة برمجة التطبيقات Translator API وتأكَّد من أنّ اللغة المستهدَفة ليست الإنجليزية (يكون المحتوى باللغة الإنجليزية تلقائيًا).
- أنشئ زوجًا من اللغات، من الإنجليزية إلى اللغة المستهدَفة، وتحقّق مما إذا كان هذا الزوج متاحًا.
- إنشاء خيارات للمترجم وإرفاق شاشة عرض لمستوى تقدّم تنزيل النموذج
- لعرض أداة الترجمة التي تمّت تهيئتها
بعد ذلك، افحص الدالة المستهدَفة translate في الأسطر من 50 إلى 58:
export async function translate(
text: string,
targetLang: SupportedLanguage
): Promise<string>
- تحقَّق ممّا إذا كان هناك مترجم متاح مع تمرير
getCachedTranslatorفيtargetLang. إذا لم يكن هناك أي نص، أعِد النص النظيف. - إذا كان هناك نص، استخدِم أداة الترجمة لترجمة النص النظيف.
انتقِل إلى الملف: src/ai/translator.ts
افحص الدالة المستهدَفة render في السطر 204:
export async function translate(
text: string,
targetLang: SupportedLanguage
): Promise<string>
- تفعيل مكوّن "أداة اختيار اللغة"
4. استخدام WebMCP لتحسين تجربة الموظف
ما هي WebMCP؟
مع بدء المستخدمين في استخدام وكلاء مستقلين ووكلاء للتصفّح المشترك، أصبح من المهم أن تتكيّف المواقع الإلكترونية مع ذلك. تعتمد الوكلاء عادةً على التنشيط، أي التقاط لقطات شاشة واستخراج DOM وأشجار تسهيل الاستخدام، لتحديد كيفية التفاعل مع موقع إلكتروني. هذه الطريقة بطيئة وغير مستقرة وعرضة للأخطاء، كما أنّها تؤدي إلى إهدار الرموز المميزة للمستخدمين.
تساعد WebMCP في حلّ هذه المشكلة من خلال السماح للمطوّرين بتوفير أدوات مباشرةً للوكلاء للتفاعل مع الصفحة التي يتصفّحونها. يمكن للوكلاء الذين يتيحون استخدام هذه الأدوات الاستفادة منها تمامًا مثل أداة في حزمة الترميز، مع إدخالات وعائدات منظَّمة وواضحة تحدّدها أنت.
// Register a tool directly on document.modelContext
document.modelContext.registerTool({
name: 'get_product_specs',
title: 'Get Product Specs',
description: 'Retrieve technical specifications for the active product.',
inputSchema: {
type: 'object',
properties: {
// ...
},
},
annotations: {
readOnlyHint: true, // Informs the agent this tool causes no side-effects
},
execute: async (input) => {
return {
weight: '1.8 kg',
capacity: '3 persons',
seasons: '3-season',
};
},
});
عندما يتصل موظّف الدعم بصفحة الويب، يرسل طلب بحث إلى document.modelContext.getTools(). تتيح كل أداة مسجّلة ما يلي:
-
name: معرّف الأداة الآلية الذي تستخدمه البرامج عند تنفيذ الأدوات (مثل'get_product_specs'). -
title: تصنيف العرض القابل للقراءة من قِبل الإنسان والذي تستخدمه واجهات المفتشين والوكلاء (مثل'Get Product Specs'). -
description: وصف بنص عادي يوضّح للنموذج وظيفة الأداة ومتى يجب استدعاؤها. هذه هي الطريقة التي يحدّد بها الوكيل ما إذا كان عليه استدعاء الأداة، لذا يجب أن يكون الوصف واضحًا. inputSchema: مخطط JSON الذي يحدّد الوسيطات المقبولة.annotations: تلميحات السلوك، مثل{ readOnlyHint: true }للأدوات التي لا يمكن تعديلها ولا تتسبّب في أي آثار جانبية للحالة.-
execute: دالة غير متزامنة يتم تنفيذها عند استدعاء الأداة.
المهمة 2.1: أدوات الاقتراحات والمنتجات
تبدأ بتسجيل أداة للسماح للوكلاء باسترداد الاقتراحات التي أنشأتها للتو في التمرين السابق.
انتقِل إلى الملف: src/components/product/ForYouSection.ts
فحص registerWebMCPTools() في الأسطر من 71 إلى 94:
private registerWebMCPTools(): void
- تحقَّق مما إذا كانت WebMCP متاحة.
- إذا كان الأمر كذلك، سجِّل الأداة.
- اختَر عنوانًا ووصفًا يجذبان الوكيل لاختيار الأداة، مع مراعاة هندسة الطلبات هنا.
- لا يوجد إدخال، لذا ما عليك سوى تضمين مخطط JSON فارغ.
- هذه أداة للقراءة فقط.
- في دالة التنفيذ، استخدِم
recommendationStoreللحصول على المجموعة الحالية من الاقتراحات، ثمّ أرجِع معرّف المنتج الحالي ومجموعة اقتراحات المنتجات. - أضِف إشارة إلغاء والتقِطها كي لا تؤدي إلى حدوث خطأ. يضمن ذلك إزالة الأداة بشكل صحيح عند إلغاء تحميل المكوّن.
انتقِل إلى الملف: src/views/ProductView.ts
- كرِّر العملية نفسها لتسجيل أداة
get_current_product، ولكن هذه المرة سيتم عرض المنتج الكامل بالإضافة إلى الاقتراحات.
المهمة 2.2: أدوات درج سلة التسوّق
انتقِل إلى الملف: src/components/cart/CartDrawer.ts
فحص registerWebMCPTools() في الأسطر من 83 إلى 114:
private registerWebMCPTools(): void
- سجِّل أداة
view_cartباتّباع الخطوات التالية:
- يجب أن تكون
inputSchemaعبارة عن عنصر يتضمّن خيارًا منطقيًا واحدًا، وهوopenDrawer. - يجب أن يكون متاحًا للقراءة فقط.
- قراءة الإدخال كجزء من وظيفة
execute، وتحديد ما إذا كان سيتم عرض سلة التسوّق أو إخفاؤها، وإعادة تحميلrecommendationStore، ثم عرض ملخّص سلة التسوّق
- سجِّل أداة
manage_cartباتّباع الخطوات التالية:
- يجب أن يكون
inputSchemaعنصرًا يتضمّنitems، وهو عبارة عن مصفوفة من العناصر التي تتضمّن التعدادactionproductIDوaddوremoveوupdate، بالإضافة إلى العدد الصحيحquantity. - يجب أن تنقل الدالة
executeالعناصر إلىthis.updateCart
المهمة 2.3: أداة تبديل اللغة
يمكنك الاستفادة بشكل أكبر من WebMCP من خلال توفير أداة لغوية للجهات الخارجية.
انتقِل إلى الملف: src/components/navigation/LanguagePicker.ts
فحص registerWebMCPTools() في الأسطر من 61 إلى 63:
private registerWebMCPTools(): void
- تسجيل أداة
switch_language:- يجب أن تتضمّن السمة
inputSchemaسمةlanguageتكون عبارة عن قيمة محدّدة مسبقًا منSUPPORTED_LANGUAGE_CODES. - يجب أن تستدعي الدالة
executeالدالةthis.switchLanguageمع اللغة المقدَّمة.
- يجب أن تتضمّن السمة
المهمة 2.4: أدوات التنقّل في المتجر
يمكنك السماح للوكلاء المستقلين بالتنقّل في المتجر أو الانتقال إلى صفحات المنتجات أو تصفّح الفئات أو بدء عمليات البحث.
انتقِل إلى الملف: src/components/navigation/SiteHeader.ts
فحص registerWebMCPTools() في الأسطر من 155 إلى 171:
private registerWebMCPTools(): void
- تحقَّق مما إذا كانت WebMCP متاحة.
- تسجيل أداة
search:- يستخدِم مخطط الإدخال سلسلة
query. - في
execute، اتّصِل بالرقمthis.search(input?.query).
- يستخدِم مخطط الإدخال سلسلة
- تسجيل أداة
go_to_catalog:- يقبل مخطط الإدخال السمتَين الاختياريتَين
activity(تعدادACTIVITIES) وcategory(تعدادPRODUCT_CATEGORIES). - في
execute، اتّصِل بالرقمthis.goToCatalog(input?.activity, input?.category).
- يقبل مخطط الإدخال السمتَين الاختياريتَين
- تسجيل أداة
get_categories_and_activities:- أداة للقراءة فقط بدون مَعلمات إدخال
- في
execute، اتّصِل بالرقمthis.getCategoriesAndActivities().
- تسجيل أداة
go_to_product:- يتطلّب مخطط الإدخال سلسلة
productId. - في
execute، اتّصِل بالرقمthis.goToProduct(input?.productId).
- يتطلّب مخطط الإدخال سلسلة
التحقّق باستخدام أداة فحص WebMCP
- أعِد تحميل
http://localhost:5173/catalog/tent-mont-tremblant-3pفي Chrome وانتقِل إلى صفحة منتج. - افتح "أدوات مطوّري البرامج في Chrome" > "التطبيق" > WebMCP.
- من المفترض أن تظهر أدوات WebMCP:
get_recommendationsوget_current_productوview_cartوmanage_cartوswitch_languageوsearchوgo_to_catalogوget_categories_and_activitiesوgo_to_product. - انقر على أحدها للاطّلاع على تفاصيله ومَعلماته.
- اختَر أداة تتضمّن مَعلمات، ثم اختَر بعض المَعلمات وانقر على تشغيل الأداة للاطّلاع على طريقة عملها.
- (اختياري) إذا ثبّت WebMCP Model Context Tool Inspector وأعددته، افتحه، وسيتم فتحه في اللوحة الجانبية في Chrome. استخدِم واجهة المحادثة لطلب إجراء معيّن من الوكيل، على أن يكون هذا الإجراء من المفترض أن يستدعي إحدى أدواتك، وذلك لمعرفة كيفية استجابة الوكيل.
5- (اختياري) إنشاء وكيل داخل الموقع
استدعاء أدوات WebMCP داخل الصفحة
لا تقتصر أدوات WebMCP على إضافات المتصفّح الخارجية أو برامج التتبّع الآلية التابعة لجهات خارجية، بل يمكن لتطبيقك الخاص استدعاؤها مباشرةً. من خلال طلب البحث من document.modelContext.getTools()، يمكن لرمزك من جهة العميل اكتشاف الأدوات وتنفيذها بشكلٍ ديناميكي.
يمكنك استخدام هذه الميزة لإنشاء مساعد تسوّق مستند إلى الذكاء الاصطناعي على الموقع الإلكتروني، ما يؤدي إلى تحويل شريط البحث إلى أداة لاكتشاف المنتجات استنادًا إلى الإدخال باللغة الطبيعية. بدلاً من كتابة رمز إلزامي مخصّص لتنسيق العديد من فلاتر الأوجه، يمكن لشريط البحث إرسال طلبات بحث باللغة الطبيعية إلى Prompt API، التي تحدّد أدوات WebMCP التي سيتم استدعاؤها على الصفحة.
لاكتشاف أداة WebMCP واستدعائها من JavaScript، اتّبِع الخطوات التالية:
// getTools() returns a Promise — it must be awaited.
const tools = await document.modelContext.getTools();
const tool = tools.find(t => t.name === 'list_items');
const json = await document.modelContext.executeTool(tool, args);
const result = JSON.parse(json); // executeTool resolves with a DOMString
المهمة 3.1: أدوات الفلاتر في الشريط الجانبي
اعرض كل جزء من الشريط الجانبي للكتالوج على WebMCP حتى يتمكّن العملاء (ومساعد البحث داخل الصفحة) من تفعيل الفلاتر وإيقافها آليًا.
يوفّر كل مكوّن من مكوّنات التصميم المتعدّد الأوجه في src/components/facets/ طريقة مساعدة في فئته ومخطط إدخال تم تصديره في src/utils/filter-schemas.ts:
- في
src/components/facets/ActivityFacet.ts:- سجِّل بطاقة "
activity_filter" باستخدامactivityFilterSchema. - في
execute، اتّصِل بالرقمthis.filterActivity(input?.activity, input?.selected).
- سجِّل بطاقة "
- في
src/components/facets/CategoryFacet.ts:- سجِّل بطاقة "
category_filter" باستخدامcategoryFilterSchema. - في
execute، اتّصِل بالرقمthis.filterCategory(input?.category, input?.selected).
- سجِّل بطاقة "
- في
src/components/facets/ConditionFacet.ts:- سجِّل بطاقة "
condition_filter" باستخدامconditionFilterSchema. - في
execute، اتّصِل بالرقمthis.filterCondition(input?.condition, input?.selected).
- سجِّل بطاقة "
- في
src/components/facets/PriceFacet.ts:- سجِّل بطاقة "
price_filter" باستخدامpriceFilterSchema. - في
execute، اتّصِل بالرقمthis.filterPrice(input?.priceRange || input?.bracket, input?.selected).
- سجِّل بطاقة "
- في
src/components/facets/WeightFacet.ts:- سجِّل بطاقة "
weight_filter" باستخدامweightFilterSchema. - في
execute، اتّصِل بالرقمthis.filterWeight(input?.weightRange || input?.bracket, input?.selected).
- سجِّل بطاقة "
- في
src/components/facets/RatingFacet.ts:- سجِّل بطاقة "
rating_filter" باستخدامratingFilterSchema. - في
execute، اتّصِل بالرقمthis.filterRating(input?.minRating || input?.rating, input?.selected).
- سجِّل بطاقة "
- في
src/components/facets/SearchFacet.ts:- سجِّل بطاقة "
keyword_filter" باستخدامkeywordFilterSchema. - في
execute، اتّصِل بالرقمthis.updateKeyword(input?.keyword).
- سجِّل بطاقة "
تذكَّر التحقّق من توفّر WebMCP وإدخال { signal: this.signal } مع .catch(() => {}) كما تعلّمت في الخطوة 2.
المهمة 3.2: أدوات عرض الكتالوج
يمكنك الآن تسجيل أدوات بطاقة البيانات على مستوى الكتالوج وإعادة ضبط الفلتر والبحث الدلالي على document.modelContext.
انتقِل إلى الملف: src/views/CatalogView.ts
فحص registerWebMCPTools() في الأسطر من 125 إلى 140:
private registerWebMCPTools(): void
- تحقَّق مما إذا كان WebMCP متاحًا.
- تسجيل أداة
list_items:- لا يتطلّب أي مَعلمات إدخال وهو للقراءة فقط.
- يجب أن تستدعي الدالة
executeالدالةthis.getItemsSummary().
- تسجيل أداة
reset_filters:- لا تتطلّب أي مَعلمات إدخال.
- يجب أن تستدعي الدالة
executeالدالةthis.resetFilters().
- تسجيل أداة
semantic_catalog_filter:- استخدم
semanticCatalogFilterSchema. - يجب أن تستدعي الدالة
executeالدالةinterpretAndApplySemanticFilter(input.query).
- استخدم
المهمة 3.3: تنسيق وكيل الفلتر الدلالي
حان الوقت الآن لربط كل ذلك. تحوّل هذه المهمة البحث إلى مسار دلالي يشغّل أداة semantic_catalog_filter:
انتقِل إلى الملف: src/ai/catalog-semantic-filter.ts
فحص prewarmSemanticFilterSession() في الأسطر من 84 إلى 88:
export async function prewarmSemanticFilterSession(): Promise<void>
- تحقَّق مما إذا كان
warmSessionموجودًا من قبل، وإذا كان الأمر كذلك، ارجع مبكرًا. - يمكنك تسخين جلسة Prompt API مسبقًا باستخدام
SEMANTIC_FILTER_SYSTEM_PROMPTمن خلالgetPromptSession()وتخزينها فيwarmSession. يمكنك تضمينها في كتلةtry/catchحتى يظلّ بإمكانك الرجوع إلى الإصدار السابق من ميزة البحث بسلاسة في حال تعذّر التسخين المسبق.
فحص inferSearchFacets() في الأسطر من 93 إلى 134:
async function inferSearchFacets(
searchTerm: string,
cachedJourney: JourneyProfile | null
): Promise<{ parsed: SemanticFilterResponse; cacheHit: boolean }>
- يمكنك طلب الجلسة المُسخّنة مسبقًا من
warmSessionإذا كانت متاحة (وإعادة ضبطwarmSessionإلىnull)، أو إنشاء جلسة جديدة باستخدامgetPromptSession(SEMANTIC_FILTER_SYSTEM_PROMPT). - قدِّم الطلب إلى النموذج باستخدام
promptText، مع استخدامsemanticFilterSchemaكـresponseConstraint. - حلِّل ملف JSON الذي تم إرجاعه، وخزِّن النتيجة التي تم تحليلها في ذاكرة التخزين المؤقت الثابتة باستخدام
cacheKey، وأنهِ الجلسة في كتلةfinally.
فحص applyFacetsViaWebMCP() في الأسطر من 139 إلى 270:
async function applyFacetsViaWebMCP(
searchTerm: string,
parsed: SemanticFilterResponse
): Promise<{ appliedFilters: SemanticFilterResult['appliedFilters']; toolsExecuted: string[] }>
- استكشاف الأدوات المسجَّلة على
document.modelContextباستخدامawait document.modelContext.getTools() - يمكنك إعادة ضبط الفلاتر للبدء من جديد عن طريق الاتصال بالرقم
await executeFacet('reset_filters', {}). - تطبيق الأوجه النشطة بشكلٍ متزامن باستخدام
await Promise.all(facetTasks)
فحص interpretAndApplySemanticFilter() في الأسطر من 272 إلى 316:
export async function interpretAndApplySemanticFilter(
searchTerm: string
): Promise<SemanticFilterResult>
- استنتاج تصنيفات البحث من خلال استدعاء
inferSearchFacets(searchTerm, cachedJourney) - طبِّق التصنيفات المستنتَجة على الكتالوج باستخدام
applyFacetsViaWebMCP(searchTerm, parsed).
التأكّد من صحة معلومات الوكيل على الصفحة
- الانتقال إلى
http://localhost:5173/catalog - في شريط البحث العلوي، أدخِل:
"lightweight 3 season tent for wet hikes" - شاهِد كيف تحلّل Prompt API الطلب، وتستدعي
activity_filter(رحلات المشي لمسافات طويلة) وcategory_filter(خيام) وcondition_filter(مبلّلة)، وتضيّق نطاق الكتالوج على الفور ليقتصر على المعدات المطابقة بدون الحاجة إلى النقر يدويًا على مربعات الاختيار.
6. ما تعلّمته
تهانينا لقد حوّلت تطبيقًا للتجارة الإلكترونية إلى تجربة ذكية تعتمد على وكيل، وتستند بالكامل إلى الذكاء الاصطناعي على الجهاز فقط وواجهات برمجة التطبيقات العادية لمنصة الويب.
ما تم إنشاؤه:
- On-device Prompt API: تمّ تركيب المخططات الزمنية لتصفّح المستخدمين باستخدام
LanguageModelلإنشاء سياقJourneyProfileفي الوقت الفعلي، وتمّ إنشاء محرّكrankComplementaryGearتآزري باستخدام مخططات JSON المنظَّمة (responseConstraint). - أدوات WebMCP: أدوات مسجّلة نمطية ومغلّفة في جميع مكونات واجهة المستخدم (
get_recommendationsوget_current_productوview_cartوmanage_cart) من خلالdocument.modelContext - بنية التوجيه إلى الوكيل: تم اختبار تنفيذ الأداة والتحقّق منه باستخدام إضافة Chrome WebMCP Inspector.
- وكيل في الصفحة على الموقع الإلكتروني: أدوات منسَّقة من جهة العميل مباشرةً في المتصفّح لتفعيل البحث في قائمة المنتجات بلغة طبيعية ومتعددة الأوجه من شريط البحث في رأس الموقع الإلكتروني
- نماذج الذكاء الاصطناعي المتخصّصة على الجهاز فقط: استكشفنا الترجمة الديناميكية على الجهاز فقط باستخدام
Translator.
الخلاصات المقتطفة الرئيسية:
- زمن استجابة معدوم ومستوى عالٍ من الخصوصية: تعمل النماذج على الجهاز فقط، مثل Gemini Nano، على إلغاء مفاتيح واجهة برمجة التطبيقات السحابية وزمن استجابة الشبكة ومخاوف استخراج البيانات.
- النتائج المنظَّمة ضرورية: يؤدي استخدام مخططات JSON مع
responseConstraintإلى تحويل عملية إنشاء النصوص الإبداعية إلى منطق تطبيق موثوق وآمن من حيث النوع. - تجهّز WebMCP الويب لوكلاء الذكاء الاصطناعي: يتيح تسجيل الأدوات مباشرةً في DOM لكلّ من الميزات المساعدة الداخلية ووكلاء المتصفّح المستقلين الخارجيين تنفيذ إجراءات مؤكَّدة ومحدَّدة.
- السماح للنموذج بالاقتراح وليس التنفيذ: من خلال حصر النموذج في
enumمن أدواتك المسجّلة وإرسال النتيجة بنفسك، يمكنك إبقاء السلوك المستند إلى الوكلاء قابلاً للتدقيق ومنعه من ابتكار إجراءات.