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

AppFunctions, Android प्लैटफ़ॉर्म का एपीआई है. इसके साथ, Jetpack लाइब्रेरी भी उपलब्ध है, ताकि Android MCP इंटिग्रेशन को आसान बनाया जा सके. इससे आपके ऐप्लिकेशन, डिवाइस पर मौजूद एमसीपी सर्वर की तरह काम कर पाते हैं. साथ ही, ऐसे फ़ंक्शन उपलब्ध कराते हैं जो 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 context The execution context provided by the system.
    *   @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(
        context: AppFunctionContext,
        title: String,
        dueDateTime: LocalDateTime? = null,
        location: String? = null
    ) : Task
    
  • मीडिया और मनोरंजन

    • उपयोगकर्ता का अनुरोध: "इस साल के टॉप जैज़ एल्बम की एक नई प्लेलिस्ट बनाओ".
    • AppFunction की कार्रवाई: कॉलर, संगीत वाले ऐप्लिकेशन में प्लेलिस्ट बनाने का फ़ंक्शन लागू करता है. साथ ही, "2026 के टॉप जैज़ एल्बम" जैसे कॉन्टेक्स्ट को क्वेरी के तौर पर पास करता है, ताकि तुरंत प्लेलिस्ट जनरेट की जा सके.
    /**
    *   Create a new music playlist based on a natural language query.
    *
    *   @param context The execution context provided by the system.
    *   @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(
        context: AppFunctionContext,
        query: String
    ): Playlist
    
  • एक से ज़्यादा ऐप्लिकेशन के वर्कफ़्लो

    • उपयोगकर्ता का अनुरोध: "लीसा के ईमेल से नूडल की रेसिपी ढूंढो और उसमें शामिल चीज़ों को मेरी ख़रीदारी की सूची में जोड़ो".
    • AppFunction की कार्रवाई: इस अनुरोध में, एक से ज़्यादा ऐप्लिकेशन के फ़ंक्शन का इस्तेमाल किया जाता है. सबसे पहले, कॉलर, कॉन्टेंट को वापस पाने के लिए, ईमेल वाले ऐप्लिकेशन के खोज फ़ंक्शन का इस्तेमाल करता है. इसके बाद, वह काम की चीज़ों को निकालता है और उपयोगकर्ता की सूची को भरने के लिए, ख़रीदारी की सूची वाले ऐप्लिकेशन के फ़ंक्शन को लागू करता है.
    /**
    *   Search for emails matching a query or sender name to retrieve content like recipes.
    *
    *   @param context The execution context provided by the system.
    *   @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(
        context: AppFunctionContext,
        query: String
    ): List<EmailSummary>
    
    /**
    *   Add a list of items or ingredients to the user's active shopping list.
    *
    *   @param context The execution context provided by the system.
    *   @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(
        context: AppFunctionContext,
        items: List<String>
    ): ShoppingList
    
  • कैलेंडर और समय निर्धारण

    • उपयोगकर्ता का अनुरोध: "अगले सोमवार को शाम 6 बजे, मेरे कैलेंडर में मम्मी के जन्मदिन की पार्टी जोड़ो".
    • AppFunction की कार्रवाई: अनुमति वाला एजेंटिक ऐप्लिकेशन, कैलेंडर वाले ऐप्लिकेशन के "इवेंट बनाएं" फ़ंक्शन को लागू करता है. साथ ही, "अगले सोमवार" और "शाम 6 बजे" जैसे काम के कॉन्टेक्स्ट को पार्स करता है, ताकि उपयोगकर्ता को मैन्युअल तरीके से कैलेंडर खोलने की ज़रूरत न पड़े.
    /**
    *   Schedule a new event on the user's primary calendar.
    *
    *   @param context The execution context provided by the system.
    *   @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(
        context: AppFunctionContext,
        title: String,
        startDateTime: LocalDateTime
    ): Event
    

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

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

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

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

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

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

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

/**
 *   A note app's [AppFunction]s.
 */
class NoteFunctions(
    private val noteRepository: NoteRepository
) {
    /**
     *   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 noteRepository.appNotes.ifEmpty { null }?.toList()
    }

    /**
     *   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 note's 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: Int,
        title: String?,
        content: String?,
    ): Note? {
        return noteRepository.updateNote(noteId, title, content)
    }
}

/**
 *   A note.
 */
@AppFunctionSerializable(isDescribedByKDoc = true)
data class Note(
    /** The note's identifier */
    val id: Int,
    /** The note's title */
    val title: String,
    /** The note's content */
    val content: String
)

सैंपल, स्किल, और टेस्ट एजेंट

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

  • AppFunctions सैंपल को एक्सप्लोर करके, यह पुष्टि करें कि आपके डिवाइसों पर सब कुछ कैसे काम करता है.
  • AppFunctions skill की स्किल, आपके ऐप्लिकेशन की उन सुविधाओं को ढूंढती है और उनके बारे में सुझाव देती है जिन्हें AppFunctions के तौर पर लागू किया जा सकता है. यह आपके लिए, मौजूदा AppFunctions को लागू और बेहतर भी बना सकती है.
  • एंड-टू-एंड टेस्ट करने के लिए, सैंपल एजेंट ऐप्लिकेशन का इस्तेमाल करें.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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