KYCIS SDK Docs
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

ParameterPurpose
applicationApplication context for resources and lifecycle
apiKeyBackend API authentication
userIdInitial user identifier
policyRuntime 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 instance

Benefits:

  • 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

StateMeaning
NOT_INITIALIZEDSDK not yet initialized
INITIALIZEDSDK ready, config loading
REDUCED_TRACKING_MODEFunctional but limited (no attach)
PERMISSION_DENIEDMicrophone permission needed
NETWORK_UNAVAILABLECannot reach backend
VOICE_SESSION_CONNECT_FAILEDLiveKit connection failed
VOICE_SESSION_RUNTIME_ERRORVoice session error

Best Practices

  1. Initialize once in Application.onCreate()
  2. Call attach() immediately after init
  3. Set user identity as soon as known
  4. Register screen schemas before init for startup push
  5. Use BuildConfig for environment-specific URLs

On this page