Core Concepts
SDK Initialization
Bootstrap SDK runtime and configure policy
Runtime Bootstrap
Initialize SDK once at application startup:
AI.init(
application = this,
apiKey = "your-api-key",
userId = "user-123",
policy = RuntimePolicy(
backendBaseUrl = "https://kycis.zynnex.in/v1",
clientId = "your-client-id",
mappingVersion = "v1",
appVersion = "1.0.0",
triggerStartMode = TriggerStartMode.CONFIRM_UI,
kycStepStrategy = KycStepStrategy.HINT_THEN_INFER,
triggerSettings = TriggerSettings(
autoTriggerEnabled = true,
includeErrorSignals = true,
includeTimeSpentSignals = false,
includeIdleSignals = false,
includeStepHints = true
),
confirmUiText = ConfirmUiText(
title = "Need help completing this step?",
startCta = "Start",
dismissCta = "Not now"
),
passiveEvalEnabled = true,
passiveEvalIntervalSeconds = 10
)
)Required Parameters
| Parameter | Purpose |
|---|---|
application | Application context for resources and lifecycle |
apiKey | Backend API authentication |
userId | Initial user identifier |
policy | Runtime configuration (optional, uses defaults) |
RuntimePolicy Configuration
Backend Connection
RuntimePolicy(
backendBaseUrl = "https://kycis.zynnex.in/v1", // Must include /v1
clientId = "tenant-123", // Multi-tenant routing
mappingVersion = "v1" // Screen catalog version
)Common URLs:
- Emulator:
http://10.0.2.2:8000/v1 - Physical device:
http://<lan-ip>:8000/v1 - Production:
https://kycis.zynnex.in/v1
Trigger Behavior
RuntimePolicy(
triggerStartMode = TriggerStartMode.CONFIRM_UI, // CONFIRM_UI, IMMEDIATE, COOLDOWN
triggerSettings = TriggerSettings(
autoTriggerEnabled = true, // Enable automatic trigger evaluation
includeErrorSignals = true, // Include error counts
includeTimeSpentSignals = false, // Include seconds on screen
includeIdleSignals = false, // Include idle seconds
includeStepHints = true // Include step context
),
confirmUiText = ConfirmUiText(
title = "Need help?",
startCta = "Talk to assistant",
dismissCta = "Maybe later"
)
)Passive Evaluation
RuntimePolicy(
passiveEvalEnabled = true,
passiveEvalIntervalSeconds = 10 // Seconds between passive checks
)Lifecycle Attachment
Enable automatic tracking:
AI.attach(this) // 'this' is Application instanceBenefits:
- Automatic screen observation
- Activity lifecycle tracking
- User interaction detection
- Better trigger signal quality
If attach is never called, SDK emits SdkStatusCode.REDUCED_TRACKING_MODE once.
Session Identity
SDK generates a UUID session_id at AI.init and keeps it for the process lifetime. This session ID:
- Keys the backend
InMemorySessionStore - Embeds in LiveKit room name:
kyc-room-{session_id} - Correlates all events and voice activity
Status Callback
Monitor SDK status:
AI.setStatusListener { status ->
when (status.code) {
SdkStatusCode.INITIALIZED -> Log.d("KYCIS", "SDK ready")
SdkStatusCode.REDUCED_TRACKING_MODE -> Log.w("KYCIS", "Limited tracking")
SdkStatusCode.PERMISSION_DENIED -> Log.e("KYCIS", "Need microphone permission")
SdkStatusCode.NETWORK_UNAVAILABLE -> Log.e("KYCIS", "Network issue")
else -> Log.d("KYCIS", "Status: ${status.message}")
}
}Initialization States
| State | Meaning |
|---|---|
NOT_INITIALIZED | SDK not yet initialized |
INITIALIZED | SDK ready, config loading |
REDUCED_TRACKING_MODE | Functional but limited (no attach) |
PERMISSION_DENIED | Microphone permission needed |
NETWORK_UNAVAILABLE | Cannot reach backend |
VOICE_SESSION_CONNECT_FAILED | LiveKit connection failed |
VOICE_SESSION_RUNTIME_ERROR | Voice session error |
Best Practices
- Initialize once in
Application.onCreate() - Call
attach()immediately after init - Set user identity as soon as known
- Register screen schemas before init for startup push
- Use BuildConfig for environment-specific URLs