I’m getting the following error when chatting to Bot.
Error: TypeError: Cannot read property ‘on_user_message’ of undefined
at Object.runComponentHandler (D:\NGRok\BotKit\lib\sdk\index.js:54:99)
at D:\NGRok\BotKit\lib\app\routes.js:19:38
data OnMessagePayload {
requestId: ‘03069582c7863f5e6bbc3961f7b44b22’,
botId: ‘st-f291465d-bfc5-58b4-b793-a62ef0bd8795’,
componentId: ‘default’,
payloadClassName: ‘OnMessagePayload’,
_originalPayload: { requestId: ‘03069582c7863f5e6bbc3961f7b44b22’ },
getBotVariableUrl: undefined,
sendUserMessageUrl: undefined,
sendBotMessageUrl: undefined,
resetBotUrl: undefined,
baseUrl: undefined,
metaInfo: undefined,
context: undefined,
channel: undefined,
message: undefined,
agent_transfer: false,
ackMessage: true,
toJSON: [Function] }
ERROR { InvalidArguments: send bot message url is missing
at Object.sendBotMessage (D:\NGRok\BotKit\lib\sdk\index.js:151:19)
at onUserMessage (D:\NGRok\BotKit\LiveChat.js:181:20)
at on_user_message (D:\NGRok\BotKit\LiveChat.js:198:9)
at wrapper (D:\NGRok\BotKit\node_modules\lodash\lodash.js:5232:19)
at tryCatcher (D:\NGRok\BotKit\node_modules\bluebird\js\release\util.js:16:23)
at D:\NGRok\BotKit\node_modules\bluebird\js\release\method.js:15:34
at D:\NGRok\BotKit\lib\sdk\index.js:62:13
at tryCatcher (D:\NGRok\BotKit\node_modules\bluebird\js\release\util.js:16:23)
at Function.Promise.attempt.Promise.try (D:\NGRok\BotKit\node_modules\bluebird\js\release\method.js:39:29)
at Object.runComponentHandler (D:\NGRok\BotKit\lib\sdk\index.js:59:23)
at D:\NGRok\BotKit\lib\app\routes.js:19:38
at Layer.handle [as handle_request] (D:\NGRok\BotKit\node_modules\express\lib\router\layer.js:95:5)
at next (D:\NGRok\BotKit\node_modules\express\lib\router\route.js:131:13)
at Route.dispatch (D:\NGRok\BotKit\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (D:\NGRok\BotKit\node_modules\express\lib\router\layer.js:95:5)
at D:\NGRok\BotKit\node_modules\express\lib\router\index.js:277:22
at param (D:\NGRok\BotKit\node_modules\express\lib\router\index.js:349:14)
at param (D:\NGRok\BotKit\node_modules\express\lib\router\index.js:365:14)
at param (D:\NGRok\BotKit\node_modules\express\lib\router\index.js:365:14)
at Function.process_params (D:\NGRok\BotKit\node_modules\express\lib\router\index.js:410:3)
at next (D:\NGRok\BotKit\node_modules\express\lib\router\index.js:271:10)
at D:\NGRok\BotKit\lib\app\middlewares\APIKeyMiddleware\index.js:38:11
at Layer.handle [as handle_request] (D:\NGRok\BotKit\node_modules\express\lib\router\layer.js:95:5)
at trim_prefix (D:\NGRok\BotKit\node_modules\express\lib\router\index.js:312:13)
at D:\NGRok\BotKit\node_modules\express\lib\router\index.js:280:7
at Function.process_params (D:\NGRok\BotKit\node_modules\express\lib\router\index.js:330:12)
at next (D:\NGRok\BotKit\node_modules\express\lib\router\index.js:271:10)
at urlencodedParser (D:\NGRok\BotKit\node_modules\body-parser\lib\types\urlencoded.js:100:7)
statusCode: 400,
status: 400,
customCode: ‘INVALID_ARGUMENTS’,
errors:
[ { msg: ‘send bot message url is missing’,
code: ‘INVALID_ARGUMENTS’ } ],
_headers: {},
message: ‘send bot message url is missing’,
name: ‘InvalidArguments’ } InvalidArguments: send bot message url is missing
at Object.sendBotMessage (D:\NGRok\BotKit\lib\sdk\index.js:151:19)
at onUserMessage (D:\NGRok\BotKit\LiveChat.js:181:20)
at on_user_message (D:\NGRok\BotKit\LiveChat.js:198:9)
at wrapper (D:\NGRok\BotKit\node_modules\lodash\lodash.js:5232:19)
at tryCatcher (D:\NGRok\BotKit\node_modules\bluebird\js\release\util.js:16:23)
at D:\NGRok\BotKit\node_modules\bluebird\js\release\method.js:15:34
at D:\NGRok\BotKit\lib\sdk\index.js:62:13
at tryCatcher (D:\NGRok\BotKit\node_modules\bluebird\js\release\util.js:16:23)
at Function.Promise.attempt.Promise.try (D:\NGRok\BotKit\node_modules\bluebird\js\release\method.js:39:29)
at Object.runComponentHandler (D:\NGRok\BotKit\lib\sdk\index.js:59:23)
at D:\NGRok\BotKit\lib\app\routes.js:19:38
at Layer.handle [as handle_request] (D:\NGRok\BotKit\node_modules\express\lib\router\layer.js:95:5)
at next (D:\NGRok\BotKit\node_modules\express\lib\router\route.js:131:13)
at Route.dispatch (D:\NGRok\BotKit\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (D:\NGRok\BotKit\node_modules\express\lib\router\layer.js:95:5)
at D:\NGRok\BotKit\node_modules\express\lib\router\index.js:277:22
at param (D:\NGRok\BotKit\node_modules\express\lib\router\index.js:349:14)
at param (D:\NGRok\BotKit\node_modules\express\lib\router\index.js:365:14)
at param (D:\NGRok\BotKit\node_modules\express\lib\router\index.js:365:14)
at Function.process_params (D:\NGRok\BotKit\node_modules\express\lib\router\index.js:410:3)
at next (D:\NGRok\BotKit\node_modules\express\lib\router\index.js:271:10)
at D:\NGRok\BotKit\lib\app\middlewares\APIKeyMiddleware\index.js:38:11
at Layer.handle [as handle_request] (D:\NGRok\BotKit\node_modules\express\lib\router\layer.js:95:5)
at trim_prefix (D:\NGRok\BotKit\node_modules\express\lib\router\index.js:312:13)
at D:\NGRok\BotKit\node_modules\express\lib\router\index.js:280:7
at Function.process_params (D:\NGRok\BotKit\node_modules\express\lib\router\index.js:330:12)
at next (D:\NGRok\BotKit\node_modules\express\lib\router\index.js:271:10)
at urlencodedParser (D:\NGRok\BotKit\node_modules\body-parser\lib\types\urlencoded.js:100:7)
One of the frequently asked questions is how to transfer chat to a human from the bot. It is especially necessary if your bot is in space of customer service. Chat bots are not meant to completely replace humans. Many a times chat bot will fail to answer satisfactorily or user would just want to talk/chat to a human from the start. When this happens the chatbot should transfer the chats to a human agent or a customer care representative. But how can we achieve that? In this article, we will give an overview on how we can integrate a live chat into our bot using Kore
Our bot would be central piece to whole solution. Apart from performing all its normal functionality, our bot would also act as a proxy between user and agent.
Bot : Well, we (will) have our bot .
Users : Users are our customers who would be using our bot.
Agent : Agents are humans who would chat with our users. Our agent will also need a chat window. For this we will use liveperson/live chat software
Select the Bot for which Agent Transfer should be configured
Open or create a dialog task and connect agent transfer service as shown below and save. You will see a message ‘botkit sdk isn’t configured yet for agent transfer’. This will be taken care in later part of the document.
Navigate to Events and Extensions - Agent Transfer
As given in Step 1, download BotKit SDK from Kore’s github repository
Now select Create App option in App name section, if there is no app created already, create a new app and click on done.
Go to BOTKIT SDK and copy Bot ID, Client ID and Secret keys and check the Events required.
Give the respective Call back URL of your application, to be invoked by BotKIt SDK events
If you are not using any third party callback server, then you can use NGROK
Install and run ngrok as your test callback server. The test callback server application, ngrok , is used to simulate your callback server application.
To download the test callback server application, download ngrok from https://ngrok.com/download, and install the same for your operating system.
Downloading NGROK on mac:
Press Command+Space and type Terminal and press enter/return key to invoke terminal app
Run in Terminal app: ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” <
/dev/null 2> /dev/null and press enter/return key.
If the screen prompts you to enter a password, please enter your Mac’s user password to continue. When you type the password, it won’t be displayed on screen, but the system would accept it. So just type your password and press ENTER/RETURN key. Then wait for the command to finish.
Run: brew cask install ngrok
In a Terminal Window, start ngrok to monitor port 8003 using the following command: ngrok http 8003
Copy ngrok forwarding URL and give it in the callback url under BOTKIT SDK option within the BOT.
NGROK forwarding url is the callback url and it should be given in BOTKIT SDK callback URL option and in config file. http://XXXXXXX.ngrok.io and save.
Once the call back URL is mentioned and saved, then agent transfer is configured at the dialog level. Now open the respective dialog task, open agent transfer to see that the configuration is saved as shown below.
Install Node.js
The BotKit SDK requires node.js to run on the same server where the SDK is installed. Go to https://nodejs.org/en/download/, and then select your OS as a .pkg file type for Mac and .msi file type for Windows.
In a Terminal window, run the node -v command to verify installation and version, for example, v6.10.2|
Install any live agent software eg Livechat, Liveperson, Concentrix, Vayusphere etc depending on your enterprise requirement and license availability. Note - Kore.ai does not endorse any application.
LiveChat
You can use your own LiveChat subscription or set up a free 30-day trial account at LiveChatInc.com by entering your business email in the Start using LiveChat now!
After successful signing up and creating an account, go to Settings from the left navigation and select chat link as shown below.
Copy the URL as shown below and the code should be given in config file in downloaded BOTKIT SDK. URL - https://lc.chat/now/104xx297/ and the license code is 104xx297
Open the downloaded BotKit SDK folder and do the following:
Edit livechatapi.js,
Give the respective botId and botName of your bot, which you have copied earlier.
This JS file contains 3 API’s of Kore, Initialization, Send Message, Get Message. If required, any new API’s written for human agent transfer should be put in here. Example: If closing connection is required, then close connection api written needs to go into livechatapi.js
Edit config.js
Client ID, Client Secret key, respective server ports running and liveagent license of the third-party server goes here.
Client Id, Client Secret can be copied from Events and Extensions-BotKit SDK.
ngrok forwarding url can be copied from ngrok running instance. It is the call back url.
Liveagentlicense is the code given in the chatlink of livechat
Edit Livechat.js, provide the respective botId and botName of your bot, which you have copied earlier and save.
Edit app.js and add the following sdk.registerBot(require(’./LiveChat.js’)) , save
Run the botkit sdk by giving node app.js in the terminal window.
ngrok and node.js server will be running in different terminals and as a user start the chat by opening the respective bots chat window.
When user initiates the chat from the bot, bot transfers the call to an agent and sends a message to the user
Agent receives a notification about this on the livechat
Now connection between agent and the user has been established and the conversation continues
Hi! I’ve been evaluating transfer to live agent feature and got several issue/questions
Looks like livechat integration is outdated, the initial POST call to https://api.livechatinc.com/visitors/{visitorId}/chat/start returns {“secured_session_id”:"",“banned”:false} and without secured_session_id no further calls can be made. Looks like this API is no longer usable
What is an expected behavior for chatbot after onAgentTransfer hook? What I see now is that after calling this hook the chatbot stops responding to user for around 20 minutes. Is there any way to return control back to chatbot earlier?
Is there a way to do AgentTransfer on client side, so conversation with live agent will be made from client application, not server-side bot sdk?
We have enclosed the LiveChat.js and LiveChatAPI.js files in Botkit at our public repository to demonstrate the capabilities of Agent Transfer with LiveChat agent software. The APIs used at LiveChatAPI.js file to start Chat with visitor, send messages and also get pending messages could have been deprecated.
We believe the APIs are deprecated as the start chat API is no longer returning secure_session_id using which we use to continue the conversation with the visitor by passing the same in the body as form data.
We will re-implement the integration with LiveChat by referring to the below developer documentation on LiveChat and upload the related JS files to BotKit public repository.
Once the Agent transfer is initiated, botkit could respond back to the platform within 10-15mins of speculated time. If incase botkit cannot respond to the platform in that time, For Instance, the user could respond to the agent’s message after 15mins, botkit will need to extend the request ID by which the platform would provide an additional time frame before which the botkit SDK could respond back to the platform.
This can be achieved using the botkit SDK function : extendRequestId. Please refer to the below link for more details. As Livechat.js file already references and includes the npm module node-schedule, the developer could create a job at Botkit to call the extendRequestId SDK function as needed in this scenario.
We will need more information on this to discuss the use case. Agent Transfer can only be initiated by using Kore.ai botkit hosted on the server.