Skip to end of banner
Go to start of banner

ChatGPT Integration Installation Guide

Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

This Guide describes how to integrate ChatGPT with Wildix. 

Created: February 2023

Permalink: https://wildix.atlassian.net/wiki/x/AQBxC

Introduction

ChatGPT is a state-of-the-art language model developed by OpenAI, designed to generate human-like responses to natural language queries. It is built using deep learning techniques and trained on a massive amount of text data, which allows it to understand the nuances of human language and generate relevant and coherent responses.

One practical application of ChatGPT is providing real-time technical support. With ChatGPT, companies can set up chat interfaces that allow users to ask questions about their products or services. ChatGPT can then respond to those questions with helpful answers or provide guidance to users.

Integrating ChatGPT with chatbots can enhance the functionality and responsiveness of the bot. Chatbots may not always have the correct answer to every question or situation. By integrating ChatGPT with a chatbot, the chatbot can access the vast knowledge base of ChatGPT and provide more comprehensive and accurate responses to users.

ChatGPT can be integrated as:

  • Chatbot integrated in WebRTC Kite Chatbot - you can use it a personal assistance in Collaboration/ x-bees or use it as a Kite chatbot for external users 
  • Speech To Text (STT) integration 

Related sources:

Requirements

  • Min. WMS version: starting from WMS 5.02.20210127
  • Minimum Business license or higher (assigned to the chatbox user)
  • Premium license for STT integration
  • Last stable version of Node.js 

Installation

  1. Download the archivehttps://drive.google.com/file/d/1QM3nW0e2Wuo7FD2Gs168loOAMa8s47Dn/view?usp=share_link
  2. Open the archive, navigate to /kite-xmpp-bot-master/app and open config.js with an editor of your choice 

    Replace the following values with your own:

    • domain: 'XXXXXX.wildixin.com' - domain name of the PBX
    • service: 'xmpps://XXXXXX.wildixin.com:443', - domain name of the PBX 
    • username: 'XXXX', - Kitebot user extension number, do not change it
    • password: 'XXXXXXXXXXXX' - Kitebot user password
    • authorization: 'Bearer sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', - ChatGPT authorization token
    • organization: 'org-XXXXXXXXXXXXXXXXXXXXXXXXX', – ChatGPT organization ID
    • model: 'text-davinci-003', - this parameter specifies which GPT model to use for generating text. In this case, the model is set to 'text-davinci-003', which refers to the most advanced and powerful model available in OpenAI's GPT series of models
    • temperature: 0.1, - this parameter controls the "creativity" of the generated text by specifying how much randomness should be introduced into the model's output
    • externalmaxtokens: 250, - response token limit for Kite users contacting the chatbot
    • internalmaxtokens: 500  - response token limit for internal users contacting the chatbot
  3. Upload the archive to the /home/admin/ directory using WinSCP or any alternative SFTP client

    |
  4. Connect to the web terminal. Log in as the super user via the su command, password wildix
  5. Install nodejs: 

    apt-get install nodejs
  6. Unzip the archive: 

    unzip /home/admin/kite-xmpp-bot-master.zip 
  7. Copy the chatbot folder to /mnt/backups: 

    cp -r ./kite-xmpp-bot-master /mnt/backups/
  8. Move the chatbot.service.txt file to the appropriate directory and enable chatbot as a service to run in the background, then start the service: 

    cp /mnt/backups/kite-xmpp-bot-master/chatbot.service.txt /etc/systemd/system/chatbot.service
    systemctl enable chatbot.service 
    systemctl daemon-reload
    systemctl start chatbot.service
  9. Verify that the chatbot is running by either running the ps command:

    ps aux | grep node


    Or simply send the bot a message 

The service sends standard and error output to wms.log so you can check /var/log/wms.log for debug if need be.

STT Dialplan configuration example using ChatGPT and speech recognition

Use case: to interact with ChatGPT via voice and have a response sent via TTS to the caller. Also contains a simple example of embedded prompt engineering in the Dialplan applications 6 & 7 where it checks whether or not the recognition result contains the word “price” then proceeds to add instructions for the ChatGPT API to respond in a short manner and only provide numerical value in the response when asked for a price of a particular item.

How-to:

  1. Download the Dialpan https://drive.google.com/file/d/14qysNadTxLdJJiLnz2FWoq-ORbTro4R1/view?usp=share_link
  2. Go to WMS Dialplan -> Dialplan rules 
  3. Click Import to add downloaded Dialpan and click Apply





Dialplan applications explained:

  1. Set STT & TTS language
  2. Set DIAL_OPTIONS -> g to continue Dialplan execution after the Speech to text application, this allows looping the Dialplan to potentially answer multiple questions
  3. Speech to text application that plays the voice prompt and captures the user’s response converting it to text. An in-depth guide for the STT Dialplan application: Dialplan applications Admin Guide
  4. NoOp(${RECOGNITION_RESULT}) - a debug application that shows the result of speech recognition, can be safely removed
  5. Set(RECOGNITION_RESULT=${SHELL(echo "${RECOGNITION_RESULT}" | tr -d \'):0:-1}) - this sets the RECOGNITION_RESULT variable to the value of the RECOGNITION_RESULT channel variable, with any single quotes removed. The :0:-1 substring removes the newline character
  6. ExecIf($[ "${SHELL(echo '${RECOGNITION_RESULT}' | grep -i 'price'):0:-1}"!="" ]?Set(PROMPT_ENGINEERING=Only respond with price in numerical format.)) - this checks if the RECOGNITION_RESULT variable contains the word "price" (case-insensitive), and if so, sets the PROMPT_ENGINEERING variable to the given string. This is a simple example of conditional prompt engineering that can be used with this setup
  7. Set(chatGPT=${SHELL(curl https://api.openai.com/v1/completions -H "Content-Type: application/json" -H "Authorization: Bearer sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" -d '{"model": "text-davinci-003", "prompt": "${RECOGNITION_RESULT}. ${PROMPT_ENGINEERING}", "temperature": 0.5, "max_tokens": 500}'):0:-1}) - this sends an HTTP request to the OpenAI ChatGPT API to generate a response based on the RECOGNITION_RESULT and PROMPT_ENGINEERING variables. The resulting JSON string is assigned to the ChatGPT variable. text-davinci-003 is the model name, you can learn more about ChatGPT models by watching the dedicated Tech talk webinar or in the OpenAI documentation 
  8. Set(PrettyChatGPT=${JSONPRETTY(chatGPT)}) - this formats the ChatGPT variable as pretty-printed JSON and assigns the result to the PrettyChatGPT variable
  9. Set(result=${SHELL(echo "${PrettyChatGPT}" | grep -oP '(?<=nn).*'):0:-2}) -this extracts the response text from the PrettyChatGPT variable by using grep to search for the text following the nn field in the JSON output
  10. Play sound -> ${result}. End of response. - this uses the text in the result variable to generate text to speech message and play back the response from chatGPT API to the caller, appending “End of response” to mark the end of response, which is something you can change to your preference


Example callweaver output for debug purposes: 

-- Executing [s@ChatGPT:1] NoOp("SIP/300-0000004a", "Executing 'Set': LANGUAGE() - en")
   -- Executing [s@ChatGPT:1] NoOp("SIP/300-0000004a", "Executing 'Set': DIAL_OPTIONS - g")
   -- Executing [s@ChatGPT:1] NoOp("SIP/300-0000004a", "Executing 'Speech to text': question - "Ask your question", error message - "Didn't understand, please repeat", retries - 0, lenght - 10, silence - 3, save audio - "no"
")                                                                                                                                                                                                                              
   -- Executing [s@ChatGPT:1] NoOp("SIP/300-0000004a", "Ask your question")
   -- Executing [s@ChatGPT:1] Playback("SIP/300-0000004a", "/tmp/tts_594630b11a842dda50406c8ac9a89489")
[Feb 20 15:31:27] DEBUG[2743][C-00000049]: chan_sip.c:37758 handle_incoming: Webrtc device detected [0x2806858 -> 0x333c458], setting allow transparent SSRC
   -- <SIP/300-0000004a> Playing '/tmp/tts_594630b11a842dda50406c8ac9a89489.slin' (language 'en')
   -- Executing [s@ChatGPT:1] Record("SIP/300-0000004a", "/tmp/stt_6275.wav,3,10,y")
   -- <SIP/300-0000004a> Playing 'beep.opus' (language 'en')
[Feb 20 15:31:29] WARNING[3730058][C-00000049]: res_rtp_asterisk.c:3653 ast_rtp_write: res_rtp_asterisk, requested to send an RTCP FIR packet to the peer
 == Parsing '/etc/callweaver/res_ldap.conf': Found
   -- Executing [s@ChatGPT:1] NoOp("SIP/300-0000004a", "Recognition result: is it usually hot in the summer")
   -- Executing [s@ChatGPT:1] NoOp("SIP/300-0000004a", "is it usually hot in the summer")
   -- Executing [s@ChatGPT:1] Set("SIP/300-0000004a", "RECOGNITION_RESULT=is it usually hot in the summer")
   -- Executing [s@ChatGPT:1] ExecIf("SIP/300-0000004a", "0?Set(PROMPT_ENGINEERING=Only respond with price in numerical format.)")
   -- Executing [s@ChatGPT:1] Set("SIP/300-0000004a", "chatGPT={"id":"cmpl-6m2QbstaepooAETRb5bTxCYcODsbE","object":"text_completion","created":1676907097,"model":"text-davinci-003","choices":[{"text":"\n\nYes, it is usually
hot in the summer in many parts of the world. Temperatures can range from mild to extreme depending on the region.","index":0,"logprobs":null,"finish_reason":"stop"}],"usage":{"prompt_tokens":9,"completion_tokens":31,"total_t
okens":40}}")
   -- Executing [s@ChatGPT:1] Set("SIP/300-0000004a", "PrettyChatGPT={
   --  "id":   "cmpl-6m2QbstaepooAETRb5bTxCYcODsbE",
   --  "object":       "text_completion",
   --  "created":      1676907097,
   --  "model":        "text-davinci-003",
   --  "choices":      [{
   --                  "text": "\n\nYes, it is usually hot in the summer in many parts of the world. Temperatures can range from mild to extreme depending on the region.",
   --                  "index":        0,
   --                  "logprobs":     null,
   --                  "finish_reason":        "stop"
   --          }],
   --  "usage":        {
   --          "prompt_tokens":        9,                                                                                                                                                                                      
   --          "completion_tokens":    31,                                                                                                                                                                                     
   --          "total_tokens": 40                                                                                                                                                                                              
   --  }                                                                                                                                                                                                                       
   -- }")                                                                                                                                                                                                                      
   -- Executing [s@ChatGPT:1] Set("SIP/300-0000004a", "result=Yes, it is usually hot in the summer in many parts of the world. Temperatures can range from mild to extreme depending on the region.")
   -- Executing [s@ChatGPT:1] NoOp("SIP/300-0000004a", "Executing 'Playback': sound - "Yes, it is usually hot in the summer in many parts of the world. Temperatures can range from mild to extreme depending on the region.. En
d of response.", waitDigits - n, opts - ")                                                                                                                                                                                      
   -- Executing [s@ChatGPT:1] Playback("SIP/300-0000004a", "/tmp/tts_2b1d5b37ac3938881099308c2ba87718,")
   -- <SIP/300-0000004a> Playing '/tmp/tts_2b1d5b37ac3938881099308c2ba87718.slin' (language 'en')

  • No labels