Android SDK
एक थिन Kotlin और Jetpack Compose क्लाइंट जो Respondo सपोर्ट चैट को आपके ऐप के ऊपर बॉटम शीट के रूप में खोलता है।
आवश्यकताएँ#
minSdk24 (Android 7.0), compileSdk 35।- Kotlin 2.x और Jetpack Compose (SDK में Compose UI शामिल है)।
- JVM target 17।
SDK अपनी सारी ट्रांज़िटिव डिपेंडेंसी ख़ुद खींच लेता है (Coroutines, kotlinx.serialization, OkHttp, Coil, Compose) और अपने मैनिफ़ेस्ट में INTERNET अनुमति घोषित करता है — हाथ से कुछ जोड़ने की ज़रूरत नहीं।
इंस्टॉलेशन#
लाइब्रेरी Maven Central पर ai.respondo:respondo-sdk के रूप में प्रकाशित है। सुनिश्चित करें कि mavenCentral() आपकी repositories में है (नए Android प्रोजेक्ट में यह डिफ़ॉल्ट रूप से होता है), फिर डिपेंडेंसी को उसके coordinate से जोड़ें।
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
}
}dependencies {
implementation("ai.respondo:respondo-sdk:0.1.0")
}इनिशियलाइज़ करें#
Respondo.init को एक बार कॉल करें, RespondoChatHost() को अपने Compose ट्री में एक बार माउंट करें, और अपने ही बटन से चैट खोलें।
import ai.respondo.sdk.Respondo
import ai.respondo.sdk.RespondoConfig
import ai.respondo.sdk.ui.RespondoChatHost
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Respondo.init(
context = this,
config = RespondoConfig(
agentId = "<agent-uuid>", // डैशबोर्ड से
channelId = "<channel-uuid>", // वैकल्पिक
// baseUrl छोड़ा गया -> https://api.respondo.ai
),
)
setContent {
MaterialTheme {
Box(modifier = Modifier.fillMaxSize()) {
Button(onClick = { Respondo.open() }) { Text("Support") }
RespondoChatHost() // चैट स्टेट OPEN होने पर SDK शीट दिखाता है
}
}
}
}
}सभी कॉल Respondo सिंगलटन से होकर जाते हैं। वे idempotent हैं, किसी भी थ्रेड से सुरक्षित हैं, और init के पूरा होने से पहले किए गए कॉल बफ़र किए जाते हैं और बाद में दोबारा चलाए जाते हैं।
यूज़र्स की पहचान#
डिफ़ॉल्ट रूप से हर विज़िटर एनॉनिमस होता है। पहली बार लॉन्च पर SDK एक स्थिर visitor_id जनरेट करता है और उसे लोकल स्टोरेज में रखता है, ताकि लौटने वाला यूज़र अपनी बातचीत फिर से पा सके। एम्बेड करने के लिए कोई API key नहीं है — हर बातचीत को एक per-conversation session token से सुरक्षित किया जाता है जिसे backend बनाता है और हर मैसेज पर आगे सरका देता है, इसलिए एक एनॉनिमस विज़िटर को कभी दोबारा प्रमाणित नहीं होना पड़ता।
आपका यूज़र साइन-इन हो जाने पर identify को एक बार कॉल करें। यह उनकी असली पहचान जोड़ता है ताकि उनका इतिहास डिवाइसों और रीइंस्टॉल के आर-पार उनके साथ चले, और आपके इनबॉक्स में बातचीत के बगल में किसी एनॉनिमस विज़िटर के बजाय उनका नाम और ईमेल दिखे।
userHash एक सिग्नेचर है जिसे आपका backend एजेंट के identity_secret से गणना करता है — HMAC-SHA256(secret, userId) (या जब userId न हो तो ईमेल पर), लोअरकेस hex के रूप में एन्कोडेड। यह secret साबित करता है कि पहचान वास्तविक है, इसलिए इसे केवल आपके backend पर रहना चाहिए और इसे कभी ऐप में नहीं भेजा जाता। पूरी फ़ॉर्मूला और सर्वर-साइड उदाहरणों के लिए पहचान सत्यापन पेज देखें।
import ai.respondo.sdk.RespondoIdentity
// userHash आपके backend से आता है (userId पर HMAC-SHA256) —
// इसे ऐप में कभी गणना न करें।
Respondo.identify(
RespondoIdentity(
userId = session.userId,
email = session.email,
name = session.fullName,
userHash = session.respondoUserHash,
),
)
// लॉगआउट पर: पुश टोकन हटाएँ, सेशन रद्द करें, एक नया एनॉनिमस विज़िटर शुरू करें।
Respondo.clearPushToken()
Respondo.reset()अगर हैश गायब या ग़लत है, तो कुछ भी थ्रो नहीं होता: backend चुपचाप विज़िटर को एनॉनिमस बनाए रखता है, चैट चलती रहती है, और आप बस तब तक क्रॉस-डिवाइस लिंक खो देते हैं जब तक कोई मान्य हैश न दिया जाए। सत्यापन केवल तभी चलता है जब एजेंट के पास identity_secret सेट हो — डेवलपमेंट के दौरान इसे खाली छोड़ दें और userId / ईमेल जैसे हैं वैसे ही स्वीकार किए जाते हैं।
Observables और callbacks#
स्टेट को प्रतिक्रियात्मक रूप से StateFlow के रूप में पढ़ें (Compose के लिए बढ़िया) या RespondoListener के ज़रिए इम्पेरेटिव रूप से (ऐप-आइकन बैज के लिए बढ़िया)।
// प्रतिक्रियात्मक: unread count एक StateFlow के रूप में।
val unread by Respondo.unreadCount.collectAsState()
// इम्पेरेटिव: बैज और एनालिटिक्स के लिए listener।
Respondo.setListener(object : RespondoListener {
override fun onUnreadChanged(count: Int) { updateAppIconBadge(count) }
override fun onUrlRequested(url: String): Boolean = tryOpenInternally(url)
})स्क्रीन ट्रैकिंग#
हर नेविगेशन पर मौजूदा स्क्रीन रिपोर्ट करें ताकि प्रोऐक्टिव टीज़र और पेज-स्तरीय टारगेटिंग उससे मैच कर सकें। साफ़ करने के लिए null पास करें; हर बदलाव पर नई स्क्रीन के लिए प्रोऐक्टिव टीज़र का दोबारा मूल्यांकन होता है।
Respondo.setCurrentScreen("pricing")