AppFunctions के बारे में खास जानकारी

AppFunctions, Android प्लैटफ़ॉर्म का एपीआई है. इसके साथ, Jetpack लाइब्रेरी भी उपलब्ध है. इससे Android में एमसीपी को इंटिग्रेट करना आसान हो जाता है. इसकी मदद से, आपके ऐप्लिकेशन, डिवाइस पर मौजूद एमसीपी सर्वर की तरह काम कर सकते हैं. साथ ही, ऐसे फ़ंक्शन उपलब्ध करा सकते हैं जो Google Gemini जैसे एजेंट और असिस्टेंट के साथ-साथ, सक्रिय सुविधाओं के लिए टूल के तौर पर काम करते हैं. मई 2026 तक, AppFunctions को Gemini के साथ इंटिग्रेट करने की सुविधा, भरोसेमंद टेस्टर के लिए निजी तौर पर उपलब्ध है. AppFunctions और डेवलपमेंट टूल का इस्तेमाल करने के लिए, अपने ऐप्लिकेशन को अभी से तैयार किया जा सकता है.

AppFunctions को तय करके, अपने ऐप्लिकेशन को Android OS में बने रजिस्ट्री को सेवाएं, डेटा, और कार्रवाइयां उपलब्ध कराने की अनुमति दी जा सकती है. इससे, लोग एजेंट और सिस्टम-लेवल इंटरैक्शन की मदद से टास्क पूरे कर सकते हैं.

AppFunctions, मॉडल कॉन्टेक्स्ट प्रोटोकॉल (एमसीपी) में मौजूद टूल के मोबाइल वर्शन की तरह काम करते हैं. आम तौर पर, एमसीपी एजेंट को सर्वर-साइड टूल से कनेक्ट करने के तरीके को स्टैंडर्ड बनाता है. वहीं, AppFunctions, Android ऐप्लिकेशन के लिए भी यही तरीका उपलब्ध कराते हैं. इससे, अपने ऐप्लिकेशन की केपबिलिटी को "टूल" के तौर पर दिखाया जा सकता है. इन टूल को अनुमति वाले ऐप्लिकेशन (कॉलर) खोज सकते हैं और लोगों के इंटेंट को पूरा करने के लिए, उन्हें लागू कर सकते हैं. AppFunctions को खोजने और लागू करने के लिए, कॉलर के पास EXECUTE_APP_FUNCTIONS की अनुमति होनी चाहिए. इसमें एजेंट, ऐप्लिकेशन, और AI असिस्टेंट शामिल हो सकते हैं.

AppFunctions, Android 16 या इसके बाद के वर्शन वाले डिवाइसों पर उपलब्ध है.

इस्तेमाल के उदाहरण

AppFunctions, टास्क को ऑटोमेट करने और लोगों के इंटरैक्शन को बेहतर बनाने का एक बेहतरीन तरीका है. अपने ऐप्लिकेशन की केपबिलिटी को खोलकर, लोगों को नैचुरल लैंग्वेज का इस्तेमाल करके मुश्किल टास्क पूरे करने की अनुमति दी जा सकती है. इससे, यूज़र इंटरफ़ेस (यूआई) की मदद से, मैन्युअल तरीके से एक-एक करके नेविगेट करने की ज़रूरत नहीं पड़ती.

यहां दिए गए उदाहरणों से पता चलता है कि अलग-अलग कैटगरी के ऐप्लिकेशन में, AppFunctions का इस्तेमाल कैसे किया जा सकता है:

  • टास्क मैनेजमेंट और प्रॉडक्टिविटी

    • लोगों का अनुरोध: "मुझे आज शाम 5 बजे, ऑफ़िस से अपना पार्सल पिक अप करने के लिए याद दिलाओ".
    • AppFunction की कार्रवाई: कॉलर, टास्क मैनेजमेंट से जुड़े काम के ऐप्लिकेशन की पहचान करता है और टास्क बनाने के लिए, किसी फ़ंक्शन को लागू करता है. इससे, लोगों के प्रॉम्प्ट के आधार पर, टाइटल, समय, और जगह के फ़ील्ड अपने-आप भर जाते हैं.

    /**
     * Create a new task or reminder with a title, due time, and location.
     *
     * @param title The descriptive title of the task (e.g., "Pick up my package").
     * @param dueDateTime The specific date and time when the task should be completed.
     * @param location The physical location associated with the task (e.g., "Work").
     * @return The created Task
     */
    @AppFunction(isDescribedByKDoc = true)
    suspend fun createTask(
        title: String,
        dueDateTime: LocalDateTime? = null,
        location: String? = null,
    ): Task = TODO()

  • मीडिया और मनोरंजन

    • लोगों का अनुरोध: "इस साल के टॉप जैज़ एल्बम की एक नई प्लेलिस्ट बनाओ".
    • AppFunction की कार्रवाई: कॉलर, संगीत से जुड़े ऐप्लिकेशन में प्लेलिस्ट बनाने का फ़ंक्शन लागू करता है. साथ ही, क्वेरी के तौर पर "2026 के टॉप जैज़ एल्बम" जैसे कॉन्टेक्स्ट को पास करता है, ताकि तुरंत प्लेलिस्ट जनरेट की जा सके.

    /**
     * Create a new music playlist based on a natural language query.
     *
     * @param query The description used to generate the playlist (e.g., "top jazz albums from 2026").
     * @return The final created playlist based on songs.
     */
    @AppFunction(isDescribedByKDoc = true)
    suspend fun createPlaylistFromQuery(
        query: String,
    ): Playlist = TODO()

  • एक से ज़्यादा ऐप्लिकेशन के वर्कफ़्लो

    • लोगों का अनुरोध: "लीसा के ईमेल से नूडल की रेसिपी ढूंढो और उसमें इस्तेमाल होने वाली चीज़ों को मेरी ख़रीदारी की सूची में जोड़ो".
    • AppFunction की कार्रवाई: इस अनुरोध में, एक से ज़्यादा ऐप्लिकेशन के फ़ंक्शन का इस्तेमाल किया जाता है. सबसे पहले, कॉलर, कॉन्टेंट को वापस पाने के लिए, ईमेल ऐप्लिकेशन के खोज फ़ंक्शन का इस्तेमाल करता है. इसके बाद, वह काम की चीज़ों को निकालता है और लोगों की सूची को भरने के लिए, ख़रीदारी की सूची वाले ऐप्लिकेशन के फ़ंक्शन को लागू करता है.

    /**
     * Search for emails matching a query or sender name to retrieve content like recipes.
     *
     * @param query The search term or contact name (e.g., "Lisa noodle recipe").
     * @return A list of matching email summaries containing the requested information.
     */
    @AppFunction(isDescribedByKDoc = true)
    suspend fun searchEmails(
        query: String,
    ): List<EmailSummary> = TODO()
    
    /**
     * Add a list of items or ingredients to the user's active shopping list.
     *
     * @param items The names of the ingredients or products to add to the list.
     * @return The final shopping list with new items added
     */
    @AppFunction(isDescribedByKDoc = true)
    suspend fun addItemsToShoppingList(
        items: List<String>,
    ): ShoppingList = TODO()

  • कैलेंडर और समय निर्धारण

    • लोगों का अनुरोध: "अगले सोमवार को शाम 6 बजे, मेरे कैलेंडर में मम्मी के जन्मदिन की पार्टी जोड़ो".
    • AppFunction की कार्रवाई: अनुमति वाला एजेंटिक ऐप्लिकेशन, कैलेंडर ऐप्लिकेशन के "इवेंट बनाएं" फ़ंक्शन को लागू करता है. साथ ही, "अगले सोमवार" और "शाम 6 बजे" जैसे काम के कॉन्टेक्स्ट को पार्स करता है, ताकि लोगों को मैन्युअल तरीके से कैलेंडर खोलने की ज़रूरत न पड़े.

    /**
     * Schedule a new event on the user's primary calendar.
     *
     * @param title The name of the calendar event (e.g., "Mom's birthday party").
     * @param startDateTime The specific date and time the event is scheduled to begin.
     * @return The created Event object.
     */
    @AppFunction(isDescribedByKDoc = true)
    suspend fun createCalendarEvent(
        title: String,
        startDateTime: LocalDateTime,
    ): Event = TODO()

AppFunctions कैसे काम करते हैं

यहां दिए गए डाइग्राम से पता चलता है कि ऐप्लिकेशन, AppFunctions को एजेंट के साथ कैसे शेयर करते हैं और उन्हें कैसे लागू किया जाता है. लोगों के अनुरोधों को पूरा करते समय, एजेंट, सर्वर-साइड रिमोट एमसीपी टूल और स्थानीय AppFunctions, दोनों का इस्तेमाल कर सकते हैं. स्थानीय AppFunctions का इस्तेमाल करने का तरीका यहां दिया गया है:

  • AppFunction का एलान: Android ऐप्लिकेशन, AppFunctions का इस्तेमाल करके बनाया जाता है, ताकि "नोट बनाएं" या "मैसेज भेजें" जैसी सुविधाएं उपलब्ध कराई जा सकें.
  • स्कीमा जनरेट करना: AppFunctions Jetpack लाइब्रेरी, एक XML स्कीमा फ़ाइल जनरेट करती है. इसमें, ऐप्लिकेशन में एलान किए गए सभी AppFunctions की सूची होती है. Android OS, उपलब्ध AppFunctions को इंडेक्स करने के लिए इस फ़ाइल का इस्तेमाल करता है.
  • मेटाडेटा वापस पाना: एजेंट, AppFunction के मेटाडेटा को क्वेरी करके वापस पा सकता है. डेवलपर, फ़ंक्शन के हिसाब से KDocs के अलावा, ऐप्लिकेशन के मेटाडेटा में ऐप्लिकेशन-लेवल के ऑपरेशनल पैटर्न और कंस्ट्रेंट तय कर सकते हैं. इससे, एक से ज़्यादा टूल में एजेंट ऑर्केस्ट्रेशन को गाइड किया जा सकता है.
  • AppFunction चुनना और लागू करना: लोगों के प्रॉम्प्ट के आधार पर, एजेंट सही पैरामीटर के साथ सही AppFunction को चुनता है और उसे लागू करता है.
ऐप्लिकेशन के एक्सपोज़र से लेकर एजेंट के एक्ज़ीक्यूशन तक, AppFunctions का सामान्य फ़्लो.
पहली इमेज: AppFunctions को एजेंट के साथ शेयर करने और उन्हें लागू करने का तरीका.

AppFunctions Jetpack लाइब्रेरी, आपके ऐप्लिकेशन के फ़ंक्शन को शेयर करना आसान बनाती है. एनोटेशन प्रोसेसर की मदद से, उन फ़ंक्शन को एनोटेट किया जा सकता है जिन्हें एजेंट के लिए उपलब्ध कराना है. इसके बाद, कॉलर, इंडेक्स किए गए इन फ़ंक्शन को खोज सकते हैं और उन्हें AppFunctionManagerका इस्तेमाल करके लागू कर सकते हैं.

किसी फ़ंक्शन को लागू करने से पहले, कॉलर को यह पुष्टि करनी चाहिए कि डिवाइस, AppFunctions की सुविधा के साथ काम करता है या नहीं. इसके लिए, AppFunctionManager का कोई इंस्टेंस वापस पाने की कोशिश करें. पुष्टि होने के बाद, कॉलर, isAppFunctionEnabled(packageName,functionId) का इस्तेमाल करके, यह पुष्टि कर सकते हैं कि किसी टारगेट ऐप्लिकेशन में कोई खास फ़ंक्शन चालू है या नहीं. दूसरे पैकेज में मौजूद फ़ंक्शन की स्थिति के बारे में क्वेरी करने के लिए, android.permission.EXECUTE_APP_FUNCTIONS की अनुमति की ज़रूरत होती है.

आपके ऐप्लिकेशन को यह पुष्टि करने की ज़रूरत नहीं है कि AppFunction की सुविधा काम करती है या नहीं. यह काम, Jetpack लाइब्रेरी में अपने-आप हो जाता है. उदाहरण के लिए, AppFunctionManager यह पुष्टि कर सकता है कि सुविधा काम करती है या नहीं.

यहां, नोट लेने वाले ऐप्लिकेशन के लिए AppFunctions का एक उदाहरण दिया गया है. इसमें नोट बनाने, उनमें बदलाव करने, और उनकी सूची बनाने की सुविधाएं हैं:

@RequiresApi(36)
@AndroidEntryPoint
@AppFunctionServiceEntryPoint(
    serviceName = "TaskAppFunctionService",
    appFunctionXmlFileName = "task_app_function_service",
)
abstract class BaseTaskAppFunctionService : AppFunctionService() {
    @Inject internal lateinit var taskRepository: TaskRepository

    /**
     * Creates a task based on [createTaskParams].
     *
     * @param createTaskParams The parameter to describe how to create the task.
     */
    @AppFunction(isDescribedByKDoc = true)
    suspend fun createTask(
        createTaskParams: CreateTaskParams,
    ): Task = withContext(Dispatchers.IO) {
        // Developers can use predefined exceptions to let the agent know
        // why it failed.
        if (createTaskParams.title == null && createTaskParams.content == null) {
            throw AppFunctionInvalidArgumentException("Title or content should be non-null")
        }

        val id = taskRepository.createTask(
            createTaskParams.title,
            createTaskParams.content
        )

        return@withContext taskRepository
            .getTask(id)
            ?.toTask()
            ?: throw AppFunctionElementNotFoundException("Task not found for ID = $id")
    }

    // Maps internal TaskEntity
    private fun TaskEntity.toTask() = Task(id = id, title = title, content = description)
}

/** The parameter to create the task. */
@AppFunctionSerializable(isDescribedByKDoc = true)
data class CreateTaskParams(
    /** The title of the task. */
    val title: String?,
    /** The content of the task. */
    val content: String?,
)

/** The user-created task. */
@AppFunctionSerializable(isDescribedByKDoc = true)
data class Task(
    /** The ID of the task. */
    val id: String,
    /** The title of the task. */
    val title: String,
    /** The content of the task. */
    val content: String,
)

सैंपल, स्किल, और टेस्ट करने के टूल

AppFunctions में अपनी स्किल को बेहतर बनाने में आपकी मदद करने के लिए, हमने ये चीज़ें उपलब्ध कराई हैं:

  • AppFunctions सैंपल को एक्सप्लोर करके, यह पुष्टि करें कि आपके डिवाइसों पर सब कुछ कैसे काम करता है.
  • चार चरणों वाले लाइफ़साइकल में डेवलपमेंट को तेज़ करने के लिए, AppFunctions एजेंट स्किल का इस्तेमाल करें:
    • खोज: एआई ऑर्केस्ट्रेशन के लिए, ज़्यादा काम की सुविधाओं की पहचान करने और उन्हें सुझाने के लिए, अपने कोडबेस का विश्लेषण करें.
    • लागू करना और कॉन्फ़िगर करना: Kotlin के लागू करने के तरीके जनरेट करें. साथ ही, सिस्टम के मेटाडेटा और डिपेंडेंसी को कॉन्फ़िगर करें.
    • KDoc को बेहतर बनाना: एआई एजेंट और Android एमसीपी के लिए, फ़ंक्शन और प्रॉपर्टी के दस्तावेज़ों को ऑप्टिमाइज़ करें.
    • टेस्ट करना और डीबग करना: उपयोगकर्ता के डिवाइस पर स्थानीय तौर पर आकलन करने और डीबग करने के लिए, ADB कमांड उपलब्ध कराएं.
  • कमांड-लाइन टेस्टिंग और पुष्टि के लिए, adb shell cmd app_function ... जैसे ADB कमांड का इस्तेमाल करें. यह फ़ंक्शन रजिस्ट्रेशन को टेस्ट करने, मेटाडेटा के ब्यौरे की जांच करने, और डिवाइस पर फ़ंक्शन को लागू करने का एक आसान और तेज़ तरीका है.

अक्सर पूछे जाने वाले सवाल

इस सेक्शन में, AppFunctions के बारे में अक्सर पूछे जाने वाले सवालों के जवाब दिए गए हैं.

मैं एक ऐप्लिकेशन डेवलपर हूं. क्या मैं आज ही AppFunctions को लागू कर सकता/सकती हूं?

हां, AppFunctions को अपने ऐप्लिकेशन में लागू किया जा सकता है और टेस्ट किया जा सकता है. इसके लिए, पिछले सेक्शन में दिए गए निर्देशों का पालन करें.

AppFunctions और एमसीपी में क्या अंतर है?

दोनों की मदद से, एआई एजेंट टूल को ऑर्केस्ट्रेट कर सकते हैं. हालांकि, इनके आर्किटेक्चर, लेटेंसी, और डेवलपर की मेहनत में काफ़ी अंतर होता है. AppFunctions, OS-लेवल के बिल्ट-इन हुक हैं. ये सिर्फ़ Android के लिए उपलब्ध हैं और स्थानीय तौर पर काम करते हैं. इसके उलट, स्टैंडर्ड एमसीपी सर्वर, प्लैटफ़ॉर्म-अग्नोस्टिक सलूशन है. यह क्लाउड एक्ज़ीक्यूशन और नेटवर्क राउंड-ट्रिप पर निर्भर करता है.

संक्षेप में, AppFunctions की मदद से डेवलपमेंट करने पर, उपयोगकर्ता के डिवाइस पर मौजूद ऐप्लिकेशन की मौजूदा स्थिति का सीधे तौर पर इस्तेमाल किया जा सकता है. साथ ही, आपको अपने Android ऐप्लिकेशन के बाहर, सेवाओं को बनाए रखने की ज़रूरत नहीं होती.

मैंने अपने ऐप्लिकेशन में AppFunctions को लागू किया है. मेरा सिस्टम एजेंट, उन्हें ऐक्सेस क्यों नहीं कर पा रहा है?

AppFunctions, एक्सपेरिमेंट के तौर पर उपलब्ध सुविधा है. एक्सपेरिमेंट के दौरान, पूरे अनुभव की क्वालिटी का आकलन करने के लिए, सिर्फ़ कुछ ऐप्लिकेशन और सिस्टम एजेंट ही पूरे पाइपलाइन को ऐक्सेस कर सकते हैं.

AppFunctions के सामान्य रूप से उपलब्ध होने से पहले, मैं अपने ऐप्लिकेशन को कैसे तैयार करूं?

तय करें कि आपको अपने ऐप्लिकेशन की किन सुविधाओं को एजेंटिक ऑटोमेशन के लिए उपलब्ध कराना है. अपने ऐप्लिकेशन में AppFunctions को लागू किया जा सकता है. इसके लिए, इस पेज पर मौजूद पिछले सेक्शन में दिए गए निर्देशों का पालन करें. साथ ही, यह पुष्टि करें कि वे डिवाइस पर रजिस्टर हैं या नहीं. इसके लिए, adb shell cmd app_function list-app-functions को कॉल करें.

क्या मुझे एजेंटिक डेवलपर के एंड-टू-एंड अनुभव का ऐक्सेस, सार्वजनिक तौर पर उपलब्ध होने से पहले मिल सकता है?

हम Early Access Program (EAP) चला रहे हैं. इसके तहत, चुने गए ऐप्लिकेशन को Android पर AppFunctions को प्रोडक्शन में लॉन्च करने के लिए ज़रूरी, डेवलपर के एंड-टू-एंड अनुभव को टेस्ट करने की सुविधा दी जाती है. AppFunctions को इंटिग्रेट करने में दिलचस्पी दिखाने के लिए, EAP के लिए रजिस्टर करने का फ़ॉर्म भरें. रजिस्टर करने से, आपको इंटिग्रेशन का पूरा ऐक्सेस अपने-आप नहीं मिल जाता. अगर आपके ऐप्लिकेशन को EAP के लिए चुना जाता है, तो हम आपको ईमेल करेंगे. इसके अलावा, AppFunctions के सार्वजनिक तौर पर उपलब्ध होने पर भी हम आपको ईमेल करेंगे.

मैं AppFunctions के बारे में सुझाव/राय कैसे दूं या शिकायत कैसे करूं?

कोई समस्या सबमिट करके और Early Access Program के फ़ॉर्म में अपनी दिलचस्पी रजिस्टर करके, एपीआई के बारे में सुझाव/राय दी जा सकती है या शिकायत की जा सकती है.