# KWS SDK 1. Add the API of the KWS SDK to the **//foundation/ai/engine /interfaces/kits** directory. This API can be called by third-party applications. The following code snippet is an example API for the KWS SDK. The reference code is available at the **//foundation/ai/engine /interfaces/kits/asr/keyword\_spotting** directory. ``` class KWSSdk { public: KWSSdk(); virtual ~KWSSdk(); // Create a KWS SDK instance. int32_t Create(); // Synchronously execute the KWS task. int32_t SyncExecute(const Array &audioInput); // Set the KWS callback. int32_t SetCallback(const std::shared_ptr &callback); // Destroy the KWS SDK instance to release the session engaged with the plug-in. int32_t Destroy(); }; ``` 2. Add the API implementation of the SDK to the **//foundation/ai/engine/services/client/algorithm\_sdk** directory and call the APIs provided by the client to use the algorithm plug-in capabilities. The following code snippet is an example implementation of the **create** method in the API of the KWS SDK. For more details, see the reference code at **//foundation/ai/engine/services/client/algorithm\_sdk/asr/keyword\_spotting**. ``` int32_t KWSSdk::KWSSdkImpl::Create() { if (kwsHandle_ != INVALID_KWS_HANDLE) { HILOGE("[KWSSdkImpl]The SDK has been created"); return KWS_RETCODE_FAILURE; } if (InitComponents() != RETCODE_SUCCESS) { HILOGE("[KWSSdkImpl]Fail to init sdk components"); return KWS_RETCODE_FAILURE; } // Call the AieClientInit API provided by the client to initialize the engine service and activate IPC call. int32_t retCode = AieClientInit(configInfo_, clientInfo_, algorithmInfo_, nullptr); if (retCode != RETCODE_SUCCESS) { HILOGE("[KWSSdkImpl]AieClientInit failed. Error code[%d]", retCode); return KWS_RETCODE_FAILURE; } if (clientInfo_.clientId == INVALID_CLIENT_ID) { HILOGE("[KWSSdkImpl]Fail to allocate client id"); return KWS_RETCODE_FAILURE; } DataInfo inputInfo = { .data = nullptr, .length = 0, }; DataInfo outputInfo = { .data = nullptr, .length = 0, }; // Call the AieClientPrepare API provided by the client to load the algorithm plug-in. retCode = AieClientPrepare(clientInfo_, algorithmInfo_, inputInfo, outputInfo, nullptr); if (retCode != RETCODE_SUCCESS) { HILOGE("[KWSSdkImpl]AieclientPrepare failed. Error code[%d]", retCode); return KWS_RETCODE_FAILURE; } if (outputInfo.data == nullptr || outputInfo.length <= 0) { HILOGE("[KWSSdkImpl]The data or length of output info is invalid"); return KWS_RETCODE_FAILURE; } MallocPointerGuard pointerGuard(outputInfo.data); retCode = PluginHelper::UnSerializeHandle(outputInfo, kwsHandle_); if (retCode != RETCODE_SUCCESS) { HILOGE("[KWSSdkImpl]Get handle from inputInfo failed"); return KWS_RETCODE_FAILURE; } return KWS_RETCODE_SUCCESS; } ``` The preceding code is the specific API implementation. The **create** function in the API of the KWS SDK calls the open **AieClientInit** and **AieClientPrepare** APIs provided by the client to connect to the server and load the algorithm model. For details, see the implementation of the **create** method in following sections. >![](../public_sys-resources/icon-note.gif) **NOTE:** >The sequence for the SDK to call client APIs: **AieClientInit** -\> **AieClientPrepare** -\> **AieClientSyncProcess** or **AieClientAsyncProcess** -\> **AieClientRelease** -\> **AieClientDestroy**. An exception will be thrown if the call sequence is violated.