diff --git a/.env.sample b/.env.sample index 822abb9..46ebab8 100644 --- a/.env.sample +++ b/.env.sample @@ -13,7 +13,3 @@ DISCORD_IP = IP_ADDRESS # subnet address, ex. 172.18.0.0 as we use /16. SUBNET_ADDRESS = ADDRESS - -# redis port and ip, default redis port is 6379 -REDIS_IP = IP_ADDRESS -REDIS_PORT = PORT \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 971d2cd..3675511 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -34,8 +34,6 @@ jobs: echo OLLAMA_IP = ${{ secrets.OLLAMA_IP }} >> .env echo OLLAMA_PORT = ${{ secrets.OLLAMA_PORT }} >> .env echo MODEL = ${{ secrets.MODEL }} >> .env - echo REDIS_IP = ${{ secrets.REDIS_IP }} >> .env - echo REDIS_PORT = ${{ secrets.REDIS_PORT }} >> .env # set -e ensures if nohup fails, this section fails - name: Startup Discord Bot Client @@ -63,8 +61,6 @@ jobs: echo OLLAMA_IP = ${{ secrets.OLLAMA_IP }} >> .env echo OLLAMA_PORT = ${{ secrets.OLLAMA_PORT }} >> .env echo MODEL = ${{ secrets.MODEL }} >> .env - echo REDIS_IP = ${{ secrets.REDIS_IP }} >> .env - echo REDIS_PORT = ${{ secrets.REDIS_PORT }} >> .env - name: Setup Docker Network and Images run: | @@ -72,8 +68,8 @@ jobs: - name: Check Images Exist run: | - (docker images | grep -q 'kevinthedang/discord-ollama' && docker images | grep -qE 'ollama/ollama' | docker images | grep -qE 'redis') || exit 1 + (docker images | grep -q 'kevinthedang/discord-ollama' && docker images | grep -qE 'ollama/ollama') || exit 1 - name: Check Containers Exist run: | - (docker ps | grep -q 'ollama' && docker ps | grep -q 'discord' && docker ps | grep -q 'redis') || exit 1 + (docker ps | grep -q 'ollama' && docker ps | grep -q 'discord') || exit 1 diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index d67e161..ce650ba 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -31,8 +31,6 @@ jobs: echo OLLAMA_IP = ${{ secrets.OLLAMA_IP }} >> .env echo OLLAMA_PORT = ${{ secrets.OLLAMA_PORT }} >> .env echo MODEL = ${{ secrets.MODEL }} >> .env - echo REDIS_IP = ${{ secrets.REDIS_IP }} >> .env - echo REDIS_PORT = ${{ secrets.REDIS_PORT }} >> .env - name: Collect Code Coverage run: | diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 43e88bc..dee7c17 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -24,8 +24,6 @@ jobs: echo MODEL = ${{ secrets.MODEL }} >> .env echo DISCORD_IP = ${{ secrets.DISCORD_IP }} >> .env echo SUBNET_ADDRESS = ${{ secrets.SUBNET_ADDRESS }} >> .env - echo REDIS_IP = ${{ secrets.REDIS_IP }} >> .env - echo REDIS_PORT = ${{ secrets.REDIS_PORT }} >> .env - name: Check if directory exists and delete it run: | @@ -59,7 +57,6 @@ jobs: npm install IMAGE="kevinthedang/discord-ollama" - REDIS="redis" OLLAMA="ollama/ollama" if docker images | grep -q $IMAGE; then @@ -75,19 +72,6 @@ jobs: echo "Old $IMAGE Image Removed" fi - if docker images | grep -q $REDIS; then - IMAGE_ID=$(docker images -q $REDIS) - CONTAINER_IDS=$(docker ps -q --filter "ancestor=$IMAGE_ID") - - if [ ! -z "$CONTAINER_IDS" ]; then - # Stop and remove the running containers - docker stop $CONTAINER_IDS - echo "Stopped and removed the containers using the image $REDIS" - fi - docker rmi $IMAGE_ID - echo "Old $REDIS Image Removed" - fi - if docker images | grep -q $OLLAMA; then IMAGE_ID=$(docker images -q $OLLAMA) CONTAINER_IDS=$(docker ps -q --filter "ancestor=$IMAGE_ID") @@ -117,14 +101,6 @@ jobs: --ip ${{ secrets.OLLAMA_IP }} \ ollama/ollama:latest - docker run --rm -d \ - -v redis:/root/.redis \ - -p ${{ secrets.REDIS_PORT }}:${{ secrets.REDIS_PORT }} \ - --name redis \ - --network ollama-net \ - --ip ${{ secrets.REDIS_IP }} \ - redis:latest - docker run --rm -d \ -v discord:/src/app \ --name discord \ diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index cb063bb..5fe9007 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -42,8 +42,6 @@ jobs: echo OLLAMA_IP = ${{ secrets.OLLAMA_IP }} >> .env echo OLLAMA_PORT = ${{ secrets.OLLAMA_PORT }} >> .env echo MODEL = ${{ secrets.MODEL }} >> .env - echo REDIS_IP = ${{ secrets.REDIS_IP }} >> .env - echo REDIS_PORT = ${{ secrets.REDIS_PORT }} >> .env - name: Test Application run: | diff --git a/README.md b/README.md index 395a408..14e9304 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,6 @@ The project aims to: * [x] Generated Token Length Handling for >2000 * [x] Token Length Handling of any message size * [x] User vs. Server Preferences - * [ ] Redis Caching * [x] Administrator Role Compatible * [x] Multi-User Chat Generation (Multiple users chatting at the same time) - This was built in from Ollama `v0.2.1+` * [x] Automatic and Manual model pulling through the Discord client @@ -54,8 +53,6 @@ These are guides to the features and capabilities of this app. * This project requires the use of npm version `10.9.0` or above. * [Ollama](https://ollama.com/) * [Ollama Docker Image](https://hub.docker.com/r/ollama/ollama) -* [Redis](https://redis.io/) - * [Redis Docker Image](https://hub.docker.com/_/redis) * [Discord.js Docs](https://discord.js.org/docs/packages/discord.js/main) * [Setting up Docker (Ubuntu 20.04)](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-20-04) * [Setting up Nvidia Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html) diff --git a/docker-compose.yml b/docker-compose.yml index c05070d..9fc3a78 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,14 +7,12 @@ services: build: ./ # find docker file in designated path container_name: discord restart: always # rebuild container always - image: kevinthedang/discord-ollama:0.8.5 + image: kevinthedang/discord-ollama:0.8.6 environment: CLIENT_TOKEN: ${CLIENT_TOKEN} OLLAMA_IP: ${OLLAMA_IP} OLLAMA_PORT: ${OLLAMA_PORT} MODEL: ${MODEL} - REDIS_IP: ${REDIS_IP} - REDIS_PORT: ${REDIS_PORT} networks: ollama-net: ipv4_address: ${DISCORD_IP} @@ -37,19 +35,6 @@ services: ports: - ${OLLAMA_PORT}:${OLLAMA_PORT} -# setup redis container - redis: - image: redis:latest - container_name: redis - restart: always - networks: - ollama-net: - ipv4_address: ${REDIS_IP} - volumes: - - redis:/root/.redis - ports: - - ${REDIS_PORT}:${REDIS_PORT} - # create a network that supports giving addresses withing a specific subnet networks: ollama-net: @@ -62,4 +47,3 @@ networks: volumes: ollama: discord: - redis: diff --git a/docs/setup-docker.md b/docs/setup-docker.md index 30a4c02..22eaad5 100644 --- a/docs/setup-docker.md +++ b/docs/setup-docker.md @@ -43,13 +43,11 @@ sudo systemctl restart docker * [GitHub repository](https://github.com/NVIDIA/nvidia-container-toolkit?tab=readme-ov-file) for Nvidia Container Toolkit ## To Run (with Docker and Docker Compose) -* With the inclusion of subnets in the `docker-compose.yml`, you will need to set the `SUBNET_ADDRESS`, `OLLAMA_IP`, `OLLAMA_PORT`, `REDIS_IP`, `REDIS_PORT`, and `DISCORD_IP`. Here are some default values if you don't care: +* With the inclusion of subnets in the `docker-compose.yml`, you will need to set the `SUBNET_ADDRESS`, `OLLAMA_IP`, `OLLAMA_PORT`, and `DISCORD_IP`. Here are some default values if you don't care: * `SUBNET_ADDRESS = 172.18.0.0` * `OLLAMA_IP = 172.18.0.2` * `OLLAMA_PORT = 11434` * `DISCORD_IP = 172.18.0.3` - * `REDIS_IP = 172.18.0.4` - * `REDIS_PORT = 6379` * Don't understand any of this? watch a Networking video to understand subnetting. * You also need all environment variables shown in [`.env.sample`](../.env.sample) * Otherwise, there is no need to install any npm packages for this, you just need to run `npm run start` to pull the containers and spin them up. diff --git a/package-lock.json b/package-lock.json index 14f4978..deea55f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,8 +11,7 @@ "dependencies": { "discord.js": "^14.20.0", "dotenv": "^16.5.0", - "ollama": "^0.5.15", - "redis": "^4.7.0" + "ollama": "^0.5.15" }, "devDependencies": { "@types/node": "^22.13.14", @@ -769,65 +768,6 @@ "node": ">=14" } }, - "node_modules/@redis/bloom": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", - "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", - "license": "MIT", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/client": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.0.tgz", - "integrity": "sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==", - "license": "MIT", - "dependencies": { - "cluster-key-slot": "1.1.2", - "generic-pool": "3.9.0", - "yallist": "4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@redis/graph": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.1.tgz", - "integrity": "sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==", - "license": "MIT", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/json": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.7.tgz", - "integrity": "sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==", - "license": "MIT", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/search": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.2.0.tgz", - "integrity": "sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==", - "license": "MIT", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, - "node_modules/@redis/time-series": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.1.0.tgz", - "integrity": "sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==", - "license": "MIT", - "peerDependencies": { - "@redis/client": "^1.0.0" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.37.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.37.0.tgz", @@ -1473,15 +1413,6 @@ "node": ">= 16" } }, - "node_modules/cluster-key-slot": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", - "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1730,15 +1661,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/generic-pool": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", - "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/get-tsconfig": { "version": "4.10.0", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", @@ -2102,23 +2024,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/redis": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.7.0.tgz", - "integrity": "sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==", - "license": "MIT", - "workspaces": [ - "./packages/*" - ], - "dependencies": { - "@redis/bloom": "1.2.0", - "@redis/client": "1.6.0", - "@redis/graph": "1.1.1", - "@redis/json": "1.0.7", - "@redis/search": "1.2.0", - "@redis/time-series": "1.1.0" - } - }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -2867,12 +2772,6 @@ } } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index 3b569c5..99e8aa3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "discord-ollama", - "version": "0.8.5", + "version": "0.8.6", "description": "Ollama Integration into discord", "main": "build/index.js", "exports": "./build/index.js", @@ -13,24 +13,22 @@ "client": "npm run build && npm run prod", "clean": "docker compose down && docker rmi $(docker images | grep kevinthedang | tr -s ' ' | cut -d ' ' -f 3) && docker rmi $(docker images --filter \"dangling=true\" -q --no-trunc)", "start": "docker compose build --no-cache && docker compose up -d", - "docker:clean": "docker rm -f discord && docker rm -f ollama && docker rm -f redis && docker network prune -f && docker rmi $(docker images | grep kevinthedang | tr -s ' ' | cut -d ' ' -f 3) && docker rmi $(docker images --filter \"dangling=true\" -q --no-trunc)", + "docker:clean": "docker rm -f discord && docker rm -f ollama && docker network prune -f && docker rmi $(docker images | grep kevinthedang | tr -s ' ' | cut -d ' ' -f 3) && docker rmi $(docker images --filter \"dangling=true\" -q --no-trunc)", "docker:network": "docker network create --subnet=172.18.0.0/16 ollama-net", "docker:build": "docker build --no-cache -t kevinthedang/discord-ollama:$(node -p \"require('./package.json').version\") .", "docker:build-latest": "docker build --no-cache -t kevinthedang/discord-ollama:latest .", "docker:client": "docker run -d -v discord:/src/app --name discord --network ollama-net --ip 172.18.0.3 kevinthedang/discord-ollama:$(node -p \"require('./package.json').version\")", - "docker:redis": "docker run -d -v redis:/root/.redis -p 6379:6379 --name redis --network ollama-net --ip 172.18.0.4 redis:latest", "docker:ollama": "docker run -d --gpus=all -v ollama:/root/.ollama -p 11434:11434 --name ollama --network ollama-net --ip 172.18.0.2 ollama/ollama:latest", "docker:ollama-cpu": "docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama --network ollama-net --ip 172.18.0.2 ollama/ollama:latest", - "docker:start": "docker network prune -f && npm run docker:network && npm run docker:build && npm run docker:redis && npm run docker:client && npm run docker:ollama", - "docker:start-cpu": "docker network prune -f && npm run docker:network && npm run docker:build && npm run docker:redis && npm run docker:client && npm run docker:ollama-cpu" + "docker:start": "docker network prune -f && npm run docker:network && npm run docker:build && npm run docker:client && npm run docker:ollama", + "docker:start-cpu": "docker network prune -f && npm run docker:network && npm run docker:build && npm run docker:client && npm run docker:ollama-cpu" }, "author": "Kevin Dang", "license": "ISC", "dependencies": { "discord.js": "^14.20.0", "dotenv": "^16.5.0", - "ollama": "^0.5.15", - "redis": "^4.7.0" + "ollama": "^0.5.15" }, "devDependencies": { "@types/node": "^22.13.14", @@ -45,4 +43,4 @@ "npm": ">=10.9.0", "node": ">=22.12.0" } -} \ No newline at end of file +} diff --git a/src/client.ts b/src/client.ts index 7fa4034..82d76ca 100644 --- a/src/client.ts +++ b/src/client.ts @@ -1,6 +1,5 @@ import { Client, GatewayIntentBits } from 'discord.js' import { Ollama } from 'ollama' -import { createClient } from 'redis' import { Queue } from './queues/queue.js' import { UserMessage, registerEvents } from './utils/index.js' import Events from './events/index.js' @@ -16,11 +15,6 @@ const client = new Client({ ] }) -// initialize connection to redis -const redis = createClient({ - url: `redis://${Keys.redisHost}:${Keys.redisPort}`, -}) - // initialize connection to ollama container export const ollama = new Ollama({ host: `http://${Keys.ipAddress}:${Keys.portAddress}`, @@ -32,18 +26,6 @@ const messageHistory: Queue = new Queue // register all events registerEvents(client, Events, messageHistory, ollama, Keys.defaultModel) -// Try to connect to redis -await redis.connect() - .then(response => { - console.log('[Redis] Successfully Connected') - }) - .catch(error => { - console.error('[Redis] Connection Error. See error below:\n', error) - console.warn('[Redis] Failed to connect to Redis Database, using local system') - // TODO: create boolean flag that will probably be used in messageCreate.ts if redis database is down - // When implementing this boolean flag, move connection to database BEFORE the registerEvents method - }) - // Try to log in the client await client.login(Keys.clientToken) .catch((error) => { diff --git a/src/keys.ts b/src/keys.ts index af99e37..c037016 100644 --- a/src/keys.ts +++ b/src/keys.ts @@ -4,9 +4,7 @@ export const Keys = { clientToken: getEnvVar('CLIENT_TOKEN'), ipAddress: getEnvVar('OLLAMA_IP', '127.0.0.1'), // default ollama ip if none portAddress: getEnvVar('OLLAMA_PORT', '11434'), // default ollama port if none - defaultModel: getEnvVar('MODEL', 'llama3.2'), - redisHost: getEnvVar('REDIS_IP', '172.18.0.4'), // default redis host if none - redisPort: parseInt(getEnvVar('REDIS_PORT', '6379')) // default redis port if none + defaultModel: getEnvVar('MODEL', 'llama3.2') } as const // readonly keys export default Keys \ No newline at end of file diff --git a/tests/commands.test.ts b/tests/commands.test.ts index c6b6db9..c06e911 100644 --- a/tests/commands.test.ts +++ b/tests/commands.test.ts @@ -5,16 +5,9 @@ import { describe, expect, it, vi } from 'vitest' import commands from '../src/commands/index.js' /** - * Mocking redis found in client.ts because of the commands + * Mocking client.ts because of the commands */ -vi.mock('../src/client.js', () => ({ - redis: { - createClient: vi.fn(), - connect: vi.fn(), - get: vi.fn(), - set: vi.fn() - } -})) +vi.mock('../src/client.js', () => ({})) /** * Commands test suite, tests the commands object