ডকুমেন্টেশন

Android SDK

Kotlin ও Jetpack Compose-এ লেখা একটি হালকা ক্লায়েন্ট, যা আপনার অ্যাপের উপরে বটম শিট হিসেবে Respondo সহায়তা চ্যাট খোলে।

প্রয়োজনীয়তা#

  • minSdk 24 (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() আছে (নতুন Android প্রজেক্টে এটি ডিফল্টভাবেই থাকে), তারপর কোঅর্ডিনেট দিয়ে ডিপেনডেন্সিটি যোগ করুন।

settings.gradle.ktskotlin
dependencyResolutionManagement {
    repositories {
        google()
        mavenCentral()
    }
}
app/build.gradle.ktskotlin
dependencies {
    implementation("ai.respondo:respondo-sdk:0.1.0")
}

ইনিশিয়ালাইজেশন#

একবার Respondo.init কল করুন, নিজের Compose ট্রি-তে একবার RespondoChatHost() বসান, আর নিজের বোতাম থেকে চ্যাট খুলুন।

MainActivity.ktkotlin
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 সিঙ্গেলটনের মধ্য দিয়ে যায়। এগুলো আইডেমপোটেন্ট, যেকোনো থ্রেড থেকে নিরাপদ, আর init শেষ হওয়ার আগে করা কলগুলো বাফারে জমা থেকে পরে চালানো হয়।

ব্যবহারকারী শনাক্তকরণ#

ডিফল্টভাবে প্রতিটি ভিজিটর বেনামি। প্রথমবার চালু হওয়ার সময় SDK একটি স্থির visitor_id তৈরি করে লোকাল স্টোরেজে রেখে দেয়, ফলে ফিরে আসা ব্যবহারকারী নিজের কথোপকথন আবার খুঁজে পান। কোনো API কী বসানোর দরকার নেই — প্রতিটি কথোপকথন সুরক্ষিত থাকে সেই কথোপকথনের নিজস্ব সেশন টোকেন দিয়ে, যেটি backend তৈরি করে এবং প্রতিটি বার্তায় এগিয়ে নেয়; তাই বেনামি ভিজিটরকে কখনও নতুন করে অথেনটিকেট করতে হয় না।

ব্যবহারকারী সাইন ইন করার পরেই identify কল করুন। এতে তাঁর আসল পরিচয় যুক্ত হয়, ফলে তাঁর ইতিহাস ডিভাইস বদল ও পুনরায় ইনস্টলের পরেও সঙ্গে থাকে, আর আপনার ইনবক্সে কথোপকথনের পাশে বেনামি ভিজিটরের বদলে তাঁর নাম ও ইমেল দেখা যায়।

userHash হলো এমন একটি স্বাক্ষর, যা আপনার backend এজেন্টের identity_secret থেকে হিসাব করে — HMAC-SHA256(secret, userId) (userId না থাকলে ইমেল), লোয়ারকেস hex হিসেবে এনকোড করা। এই secret প্রমাণ করে যে পরিচয়টি আসল, তাই এটি কেবল আপনার backend-এ থাকতে হবে এবং কখনও অ্যাপের ভিতরে পাঠানো যাবে না। পূর্ণ সূত্র ও সার্ভার-সাইড উদাহরণের জন্য পরিচয় যাচাই পাতাটি দেখুন।

Kotlinkotlin
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 / ইমেল যেমন আছে তেমনই গ্রহণ করা হবে।

অবজার্ভেবল ও কলব্যাক#

অবস্থা রিঅ্যাক্টিভভাবে StateFlow হিসেবে পড়ুন (Compose-এর জন্য দারুণ) বা ইম্পারেটিভভাবে RespondoListener দিয়ে (অ্যাপ আইকনের বেজের জন্য দারুণ)।

Kotlinkotlin
// রিঅ্যাক্টিভ: না-পড়া বার্তার সংখ্যা StateFlow হিসেবে।
val unread by Respondo.unreadCount.collectAsState()

// ইম্পারেটিভ: বেজ ও অ্যানালিটিক্সের জন্য লিসেনার।
Respondo.setListener(object : RespondoListener {
    override fun onUnreadChanged(count: Int) { updateAppIconBadge(count) }
    override fun onUrlRequested(url: String): Boolean = tryOpenInternally(url)
})

স্ক্রিন ট্র্যাকিং#

প্রতিটি নেভিগেশনে বর্তমান স্ক্রিনটি জানান, যাতে প্রোঅ্যাকটিভ টিজার ও পেজ-স্তরের টার্গেটিং সেটির সঙ্গে মেলাতে পারে। মুছতে null পাঠান; প্রতিবার বদলালে নতুন স্ক্রিনের জন্য প্রোঅ্যাকটিভ টিজার আবার মূল্যায়ন করা হয়।

Kotlinkotlin
Respondo.setCurrentScreen("pricing")

পরবর্তী ধাপ#

অফলাইনে সহায়তা কর্মীর উত্তরের জন্য পুশ নোটিফিকেশন এবং সাইন ইন করা ব্যবহারকারীদের জন্য পরিচয় যাচাই সেট আপ করুন। পূর্ণ API, XML হোস্টের জন্য Fragment র‍্যাপার এবং সমস্যা সমাধান নিয়ে বিস্তারিত আছে Android SDK শুরু করার গাইডে; SDK-র সোর্স কোড উন্মুক্ত আছে GitHub-এ।