Whenever the Assistant detects that the user is searching for items in the app, it will try to break down the search request into its basic components and invoke the onSearch callback associated with the search user journey. The callback looks like this:
// This is deprecated and is kept here for reference only
SearchUserJourney.AppState onSearch(SearchInfo searchInfo, SearchUserJourney userJourney);
When this callback is invoked, the app is expected to:
Consume the details of the search request via the SearchInfo parameter.
Fire the app's search request.
Finally, return the AppState along with the appropriate Conditioncorresponding to the state that the app transitioned into
For example, for a given onSearch callback invocation, if the search completes successfully and the app transitions to a screen showing search results, the app would return theAppState as SEARCH_RESULTS along with condition SUCCESS , as shown below:
publicSearchUserJourney.AppStateonSearch(SearchInfo searchInfo,SearchUserJourney searchJourney) {// The searchItem will have the relevant part of the end-users search request // and will automatically be in English, even if the user spoke in a // different language. String searchItem =searchInfo.getItem().getDescription();// Launch SearchResultsActivity using "searchItem"// ...returnnewSearchResultsAppState(SUCCESS);}
onSearch:async (searchInfo, searchUserJourney) => {constsearchItem=searchInfo.item.description;// Perform operation using "searchItem"// ...searchUserJourney.setSuccess();returnSearchUserJourney.AppState.SEARCH_RESULTS;},
Sample Utterances that could trigger the search
The following are some examples of commands that could trigger this journey
"Onions"
"Show me onions"
"3 kgs of organic onions"
"Looking for fresho organic onions"
"Searching for Maggi Instant noodles in grocery"
"2 rs head and shoulders shampoo"
SearchInfo Parameter
The parameterSearchInfo contains the breakdown of the original search request. Its structure is as described below:
Class SearchInfo {publicItemgetItem();publicList<FilterInfo>getFilters(); publicSortingInfogetSorting();publicBooleanisAddToCart();}Class Item {publicStringgetId(); // The ID of the item if set by the app or if Slang// was trained with itpublicStringgetCategory(); // The category that the user specified, // eg "pharmacy" or "grocery"publicStringgetBrand(); // The brand name identified by Slang from what the// user spokepublicStringgetProductType(); // The product type if any as identified by SlangpublicString[] getVariants(); // The variants (like "organic") if anypublicStringgetDescrption(); // The helper method to get back a fully// constructed search string from what the// user spokepublicQuantitygetQuantity(); // The quantity if any is spoken by the userpublicSizegetSize(); // The size if any is spoken by the userpublicPricegetPrice(); // The price value if any spoken by the user}
// When the user searches for something like
// 4 fresho organic onions 3kg
// This is how the SearchInfo parameter would be populated
{
"isSmartSearch": false,
"item": {
"brand": "Fresho Organic",
"description": "Fresho Organic",
"completeDescription": "Fresho Organic 3 kg onion"
"quantity": {
"amount": 4,
"unit": "UNKNOWN"
},
"size": {
"amount": 3,
"unit": "KILOGRAM"
},
"productNames": [
"onions"
]
},
"isAddToCart": true
}
classSearchInfo {Item item;bool isAddToCart;SortingInfo sortingInfo;List<FilterInfo> filterInfoList;}classItem {String id; // The ID of the item if set by the app or if Slang was trained with itString category; // The category that the user specified, eg "pharmacy" or "grocery"String brand; // The brand name identified by Slang from what the user spokeString productType; // The product type if any as identified by SlangList<String> productNames; // The productNames (like "potato") if anyString description; // The helper method to get back a fully constructed search string from what the user spokeQuantity quantity; // The quantity if any is spoken by the userSize size; // The size if any is spoken by the userPrice price; // The price value if any spoken by the user}
// When the user searches for something like
// 3 fresho organic onions 2 rupees 3kg in grocery
// This is how the SearchInfo parameter would be populated
{
"filterInfoList": [],
"item": {
"brand": "fresho organic",
"category": "grocery",
"description": "fresho organic onions",
"id": null,
"price": {
"currency": "INR",
"maxAmount": 3,
"minAmount": 3
},
"productType": null,
"quantity": {
"amount": 2,
"unit": "UNKNOWN"
},
"size": {},
"variants": [
"onions"
]
},
"isAddToCart": false,
"sortingInfo": {}
}
To illustrate, when the user says "Search for fresho organic onions", the following will be set in the Item object
brand = "Fresho Organic"
productNames = ["onion"]
isAddedToCart = false
completeDescription = "fresho organic onion"
Supported AppStates
The following AppStates are supported:
SEARCH_RESULTS (SearchResultsAppState): To be returned when the app performs a search and navigates to the search results screen. To indicate whether the search was successful or not, with a greater level of detail, please use the appropriate conditions.
ADD_TO_CART (AddToCartAppState): To be returned when the app performs an add-to-cart action. To indicate whether the add to cart was successful or not, with a greater level of detail, please use the appropriate conditions.
UNSUPPORTED (UnsupportedAppState): To be returned when the app is not ready to handle search yet. The Assistant will let the user know that the search is not yet supported by the app.
The Slang Retail Assistant provides a special AppStateWAITING that is common across all UserJourney types for completing asynchronous operations within the callback. Refer to the Asynchronous Action Handling section for details of how to deal with asynchronous operations.
Supported Conditions
The following conditions are supported for each of the AppStates supported by the Assistant
App State
App State Condition
SEARCH_RESULTS
(SearchResultsAppState)
TERMINAL CONDITIONS
SUCCESS
The search was successful
ITEM_NOT_FOUND
The item being searched could not be
found
ITEM_OUT_OF_STOCK
The item being searched is out of stock
FAILURE
There was a failure while searching
NON-TERMINAL CONDITIONS
ITEM_NOT_SPECIFIED
The item that needs to be searched has
not been specified.
App State
App State Condition
ADD_TO_CART
(AddToCartAppState)
TERMINAL CONDITIONS
SUCCESS
The search was successful
ITEM_NOT_FOUND
The item being searched could not be
found
ITEM_OUT_OF_STOCK
The item being searched is out of stock
FAILURE
There was a failure while searching
NON-TERMINAL CONDITIONS
ITEM_NOT_SPECIFIED
The item that needs to be searched has
not been specified.
ITEM_AMBIGUOUS
There are multiple items available for
the current searched item and has to be
disambiguated.
ITEM_AMBIGUOUS_FORCE_UI
Stop the voice disambiguation process
and choose the item via the UI/Touch
interface.
ITEM_QUANTITY_REQUIRED
Quantity for the current item has to be
specified.
For example, to indicate to the Assistant that the particular item being searched was not found by the app, the app should do the following:
public SearchUserJourney.AppState onSearch(SearchInfo searchInfo, SearchUserJourney searchJourney) {
String searchItem = searchInfo.getItem().getDescription();
// Launch SearchResultsActivity using "searchItem"
// ...
return new SearchResultsAppState(ITEM_NOT_FOUND);
}
Based on the App State and the Condition that was set, the Assistant will speak out an appropriate message to the user. You can examine the default set of prompts configured for the Assistant through the Console and also customize it to your needs. Refer to the Customizing the Assistant section for details.