Create a Discord bot that uses OpenAI to generate responses to messages using Python
This article intends to explain how to create a simple Discord bot that replies as OpenAI’s chat would do. And gives you a walkthrough of containerizing the application.
What do you need?
You need an OpenAI account api-key
which you can find in your OpenAI account.
You need a configured Discord bot, here is how to do that.
Make sure your Discord bot has permission to read and send messages, and that it’s added to your discord channel.
First things first let’s use discord’s Client class to create the bot, and install this library with the command:
pip install discord.py
We’ll first create our own class named OpenAIBot
which will inherit the Client
class and add two more functions to it. This Client
class takes intents as a constructor argument on initialization.
You could use the default Intents
unless you have a particular one to specify.
Let’s override the asynchronous function on_message
, which is triggered when a message is sent to the channel you added to your discord bot.
Now we have to deal with OpenAI’s library for python, first, let’s install it:
pip install --upgrade openai
The only thing we need for OpenAI to be able to respond to our messages is the Completion
engine and that is possible with a simple request:
For more information on customizing this call check out the API reference of OpenAI.
Back to our code, we will now add a function called openai_response
which takes a message as an argument and returns a message from OpenAPI.
We will use openai.Completion.create()
functions to help us out with the communication:
Great!
Now running the bot would require the initialization of this class and the call of run
of the super-class Client.
We’ll use the condition if __name__=="__main":
to avoid starting the bot when we (if we) import OpenAIBot
in the near future.
Now the code looks like this:
There is a problem here, it’s not good to directly insert confidential data like API keys on your code. We will use os.getenv
to load these constants from our system.
After some minor tweaks the code will look like this:
Assuming our main python script is named main.py
we can proceed to execute it:
python3 main.py
Now you will see indications that our discord bot is running if you configured everything correctly.
How about using docker?
I love Docker, so yes…
Let’s create Dockerfile
and docker-compose.yml
for our docker configuration then .env
for our environment variables, our project structure now looks like this:
Here we can explain the content and functionality of our new files, .env
will hold the Discord and OpenAI tokens.
A new file in our project is requirements.txt
as well, you can generate by freezing dependencies to this file with the command:
pip freeze -> requirements.txt
Avoiding getting extra dependencies written in requirements here is the file I generated using a virtual environment:
Now let’s explain Dockerfile
, first, we’ll use python:3.8-slim-buster as the base image to build our container on, then set /bot as our working directory, copy bot the directory from the project root to the container and install the required dependencies:
Simple docker-compose.yml
configuration with a single container which is built based on the instructions on Dockerfile
:
Build the docker image and spin up the container:
docker-compose up --build -d
And now you have the OpenAI discord bot running in a container.