Compare commits

...

12 Commits

Author SHA1 Message Date
GooeyTuxedo ba9aeaeb3e Containerize bot and server in one stack. 2023-04-16 11:33:49 -07:00
Raven Scott 7b3e0c1db2 Removing post proceess of output 2023-04-16 16:22:57 +02:00
Raven Scott 5f8e57d121 Adding a space before input. Format: User: message Assistant: message 2023-04-16 14:48:18 +02:00
Raven Scott cc770e617d fixing prompt 2023-04-16 14:47:04 +02:00
Raven Scott 5a56251e20 Adding cache to server env 2023-04-16 13:22:17 +02:00
Raven Scott 6bb74c8020 update readme 2023-04-12 18:37:02 +02:00
Raven Scott 56c7bfd26d update readme to add screenshot 2023-04-12 18:29:51 +02:00
Raven Scott 5793b7b4ad update readme 2023-04-12 16:32:06 +02:00
Raven Scott cf6e47eebc update readme 2023-04-12 16:31:29 +02:00
Raven Scott f98caa23cc update readme 2023-04-12 16:30:59 +02:00
Raven Scott d3162bce32 dockerize update 2023-04-12 16:19:27 +02:00
Raven Scott ec7dbde761 dockerize 2023-04-12 16:17:18 +02:00
11 changed files with 111 additions and 41 deletions

3
.gitignore vendored
View File

@ -1,2 +1,3 @@
.env
node_modules/
package-lock.json

10
Dockerfile Normal file
View File

@ -0,0 +1,10 @@
FROM node:slim
WORKDIR /app
COPY package*.json ./
RUN npm install --omit=dev
COPY . .
CMD node llamabot.js

View File

@ -32,6 +32,9 @@ Define a generateResponse function that sends a request to the GPT-3 API to gene
Call the generateResponse function within the messageCreate event listener function.
![demo](https://media.discordapp.net/attachments/562897071326101515/1095738407826767922/image.png?width=1038&height=660 "demo")
# Backend REQUIIRED
The HTTP Server from https://abetlen.github.io/llama-cpp-python/ is required to use this bot.
@ -48,7 +51,7 @@ python3 -m llama_cpp.server
Navigate to http://localhost:8000/docs to see the OpenAPI documentation.
# Usage
# Static Usage
1) Use ```npm i ```
@ -60,5 +63,19 @@ Navigate to http://localhost:8000/docs to see the OpenAPI documentation.
6) Run the bot ```node llamabot.js ```
# Docker Compose
This will automatically configure the API for you as well as the bot in two seperate containers within a stack.
1. `git clone https://git.ssh.surf/snxraven/llama-cpp-python-djs-bot.git`
2. `cp default.env .env`
3. Set DATA_DIR in .env to the exact location of your model files.
4. Edit docker-compose.yaml MODEL to ensure the correct model bin is set
5. `docker compose up -d`
Want to make this better? Issue a pull request!

View File

@ -1,4 +1,4 @@
const emptyResponses = [
export const emptyResponses = [
"Oh boy, this is a tough one! Unfortunately, I don't have much insight to share on this topic.",
"Hmm, I'm scratching my head on this one. Sorry to say that I don't have much to offer.",
"Wish I had a witty remark, but alas, I don't have much to contribute to this discussion.",
@ -27,6 +27,4 @@ const emptyResponses = [
"Honestly, I'm a bit lost on this one, so I don't have much to contribute to this debate.",
"I'm afraid I don't have much experience with this, so I can't be of much help.",
"I wish I had some grand insight to share, but alas, I don't have much to offer in that regard."
];
module.exports = emptyResponses;
];

View File

@ -1,4 +1,4 @@
const errorMessages = [
export const errorMessages = [
"Uh oh, looks like something went awry! Try !reset to start fresh.",
"Oops, we hit a bump in the road! Give !reset a try to start anew.",
"We've encountered an error, but !reset can help us out! Give it a go.",
@ -21,7 +21,7 @@ const errorMessages = [
"Oopsie daisy! Give !reset a try and we'll start over."
];
const busyResponses = [
export const busyResponses = [
"Sorry about that! Looks like I'm tied up at the moment. Please try again later.",
"Oops, I'm currently busy with something else. Please try again later.",
"Looks like I'm already working on something. Can you try again later?",
@ -42,6 +42,4 @@ const errorMessages = [
"I'm afraid I'm busy with something else at the moment. Can you try again later?",
"Looks like I'm currently engaged with something else. Please try again later.",
"I'm currently unavailable. Can you try again later?"
];
module.exports = { errorMessages, busyResponses};
];

View File

@ -1,4 +1,4 @@
const resetResponses = [
export const resetResponses = [
"Whoops, let's start fresh! What can I assist you with now?",
"Looks like we need a fresh start! What do you need help with?",
"To avoid any gremlins in the system, let's reset! How can I assist you now?",
@ -21,7 +21,7 @@ const resetResponses = [
"Let's hit the restart button to make sure we're on the right track. What can I help you with now?"
];
const userResetMessages = [
export const userResetMessages = [
"All good, we're starting fresh! How can I assist you?",
"Got it, let's start over! How can I help you today?",
"Alright, starting anew! What can I help you with?",
@ -42,6 +42,4 @@ const resetResponses = [
"All good, we'll start from the beginning! What do you need help with?",
"Sure thing, we'll start over! What can I help you with today?",
"Conversation reset, confirmed! What do you need help with?"
];
module.exports = {resetResponses, userResetMessages};
];

View File

@ -1,4 +1,6 @@
THE_TOKEN = "DISCORD_TOKEN_HERE"
CHANNEL_IDS = 1094494101631680653,1094628334727614605
# ROOT_IP is only used when running the bot without docker compose
ROOT_IP = 192.168.0.15
ROOT_PORT = 8000
ROOT_PORT = 8000
DATA_DIR = /home/USERNAME/weights

27
docker-compose.yml Normal file
View File

@ -0,0 +1,27 @@
version: '3.9'
services:
llama-python-server:
container_name: llama-python-server
restart: unless-stopped
build:
context: ./server
env_file: .env
volumes:
- ${DATA_DIR}/weights:/usr/src/app/models
environment:
- HOST=llama-python-server
- MODEL=./models/30B.bin
llama-python-djs-bot:
container_name: llama-python-djs-bot
restart: unless-stopped
build:
context: .
depends_on:
- llama-python-server
environment:
- THE_TOKEN
- CHANNEL_IDS
- ROOT_IP=llama-python-server
- ROOT_PORT=8000
- CACHE=1

View File

@ -1,23 +1,16 @@
const Discord = require('discord.js');
const fetch = require('node-fetch');
const emptyResponses = require('./assets/emptyMessages.js');
const { resetResponses, userResetMessages } = require('./assets/resetMessages.js');
const { errorMessages, busyResponses } = require('./assets/errorMessages.js');
import "dotenv/config.js";
import fetch from 'node-fetch';
import { emptyResponses } from './assets/emptyMessages.js';
import { resetResponses, userResetMessages } from './assets/resetMessages.js';
import { errorMessages, busyResponses } from './assets/errorMessages.js';
require('dotenv').config()
const {
Client,
GatewayIntentBits,
ActivityType,
Partials
} = require('discord.js');
import { Client, GatewayIntentBits, ActivityType, Partials } from 'discord.js';
const client = new Client({
intents: [
GatewayIntentBits.DirectMessages,
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildBans,
GatewayIntentBits.GuildModeration,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent,
],
@ -111,15 +104,15 @@ client.on('messageCreate', async (message) => {
if (conversation.messages.length === 0) {
conversation.messages.push({
role: 'user',
content: `Your name is rAi, you code, write and provide any information without any mistakes.`
content: ` Assistant name: ChatAI. You code, write and provide any information without any mistakes.`
});
conversation.messages.push({
role: 'user',
content: `My name is ${message.author.username}.`
content: ` User name: ${message.author.username}.`
});
conversation.messages.push({
role: 'assistant',
content: `Hello, ${message.author.username}, how may I help you?`
content: ` Hello, ${message.author.username}, how may I help you?`
});
}
@ -132,7 +125,7 @@ client.on('messageCreate', async (message) => {
// Append user message to conversation history
conversation.messages.push({
role: 'user',
content: message.cleanContent
content: ` ${message.cleanContent}`
});
try {
@ -197,12 +190,10 @@ async function generateResponse(conversation) {
console.log(JSON.stringify(responseData))
const choice = responseData.choices[0];
// Remove "user None:" and any text after it from the response
const responseText = choice.message.content.trim();
const startIndex = responseText.indexOf('user None:');
const sanitizedResponse = startIndex === -1 ? responseText : responseText.substring(0, startIndex);
return sanitizedResponse;
const responseText = choice.message.content
return responseText;
} catch (err) {
throw err;
} finally {

17
package.json Normal file
View File

@ -0,0 +1,17 @@
{
"name": "llama-cpp-python-djs-bot",
"version": "1.0.0",
"description": "",
"main": "llamabot.js",
"type": "module",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"discord.js": "^14.9.0",
"dotenv": "^16.0.3",
"node-fetch": "^3.3.1"
}
}

11
server/Dockerfile Normal file
View File

@ -0,0 +1,11 @@
FROM python:bullseye
RUN apt-get update; \
apt-get install -y --no-install-recommends \
build-essential
WORKDIR /usr/src/app
RUN pip install --no-cache-dir llama-cpp-python[server]
CMD python3 -m llama_cpp.server