Character Conversation API - Code Example for Roblox integration with Convai.
The following piece of code is the most essential section to make a successful call to the Convai server to get a response in a conversation with a character.
This portion of the code is present in the GlobalFunctions script in the Convai Roblox Integration Demo that you just tried out in the previous section.
The call is handled by the Chat_Character file present within the character model in the game Workspace.
functionmy_functions.callConvai(msg,sessionID,apiKey,charID)local httpSrv = game:GetService("HttpService")local baseUrl ="https://api.convai.com/character/getResponse"local gpt_responselocalfunctionrequest()-- We restrict from making unnecessary calls if the following values are not set properlyif apiKey =="" thenprint("Please provide a valid API Key")returnendif charID =="" thenprint("Please enter a valid Character ID")returnend-- REST API Callocal response = httpSrv:RequestAsync({ Url = baseUrl, Method ="POST", Headers = {-- This is the most convenient way to send form-data in Roblox ["Content-Type"] ="application/x-www-form-urlencoded", ["CONVAI-API-KEY"] = apiKey }, Body =string.format([[&userText=%s&sessionID=%s&charID=%s&voiceResponse=%s]], msg, sessionID, charID, 'False') })-- Inspect the response tableif response.Success thenprint("Status code:", response.StatusCode, response.StatusMessage)print("Response body:\n", response.Body)local data = httpSrv:JSONDecode(response.Body)print("Response Text: ", data.text)print("Response Session ID: ", data.sessionID) gpt_response = response.Body --data.textelseprint("The request failed:", response.StatusCode, response.StatusMessage)endend-- Wrap the function in a 'pcall' to prevent the script from breaking if the request failslocal success, message =pcall(request)--print("Status code: ", message)if gpt_response ==nilthen gpt_response = httpSrv:JSONEncode({sessionID = sessionID, text ="Sorry, I can't chat right now."})endreturn gpt_responseend
The above function is called in the chatbox implementation in the demo game. Here is an overview of what each part is doing:
The function accepts the message we get from the user. We send that along with the sessionID, and characterID. We also pass the API Key that we have set previously.
local httpSrv = game:GetService("HttpService")
HttpService allows HTTP requests to be sent from game servers. Details.
Now for the most important portion of the code:
-- REST API Callocal response = httpSrv:RequestAsync({ Url = baseUrl, Method ="POST", Headers = {-- This is the most convenient way to send form-data in Roblox ["Content-Type"] ="application/x-www-form-urlencoded", ["CONVAI-API-KEY"] = apiKey }, Body =string.format([[&userText=%s&sessionID=%s&charID=%s&voiceResponse=%s]], msg, sessionID, charID, 'False')}
Notice how Content-Type is set to "application/x-www-form-urlencoded". This is the only acceptable way to send form-data in Roblox. Since the endpoint only accepts form data, we had to parse the data in a suitable format to send it to the server.
While the Body of the request might look like a complicated string, it is actually quite simple. To break it down into its simple components, it can be viewed as:
The value for voiceResponse is set to False. Since we have no utility of the audio data that the server will generate, we just completely skip that audio generation. The reason is mentioned in the Constraints before.
The rest of the part is a simple response handling code. Since the response, we receive is JSON data, we have to decode that on the client side to read its content:
local data = httpSrv:JSONDecode(response.Body)print("Response Text: ", data.text)print("Response Session ID: ", data.sessionID)
That concludes our discussion on the /getResponse API.