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

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

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

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

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

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

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

आपके ऐप्लिकेशन को यह पुष्टि करने की ज़रूरत नहीं है कि 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 MCP के लिए, फ़ंक्शन और प्रॉपर्टी के दस्तावेज़ों को ऑप्टिमाइज़ करें.
    • टेस्टिंग और डीबग करना: उपयोगकर्ता के डिवाइस पर स्थानीय तौर पर आकलन और डीबग करने के लिए, ADB कमांड उपलब्ध कराएं.
  • कमांड-लाइन टेस्टिंग और पुष्टि के लिए, adb shell cmd app_function ... जैसे एडीबी कमांड का इस्तेमाल करें. यह, उपयोगकर्ता के डिवाइस पर फ़ंक्शन रजिस्ट्रेशन की जांच करने, मेटाडेटा के ब्यौरे की जांच करने, और फ़ंक्शन का इस्तेमाल करने का एक आसान और तेज़ तरीका है.
  • Android MCP को आज़माने और बिना किसी प्रॉम्प्ट के एंड-टू-एंड वर्कफ़्लो की जांच करने के लिए, अपने डिवाइस पर AppFunctions टेस्टिंग एजेंट Android ऐप्लिकेशन इंस्टॉल करें और उसका इस्तेमाल करें.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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