From c6e9b1cfb6d7240483fcca33a30d553b8e940d79 Mon Sep 17 00:00:00 2001 From: Shubham Verlekar Date: Thu, 16 Feb 2023 03:34:42 +0530 Subject: [PATCH 1/6] Update setup instructions and environment variables - Upgrade pip, setuptools, and wheel - Install dependencies - Add environment variables for OpenAI API token, Discord bot token, debug guild and channel, allowed guilds, admin roles, Dalle roles, GPT roles, welcome message, user input API keys, moderation alert channel, and user key DB path - Set volume mounts for container and shared folder - Raise the amount of returned recordings from 10 to 100 - Add docker and docker-compose installation instructions [Dockerfile] - Add OpenAI token, Discord token, Pinecone token, debug guild, debug channel, allowed guilds, admin roles, dalle roles, GPT roles, welcome message, user input API keys, moderation alert channel, and user key database path environment variables - Upgrade pip, setuptools, and wheel - Install dependencies - Copy minimal files to main image [docker-compose.yml] - Add Docker Compose configuration for GPT3Discord - Set environment variables for OpenAI API token, Discord bot token, debug guild and channel, allowed guilds, admin roles, Dalle roles, GPT roles, welcome message, user input API keys, moderation alert channel, and user key DB path - Set volume mounts for container and shared folder [README.md] - Raise the amount of returned recordings from 10 to 100 - Add docker and docker-compose installation instructions - Add environment variables to docker-compose.yml - Add instructions for non-server, non-docker installation (Windows included) --- Dockerfile | 18 ++++++++++++++++++ README.md | 47 ++++++++++++++++++++++++++++++++++++++++++++-- docker-compose.yml | 22 ++++++++++++++++++++++ sample.env | 2 +- 4 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 docker-compose.yml diff --git a/Dockerfile b/Dockerfile index d49d566..6a67690 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,7 @@ ARG PY_VERSION=3.9 + + # Build container FROM python:${PY_VERSION} as base FROM base as builder @@ -17,6 +19,7 @@ RUN apt-get update RUN curl https://sh.rustup.rs -sSf | bash -s -- -y ENV PATH="/root/.cargo/bin:${PATH}" + RUN mkdir /install /src WORKDIR /install RUN pip install --target="/install" --upgrade pip setuptools wheel @@ -40,6 +43,21 @@ RUN pip install --target="/install" /src # Copy minimal to main image (to keep as small as possible) FROM python:${PY_VERSION}-slim + +ENV OPENAI_TOKEN="" +ENV DISCORD_TOKEN="" +ENV PINECONE_TOKEN="" +ENV DEBUG_GUILD="" +ENV DEBUG_CHANNEL="" +ENV ALLOWED_GUILDS="" +ENV ADMIN_ROLES="" +ENV DALLE_ROLES="" +ENV GPT_ROLES="" +ENV WELCOME_MESSAGE="" +ENV USER_INPUT_API_KEYS="" +ENV MODERATIONS_ALERT_CHANNEL="" +ENV USER_KEY_DB_PATH="" + ARG PY_VERSION COPY . . COPY --from=builder /install /usr/local/lib/python${PY_VERSION}/site-packages diff --git a/README.md b/README.md index 16cffe3..e326d04 100644 --- a/README.md +++ b/README.md @@ -415,7 +415,7 @@ As a last resort, you can try to run the bot using python in a basic way, with s cd (the folder where the files for GPT3Discord are located/cloned) python3.9 gpt3discord.py ``` - + + +### Docker and Docker Compose : +To use docker you can use the following command +``` +docker run -d --name gpt3discord -v /containers/gpt3discord:/data -v /containers/gpt3discord/share:/data/share --env-file /path/to/.env gpt3discord:latest +``` +Make sure that the /data and /data/share are created and the `env-file` path is correct. + + + + + +#### Docker Compose +To use Docker Compose, you need to have Docker and Docker Compose installed on your system. You can download and install them from the following links: + +- Docker +- Docker Compose + +[You will need to install Docker for Desktop if you are on a desktop machine such as Windows or Mac, trying to run this] + + +To start the gpt3discord container with Docker Compose, follow these steps: + +1. Open a terminal or command prompt and navigate to the directory that contains the docker-compose.yml file. +2. Open the docker-compose.yml file and replace the environment variable values with your actual tokens and IDs. +3. Run the following command to start the container in detached mode: + +``` +Copy codedocker-compose up -d +``` + +This will start the container and use the settings in the docker-compose.yml file. The -d option tells Docker Compose to run the container in the background (detached mode). + + +To stop the gpt3discord container, run the following command: + +``` +Copy codedocker-compose down +``` + +This will stop the container and remove the services and networks defined in the docker-compose.yml file. + +That's it! With these simple steps, you can start and stop the gpt3discord container using Docker Compose. ### Non-Server, Non-Docker installation (Windows included) diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..c45c697 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,22 @@ +version: '3.8' +services: + gpt3discord: + image: gpt3discord:latest + container_name: gpt3discord + environment: + OPENAI_TOKEN: "" + DISCORD_TOKEN: "" + DEBUG_GUILD: "974519864045756446" + DEBUG_CHANNEL: "977697652147892304" + ALLOWED_GUILDS: "971268468148166697,971268468148166697" + ADMIN_ROLES: "Admin,Owner" + DALLE_ROLES: "Admin,Openai,Dalle,gpt" + GPT_ROLES: "openai,gpt" + WELCOME_MESSAGE: "Hi There! Welcome to our Discord server. We hope you'll enjoy our server and we look forward to engaging with you!" + USER_INPUT_API_KEYS: "False" + MODERATIONS_ALERT_CHANNEL: "977697652147892304" + USER_KEY_DB_PATH: "user_key_db.sqlite" + volumes: + - /containers/gpt3discord:/data + - /containers/gpt3discord/share:/data/share + restart: always diff --git a/sample.env b/sample.env index 0be17d6..b50a2d4 100644 --- a/sample.env +++ b/sample.env @@ -22,4 +22,4 @@ USER_INPUT_API_KEYS="False" # If True, users must use their own API keys for Ope MODERATIONS_ALERT_CHANNEL = "977697652147892304" # User API key db path configuration. This is where the user API keys will be stored. -USER_KEY_DB_PATH = "user_key_db.sqlite" +USER_KEY_DB_PATH = "user_key_db.sqlite" \ No newline at end of file From 8e570e67ad31cec97768cae2e78ba3eb24454a64 Mon Sep 17 00:00:00 2001 From: Connor Shubham Verlekar <63520509+connorv001@users.noreply.github.com> Date: Thu, 16 Feb 2023 03:36:36 +0530 Subject: [PATCH 2/6] Create build-and-publish-docker.yml Signed-off-by: Connor Shubham Verlekar <63520509+connorv001@users.noreply.github.com> --- .../workflows/build-and-publish-docker.yml | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 .github/workflows/build-and-publish-docker.yml diff --git a/.github/workflows/build-and-publish-docker.yml b/.github/workflows/build-and-publish-docker.yml new file mode 100644 index 0000000..ed3c8f4 --- /dev/null +++ b/.github/workflows/build-and-publish-docker.yml @@ -0,0 +1,96 @@ +name: Docker + +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +on: + schedule: + - cron: '28 2 * * *' + push: + branches: [ "main" ] + # Publish semver tags as releases. + tags: [ 'v*.*.*' ] + pull_request: + branches: [ "main" ] + +env: + # Use docker.io for Docker Hub if empty + REGISTRY: ghcr.io + # github.repository as / + IMAGE_NAME: ${{ github.repository }} + + +jobs: + build: + + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + # This is used to complete the identity challenge + # with sigstore/fulcio when running outside of PRs. + id-token: write + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + # Install the cosign tool except on PR + # https://github.com/sigstore/cosign-installer + - name: Install cosign + if: github.event_name != 'pull_request' + uses: sigstore/cosign-installer@f3c664df7af409cb4873aa5068053ba9d61a57b6 #v2.6.0 + with: + cosign-release: 'v1.13.1' + + + # Workaround: https://github.com/docker/build-push-action/issues/461 + - name: Setup Docker buildx + uses: docker/setup-buildx-action@79abd3f86f79a9d68a23c75a09a9a85889262adf + + # Login against a Docker registry except on PR + # https://github.com/docker/login-action + - name: Log into registry ${{ env.REGISTRY }} + if: github.event_name != 'pull_request' + uses: docker/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + # Extract metadata (tags, labels) for Docker + # https://github.com/docker/metadata-action + - name: Extract Docker metadata + id: meta + uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + + # Build and push Docker image with Buildx (don't push on PR) + # https://github.com/docker/build-push-action + - name: Build and push Docker image + id: build-and-push + uses: docker/build-push-action@ac9327eae2b366085ac7f6a2d02df8aa8ead720a + with: + context: . + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + + + # Sign the resulting Docker image digest except on PRs. + # This will only write to the public Rekor transparency log when the Docker + # repository is public to avoid leaking data. If you would like to publish + # transparency data even for private images, pass --force to cosign below. + # https://github.com/sigstore/cosign + - name: Sign the published Docker image + if: ${{ github.event_name != 'pull_request' }} + env: + COSIGN_EXPERIMENTAL: "true" + # This step uses the identity token to provision an ephemeral certificate + # against the sigstore community Fulcio instance. + run: echo "${{ steps.meta.outputs.tags }}" | xargs -I {} cosign sign {}@${{ steps.build-and-push.outputs.digest }} From 01570e286cd824d3f73df86e0ae5722d0c51431a Mon Sep 17 00:00:00 2001 From: Shubham Verlekar Date: Thu, 16 Feb 2023 04:02:00 +0530 Subject: [PATCH 3/6] Update docker image and README for OpenAI API - Update docker-compose.yml to use image from ghcr.io repository and add environment variable for OpenAI API Token - Update README.md instructions to use the ghcr.io repository and remove 3 empty lines at the end of the file [docker-compose.yml] - Change the image from `gpt3discord:latest` to `docker pull ghcr.io/Kav-K/GPT3Discord:main` - Add environment variable for OpenAI API Token [README.md] - Change the docker run command to use the ghcr.io repository - Remove 3 empty lines at the end of the file --- README.md | 5 +---- docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index e326d04..d25475b 100644 --- a/README.md +++ b/README.md @@ -440,14 +440,11 @@ This can also be run via screen/tmux or detached like a daemon. --> ### Docker and Docker Compose : To use docker you can use the following command ``` -docker run -d --name gpt3discord -v /containers/gpt3discord:/data -v /containers/gpt3discord/share:/data/share --env-file /path/to/.env gpt3discord:latest +docker run -d --name gpt3discord -v /containers/gpt3discord:/data -v /containers/gpt3discord/share:/data/share --env-file /path/to/.env ghcr.io/Kav-K/GPT3Discord:main ``` Make sure that the /data and /data/share are created and the `env-file` path is correct. - - - #### Docker Compose To use Docker Compose, you need to have Docker and Docker Compose installed on your system. You can download and install them from the following links: diff --git a/docker-compose.yml b/docker-compose.yml index c45c697..8b4cd96 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.8' services: gpt3discord: - image: gpt3discord:latest + image: docker pull ghcr.io/Kav-K/GPT3Discord:main container_name: gpt3discord environment: OPENAI_TOKEN: "" From 1c9e588d18d8800edb90324a90952a6ec308fb8c Mon Sep 17 00:00:00 2001 From: Shubham Verlekar Date: Thu, 16 Feb 2023 04:17:49 +0530 Subject: [PATCH 4/6] Update Docker image to `ghcr.io/kav-k/gpt3discord:main` - Update Docker image to `ghcr.io/kav-k/gpt3discord:main` - Update `docker-compose.yml` image name to `kav-k/gpt3discord:main` [README.md] - Change the Docker image to `ghcr.io/kav-k/gpt3discord:main` [docker-compose.yml] - Change the image name from `Kav-K/GPT3Discord:main` to `kav-k/gpt3discord:main` --- README.md | 2 +- docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d25475b..8debb0f 100644 --- a/README.md +++ b/README.md @@ -440,7 +440,7 @@ This can also be run via screen/tmux or detached like a daemon. --> ### Docker and Docker Compose : To use docker you can use the following command ``` -docker run -d --name gpt3discord -v /containers/gpt3discord:/data -v /containers/gpt3discord/share:/data/share --env-file /path/to/.env ghcr.io/Kav-K/GPT3Discord:main +docker run -d --name gpt3discord -v /containers/gpt3discord:/data -v /containers/gpt3discord/share:/data/share --env-file /path/to/.env ghcr.io/kav-k/gpt3discord:main ``` Make sure that the /data and /data/share are created and the `env-file` path is correct. diff --git a/docker-compose.yml b/docker-compose.yml index 8b4cd96..b2abb10 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.8' services: gpt3discord: - image: docker pull ghcr.io/Kav-K/GPT3Discord:main + image: docker pull ghcr.io/kav-k/gpt3discord:main container_name: gpt3discord environment: OPENAI_TOKEN: "" From a2a9ac17564e9e97bf91161b124956eb81776874 Mon Sep 17 00:00:00 2001 From: Shubham Verlekar Date: Thu, 16 Feb 2023 04:32:39 +0530 Subject: [PATCH 5/6] Update Docker Compose for GPT-3 Discord Bot - Update `docker-compose.yml` to use the latest version of `ghcr.io/kav-k/gpt3discord:main` image - Add `OPENAI_TOKEN` environment variable to `docker-compose.yml` [docker-compose.yml] - Change the `image` line in `docker-compose.yml` from `docker pull ghcr.io/kav-k/gpt3discord:main` to `ghcr.io/kav-k/gpt3discord:main` - Add an `OPENAI_TOKEN` environment variable to `docker-compose.yml` --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index b2abb10..4529bac 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.8' services: gpt3discord: - image: docker pull ghcr.io/kav-k/gpt3discord:main + image: ghcr.io/kav-k/gpt3discord:main container_name: gpt3discord environment: OPENAI_TOKEN: "" From 5eedc459fad420486b3a42e9804bb97c4eac7510 Mon Sep 17 00:00:00 2001 From: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> Date: Wed, 15 Feb 2023 23:31:45 +0000 Subject: [PATCH 6/6] Format Python code with psf/black push --- cogs/search_service_cog.py | 14 ++++++++++++-- models/index_model.py | 11 ++++++++--- models/search_model.py | 19 ++++++++++++++----- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/cogs/search_service_cog.py b/cogs/search_service_cog.py index 5ccae58..2b6326a 100644 --- a/cogs/search_service_cog.py +++ b/cogs/search_service_cog.py @@ -14,6 +14,7 @@ ALLOWED_GUILDS = EnvService.get_allowed_guilds() USER_INPUT_API_KEYS = EnvService.get_user_input_api_keys() USER_KEY_DB = EnvService.get_api_db() + class RedoSearchUser: def __init__(self, ctx, query, search_scope, nodes): self.ctx = ctx @@ -21,6 +22,7 @@ class RedoSearchUser: self.search_scope = search_scope self.nodes = nodes + class SearchService(discord.Cog, name="SearchService"): """Cog containing translation commands and retrieval of translation services""" @@ -141,5 +143,13 @@ class RedoButton(discord.ui.View): @discord.ui.button(label="Redo", style=discord.ButtonStyle.danger) async def redo(self, button: discord.ui.Button, interaction: discord.Interaction): """Redo the translation""" - await interaction.response.send_message("Redoing search...", ephemeral=True, delete_after=15) - await self.search_cog.search_command(self.search_cog.redo_users[self.ctx.user.id].ctx, self.search_cog.redo_users[self.ctx.user.id].query, self.search_cog.redo_users[self.ctx.user.id].search_scope, self.search_cog.redo_users[self.ctx.user.id].nodes, redo=True) + await interaction.response.send_message( + "Redoing search...", ephemeral=True, delete_after=15 + ) + await self.search_cog.search_command( + self.search_cog.redo_users[self.ctx.user.id].ctx, + self.search_cog.redo_users[self.ctx.user.id].query, + self.search_cog.redo_users[self.ctx.user.id].search_scope, + self.search_cog.redo_users[self.ctx.user.id].nodes, + redo=True, + ) diff --git a/models/index_model.py b/models/index_model.py index 7f4f6ab..5b04f98 100644 --- a/models/index_model.py +++ b/models/index_model.py @@ -695,7 +695,7 @@ class ComposeModal(discord.ui.View): # Map everything into the short to long cache for index in self.indexes: if len(index) > 94: - index_name = index[:94] + "-" + str(random.randint(0000,9999)) + index_name = index[:94] + "-" + str(random.randint(0000, 9999)) SHORT_TO_LONG_CACHE[index_name] = index else: SHORT_TO_LONG_CACHE[index[:99]] = index @@ -711,7 +711,9 @@ class ComposeModal(discord.ui.View): self.index_select = discord.ui.Select( placeholder="Select index(es) to compose", options=[ - discord.SelectOption(label=LONG_TO_SHORT_CACHE[index], value=LONG_TO_SHORT_CACHE[index]) + discord.SelectOption( + label=LONG_TO_SHORT_CACHE[index], value=LONG_TO_SHORT_CACHE[index] + ) for index in self.indexes ][0:25], max_values=len(self.indexes) if len(self.indexes) < 25 else 25, @@ -728,7 +730,10 @@ class ComposeModal(discord.ui.View): discord.ui.Select( placeholder="Select index(es) to compose", options=[ - discord.SelectOption(label=LONG_TO_SHORT_CACHE[index], value=LONG_TO_SHORT_CACHE[index]) + discord.SelectOption( + label=LONG_TO_SHORT_CACHE[index], + value=LONG_TO_SHORT_CACHE[index], + ) for index in self.indexes ][i : i + 25], max_values=len(self.indexes[i : i + 25]), diff --git a/models/search_model.py b/models/search_model.py index d878fb5..4b92980 100644 --- a/models/search_model.py +++ b/models/search_model.py @@ -160,7 +160,13 @@ class Search: pass async def search( - self, ctx: discord.ApplicationContext, query, user_api_key, search_scope, nodes, redo=None + self, + ctx: discord.ApplicationContext, + query, + user_api_key, + search_scope, + nodes, + redo=None, ): DEFAULT_SEARCH_NODES = 1 if not user_api_key: @@ -169,9 +175,11 @@ class Search: os.environ["OPENAI_API_KEY"] = user_api_key if ctx: - in_progress_message = await ctx.respond( - embed=self.build_search_started_embed() - ) if not redo else await ctx.channel.send(embed=self.build_search_started_embed()) + in_progress_message = ( + await ctx.respond(embed=self.build_search_started_embed()) + if not redo + else await ctx.channel.send(embed=self.build_search_started_embed()) + ) llm_predictor = LLMPredictor(llm=OpenAI(model_name="text-davinci-003")) try: @@ -181,7 +189,8 @@ class Search: # Refine a query to send to google custom search API query_refined = llm_predictor_presearch.generate( - prompts=[f"You are to be given a search query for google. Change the query such that putting it into the Google Custom Search API will return the most relevant websites to assist in answering the original query. If the original query is asking about something that is relevant to the current day, insert the current_date into the refined query. If the user is asking about something that may be relevant to the current month, insert the current year and month into the refined query, if the query is asking for something relevant to the current year, insert the current year into the refined query. There is no need to insert a day, month, or year for queries that purely ask about facts and about things that don't have much time-relevance. The current_date is {str(datetime.now().date())}. Do not insert the current_date if not neccessary. Respond with only the refined query for the original query. Don’t use punctuation or quotation marks.\n\nExamples:\n---\nOriginal Query: ‘Who is Harald Baldr?’\nRefined Query: ‘Harald Baldr biography’\n---\nOriginal Query: ‘What happened today with the Ohio train derailment?’\nRefined Query: ‘Ohio train derailment details {str(datetime.now().date())}’\n---\nOriginal Query: ‘Is copper in drinking water bad for you?’\nRefined Query: ‘copper in drinking water adverse effects’\n---\nOriginal Query: What's the current time in Mississauga?\nRefined Query: current time Mississauga\nNow, refine the user input query.\nOriginal Query: {query}\nRefined Query:" + prompts=[ + f"You are to be given a search query for google. Change the query such that putting it into the Google Custom Search API will return the most relevant websites to assist in answering the original query. If the original query is asking about something that is relevant to the current day, insert the current_date into the refined query. If the user is asking about something that may be relevant to the current month, insert the current year and month into the refined query, if the query is asking for something relevant to the current year, insert the current year into the refined query. There is no need to insert a day, month, or year for queries that purely ask about facts and about things that don't have much time-relevance. The current_date is {str(datetime.now().date())}. Do not insert the current_date if not neccessary. Respond with only the refined query for the original query. Don’t use punctuation or quotation marks.\n\nExamples:\n---\nOriginal Query: ‘Who is Harald Baldr?’\nRefined Query: ‘Harald Baldr biography’\n---\nOriginal Query: ‘What happened today with the Ohio train derailment?’\nRefined Query: ‘Ohio train derailment details {str(datetime.now().date())}’\n---\nOriginal Query: ‘Is copper in drinking water bad for you?’\nRefined Query: ‘copper in drinking water adverse effects’\n---\nOriginal Query: What's the current time in Mississauga?\nRefined Query: current time Mississauga\nNow, refine the user input query.\nOriginal Query: {query}\nRefined Query:" ] ) query_refined_text = query_refined.generations[0][0].text