نظرة عامة على AppFunctions

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

تعمل AppFunctions كأداة مكافئة للأدوات المتوفّرة في بروتوكول سياق النموذج (MCP) على الأجهزة الجوّالة. في حين أنّ MCP يوحّد بشكل تقليدي طريقة اتصال البرامج بخدمات من جهة الخادم، توفّر AppFunctions الآلية نفسها لتطبيقات Android. يتيح لك ذلك عرض إمكانات تطبيقك كـ "أدوات" قابلة للتنسيق يمكن للتطبيقات المصرَّح لها (المتصلة) استكشافها وتنفيذها لتلبية طلبات المستخدمين. يجب أن يكون لدى المتصلين إذن EXECUTE_APP_FUNCTIONS لاكتشاف AppFunctions وتنفيذها، ويمكن أن يشمل ذلك الوكلاء والتطبيقات ومساعدي الذكاء الاصطناعي، مثل Gemini.

تعمل ميزة AppFunctions مع الأجهزة التي تعمل بالإصدار 16 من نظام التشغيل Android أو إصدار أحدث.

أمثلة على حالات الاستخدام

توفّر AppFunctions آلية فعّالة لأتمتة المهام وتسهيل تفاعلات المستخدمين. من خلال إتاحة إمكانات تطبيقك، يمكنك مساعدة المستخدمين على تحقيق أهداف معقّدة باستخدام اللغة الطبيعية، ما يغنيهم في كثير من الأحيان عن التنقّل اليدوي خطوة بخطوة في واجهة المستخدم.

توضّح السيناريوهات التالية كيفية استخدام AppFunctions لتقديم تجارب ضمن مجموعة متنوعة من فئات التطبيقات:

  • إدارة المهام والإنتاجية
    • طلب المستخدم: "ذكّرني باستلام طردي في العمل اليوم الساعة 5 مساءً".
    • إجراء AppFunction: يحدّد المتصل تطبيق إدارة المهام المناسب ويستدعي وظيفة لإنشاء مهمة، مع ملء حقول العنوان والوقت والموقع الجغرافي تلقائيًا استنادًا إلى طلب المستخدم.
  • الوسائط والترفيه
    • طلب المستخدم: "أنشئ قائمة تشغيل جديدة تضم أفضل ألبومات الجاز لهذا العام".
    • إجراء AppFunction: ينفّذ المتصل وظيفة إنشاء قائمة تشغيل داخل تطبيق موسيقى، مع تمرير سياق مثل "أفضل ألبومات الجاز لعام 2026" كطلب بحث لإنشاء المحتوى وتشغيله على الفور.
  • مهام سير العمل على مستوى التطبيقات
    • طلب المستخدم: "ابحث عن وصفة النودلز من البريد الإلكتروني الخاص بـ "ليلى" وأضِف المكونات إلى قائمة التسوّق".
    • الإجراء AppFunction: يستخدم هذا الطلب وظائف من تطبيقات متعددة. أولاً، يستخدم المتصل وظيفة البحث في تطبيق البريد الإلكتروني لاسترداد المحتوى. بعد ذلك، يستخرج المكوّنات ذات الصلة ويستدعي وظيفة تطبيق قائمة التسوّق لملء قائمة المستخدم.
  • التقويم والجداول الزمنية
    • طلب المستخدم: "أضِف حفلة عيد ميلاد أمي إلى تقويمي ليوم الاثنين التالي في الساعة 6 مساءً".
    • إجراء AppFunction: يستدعي التطبيق الوكيل الذي تمت الموافقة عليه وظيفة "إنشاء حدث" في تطبيق التقويم، ويحلّل السياق ذي الصلة، مثل "الاثنين المقبل" و"الساعة 6 مساءً" لإنشاء الإدخال بدون أن يحتاج المستخدم إلى فتح التقويم يدويًا.

طريقة عمل AppFunctions

AppFunctions هي ميزة في نظام التشغيل Android 16 ومكتبة Jetpack مصاحبة لها تتيح للتطبيقات عرض وظائف معيّنة للمتصلين، مثل تطبيقات الوكيل، للوصول إليها وتنفيذها على الجهاز.

يوضّح الرسم البياني التالي المسار النموذجي لكيفية مشاركة التطبيقات لوظائف AppFunctions مع أحد الوكلاء وتنفيذها لاحقًا. من المرجّح أن تأخذ البرامج في الاعتبار أدوات MCP البعيدة من جهة الخادم وAppFunctions المحلية معًا عند التعامل مع طلبات المستخدمين. في ما يلي التدفق التفصيلي لاستخدام AppFunctions المحلية:

  • تعريف AppFunction: تم تصميم تطبيق Android لعرض AppFunctions، مثل "إنشاء ملاحظة" أو "إرسال رسالة".
  • إنشاء المخطط: تنشئ مكتبة AppFunctions Jetpack ملف مخطط XML يتضمّن جميع AppFunctions المعرَّفة في التطبيق. ويستخدم نظام التشغيل Android هذا الملف لفهرسة AppFunctions المتاحة.
  • استرداد البيانات الوصفية: يمكن للوكيل استرداد البيانات الوصفية الخاصة بـ AppFunction من خلال طلبها.
  • اختيار AppFunction وتنفيذها: استنادًا إلى طلبات المستخدمين، سيختار الوكيل AppFunction المناسبة وينفّذها باستخدام المَعلمات المناسبة.
مخطّط بياني يوضّح التدفق النموذجي لوظائف AppFunctions من عرض التطبيق إلى تنفيذ الوكيل
الشكل 1: العملية النموذجية لكيفية عرض AppFunctions وتنفيذها لاحقًا بواسطة وكيل

تسهّل مكتبة AppFunctions Jetpack إتاحة وظائف تطبيقك. باستخدام معالج التعليقات التوضيحية، يضيف المطوّرون تعليقات توضيحية إلى الدوال التي يريدون إتاحتها. يمكن للمتصلين بعد ذلك العثور على هذه الدوال المفهرسة واستدعائها باستخدام AppFunctionManager.

ليس مطلوبًا من تطبيقك التحقّق مما إذا كانت ميزة AppFunction متاحة، إذ يتم التعامل مع ذلك تلقائيًا ضمن مكتبة Jetpack. على سبيل المثال، يمكن أن تتحقّق الفئة AppFunctionManager مما إذا كانت الميزة متاحة أم لا.

في ما يلي مثال على AppFunctions لتطبيق تدوين ملاحظات يتضمّن إمكانات إنشاء الملاحظات وتعديلها وإدراجها.

class NoteFunctions(
  private val noteRepository: NoteRepository
) {
    /**
     * A note.
     *
     * @param id The note's ID.
     * @param title The note's title.
     * @param content The note's content.
     */
    @AppFunctionSerializable(isDescribedByKDoc = true)
    data class Note(val id: Int, val title: String, val content: String)

    /**
     * Lists all available notes.
     *
     * @param appFunctionContext The context in which the AppFunction is executed.
     */
    @AppFunction(isDescribedByKDoc = true)
    suspend fun listNotes(appFunctionContext: AppFunctionContext): List<Note>? {
        return if (noteRepository.appNotes.isEmpty()) null else viewModel.appNotes
    }

    /**
     * Adds a new note to the app.
     *
     * @param appFunctionContext The context in which the AppFunction is executed.
     * @param title The title of the note.
     * @param content The note's content.
     */
    @AppFunction(isDescribedByKDoc = true)
    suspend fun createNote(
      appFunctionContext: AppFunctionContext,
      title: String,
      content: String
    ): Note {
        return noteRepository.createNote(title, content)
    }

    /**
     * Edits a single note.
     *
     * @param appFunctionContext The context in which the AppFunction is executed.
     * @param noteId The target note's ID.
     * @param title The new title if it should be updated.
     * @param content The new content if it should be updated.
     */
    @AppFunction(isDescribedByKDoc = true)
    suspend fun editNote(
      appFunctionContext: AppFunctionContext,
      noteId: String,
      title: String?,
      content: String,
    ): Note? {
        return noteRepository.updateNote(noteId, title, content)
    }
}